aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--listamsb.c98
1 files changed, 53 insertions, 45 deletions
diff --git a/listamsb.c b/listamsb.c
index bc39e1e..149d8f4 100644
--- a/listamsb.c
+++ b/listamsb.c
@@ -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 */
}