From 25380d9b6846574b1bad03708226f7bf346b8391 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Sat, 29 Nov 2025 04:12:07 -0500 Subject: alf: Sanity-check generated Atari filenames. --- src/sanity.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/sanity.c (limited to 'src/sanity.c') 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 +#include + +#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); +} + + -- cgit v1.2.3