diff options
| -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 */  } | 
