diff options
author | B. Watson <urchlay@slackware.uk> | 2025-02-27 03:10:34 -0500 |
---|---|---|
committer | B. Watson <urchlay@slackware.uk> | 2025-02-27 03:10:34 -0500 |
commit | a1e40a899b4d1c7b0264f004e2ebcda0c0db8944 (patch) | |
tree | 50ebe62985c79bf7dca255991c466dc8582669e5 /listamsb.c | |
parent | 2d8f4313357830d1478bd7250c46b7c2bc8b4cda (diff) | |
download | bw-atari8-tools-a1e40a899b4d1c7b0264f004e2ebcda0c0db8944.tar.gz |
listamsb: don't just exit on unexpected EOF; close the pipe, print the summary.
Diffstat (limited to 'listamsb.c')
-rw-r--r-- | listamsb.c | 98 |
1 files changed, 53 insertions, 45 deletions
@@ -75,9 +75,10 @@ int unlock_mode = 0; /* -l */ int locked = 0; int need_pclose = 0; -int bytes_read = 0; -int warnings = 0; -int proglen = 0; +int bytes_read = 0; +int warnings = 0; +int proglen = 0; +int linecount = 0; FILE *infile; FILE *outfile; @@ -98,13 +99,58 @@ void die_with(const char *msg, int status) { #define die(x) die_with(x,1) #define die2(x) die_with(x,2) +void finish(int rv, const char *msg) { + if(msg) fprintf(stderr, "%s: %s\n", self, msg); + + if(verbose) { + fprintf(stderr, "read %d bytes\n", bytes_read); + fprintf(stderr, "listed %d lines\n", linecount); + } + + if(!linecount) { + fprintf(stderr, "%s: no lines of code in program\n", self); + warnings++; + } + + if(proglen == (bytes_read - 3)) { + if(verbose) + fprintf(stderr, "file size matches proglen\n"); + } else { + fprintf(stderr, "%s: actual program size doesn't match program size in header\n", self); + warnings++; + } + + if(fgetc(infile) != EOF) { + fprintf(stderr, "%s: trailing garbage at end of file\n", self); + warnings++; + } + + if(warnings) { + fprintf(stderr, "%s: file has %d warnings\n", self, warnings); + rv = 2; + } + + if(need_pclose) { + int got = pclose(outfile); + if(verbose) + fprintf(stderr, "return value from pipe is %d\n", got); + if(got != 0) { + die("a8cat child process failed, do you have a8cat on your PATH?"); + } + } + + if(verbose) + fprintf(stderr, "exit status: %d (%s)\n", rv, (rv ? "ERROR" : "OK")); + + exit(rv); +} + unsigned char read_byte(void) { int c; c = fgetc(infile); - if(c < 0) - die2("unexpected EOF, file truncated?"); + if(c < 0) finish(2, "unexpected EOF, file truncated?"); bytes_read++; return (unsigned char)c; @@ -503,8 +549,6 @@ void open_output() { } int main(int argc, char **argv) { - int rv = 0, linecount = 0; - set_self(argv[0]); parse_args(argc, argv); @@ -521,42 +565,6 @@ int main(int argc, char **argv) { while(next_line()) linecount++; - if(verbose) { - fprintf(stderr, "read %d bytes\n", bytes_read); - fprintf(stderr, "listed %d lines\n", linecount); - } - - if(!linecount) { - fprintf(stderr, "%s: no lines of code in program\n", self); - warnings++; - } - - if(proglen == (bytes_read - 3)) { - if(verbose) - fprintf(stderr, "file size matches proglen\n"); - } else { - fprintf(stderr, "%s: actual program size doesn't match program size in header\n", self); - warnings++; - } - - if(fgetc(infile) != EOF) { - fprintf(stderr, "%s: trailing garbage at end of file\n", self); - warnings++; - } - - if(warnings) { - fprintf(stderr, "%s: file has %d warnings\n", self, warnings); - rv = 2; - } - - if(need_pclose) { - int got = pclose(outfile); - if(verbose) - fprintf(stderr, "return value from pipe is %d\n", got); - if(got != 0) { - die("a8cat child process failed, do you have a8cat on your PATH?"); - } - } - - exit(rv); + finish(0, NULL); + return 0; /* never executes; shuts up gcc warning */ } |