aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2025-02-25 07:11:31 -0500
committerB. Watson <urchlay@slackware.uk>2025-02-25 07:11:31 -0500
commit1c075d559e69958af1964ad389393f496571d322 (patch)
tree92c0e95878419377e3696925c8736c6c8f41d3a1
parent84a36b80e80085ce00b107a8f12f5ed0e0297b84 (diff)
downloadbw-atari8-tools-1c075d559e69958af1964ad389393f496571d322.tar.gz
listamsb: more warnings for bad files.
-rw-r--r--listamsb.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/listamsb.c b/listamsb.c
index 11c7efa..efa0621 100644
--- a/listamsb.c
+++ b/listamsb.c
@@ -23,6 +23,13 @@
even with cart-based AMSB2 and no DOS loaded. */
#define MAX_PROGLEN 30000
+/* a program whose header has a length less than this can't be
+ a real AMSB program. The minimum size is what you get if you
+ SAVE when there's no program in memory (right after boot or
+ a NEW). The minimum size for a program that actually contains
+ code seems to be 5 (for 10 PRINT) */
+#define MIN_PROGLEN 2
+
const char *self;
char pipe_command[BUFSIZ + 1] = { "a8cat" };
@@ -77,13 +84,23 @@ int read_header(void) {
int proglen;
b = read_byte();
- if(b) die("first byte not $00, not an AMSB file");
+ if(b) die("not an AMSB file: first byte not $00");
proglen = read_word();
+ if(verbose)
+ fprintf(stderr, "proglen == %d (%04x)\n", proglen, proglen);
+
if(proglen > MAX_PROGLEN) {
- fprintf(stderr, "%s: program too big (%d bytes), won't fit in Atari memory\n",
+ fprintf(stderr, "%s: not an AMSB file: too big (%d bytes), won't fit in Atari memory\n",
self, proglen);
+ exit(1);
+ }
+
+ if(proglen < MIN_PROGLEN) {
+ fprintf(stderr, "%s: not an AMSB file: program size in header too small (%d)\n",
+ self, proglen);
+ exit(1);
}
return proglen;
@@ -266,8 +283,6 @@ int main(int argc, char **argv) {
open_output();
proglen = read_header();
- if(verbose)
- fprintf(stderr, "proglen == %d (%04x)\n", proglen, proglen);
while( (lineno = next_line()) != -1 )
if(verbose)
@@ -280,7 +295,11 @@ int main(int argc, char **argv) {
if(verbose)
fprintf(stderr, "file size matches proglen\n");
} else {
- fprintf(stderr, "%s: trailing garbage at EOF\n", self);
+ fprintf(stderr, "%s: file size doesn't match length in header\n", self);
+ }
+
+ if(fgetc(infile) != EOF) {
+ fprintf(stderr, "%s: trailing garbage at end of file\n", self);
}
if(unknowns) {