diff options
| author | B. Watson <urchlay@slackware.uk> | 2025-11-29 04:12:07 -0500 |
|---|---|---|
| committer | B. Watson <urchlay@slackware.uk> | 2025-11-29 04:12:07 -0500 |
| commit | 25380d9b6846574b1bad03708226f7bf346b8391 (patch) | |
| tree | 6d5865c224c4a155f193e51ecd880572b6fefd7b /src/sanity.c | |
| parent | 8b4a168475a005d7fc4a298321688fccdb2f8ba3 (diff) | |
| download | alftools-25380d9b6846574b1bad03708226f7bf346b8391.tar.gz | |
alf: Sanity-check generated Atari filenames.
Diffstat (limited to 'src/sanity.c')
| -rw-r--r-- | src/sanity.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/sanity.c b/src/sanity.c new file mode 100644 index 0000000..ccbcae1 --- /dev/null +++ b/src/sanity.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <string.h> + +#ifndef u8 +#define u8 unsigned char +#endif + +extern const char *self; + +void bad_atari_filename(const char *fname, const char *msg) { + char fn[50] = ""; + char xbuf[5]; + int i; + u8 c; + + for(i = 0; (c = (u8)fname[i]) && i < 12; i++) { + if(c < ' ' || c > '|') { + /* not printable, insert a hex escape */ + sprintf(xbuf, "$%02X", c); + strcat(fn, xbuf); + } else { + strncat(fn, (char *)&c, 1); + } + } + + fprintf(stderr, "%s: warning: bad Atari filename \"%s\": %s\n", self, fn, msg); +} + +/* note to self: it's tempting to use isalpha(), isprint(), etc + from ctype.h... but those are locale-aware. we want ASCII-only + versions. */ +void sanity_check_filename(const char *fname) { + u8 c; + unsigned int i, bad = 0, dots = 0, uscore = 0; + + c = fname[0]; + if(!c) { + bad_atari_filename(fname, "empty!"); + return; + } else if(c < 'A' || c > 'Z') { + bad_atari_filename(fname, "does not begin with A-Z"); + } + + for(i = 0; (c = fname[i]) && i < 12; i++) { + if(c >= 'A' && c <= 'Z') + continue; + if(c >= '0' && c <= '9') + continue; + if(c == '_') { + uscore++; + continue; + } + if(c == '.') { + dots++; + continue; + } + bad++; + } + + if(!dots) { + bad_atari_filename(fname, "no \".\""); + } else if(dots > 1) { + bad_atari_filename(fname, "more than one \".\""); + } + + if(bad) + bad_atari_filename(fname, "invalid characters."); + else if(uscore) + fprintf(stderr, "%s: filename has underscore, OK on Sparta/MyDOS, not Atari DOS 2.x\n", self); +} + + |
