diff options
| -rw-r--r-- | listamsb.c | 22 | 
1 files changed, 19 insertions, 3 deletions
| @@ -18,6 +18,10 @@  #define MIN_EXT_TOK 0xa3 /* SGN */  #define MAX_EXT_TOK 0xc5 /* STACK */ +/* AMSB's tokens for "!" and "'", used to introduce comments */ +#define TOK_SQUOTE 0x9a +#define TOK_BANG   0x9b +  /* good old Atari EOL character */  #define EOL 0x9b @@ -29,6 +33,12 @@     even with cart-based AMSB2 and no DOS loaded. */  #define MAX_PROGLEN 30000 +/* there should never be a valid line of BASIC longer than this many +   bytes, since there would be no way to enter it in the editor. AMSB +   uses the standard E: device, which limits you to 4 screen lines, or +   max 120 bytes. */ +#define MAX_LINE_LEN 0x80 +  /* a program whose header has a length less than MIN_PROGLEN can't be     a real AMSB program. EMPTY_PROGLEN is what you get if you     SAVE when there's no program in memory (right after boot or @@ -220,7 +230,7 @@ int next_line(void) {  		} else if(byte == ':') {  			/* don't print the colon if the next token is a ! or ' for a comment */  			unsigned char next = read_byte(); -			if( !(next == 0x9a || next == 0x9b) ) +			if( !(next == TOK_SQUOTE || next == TOK_BANG) )  				if(printing) putc(byte, outfile);  			ungetc(next, infile);  			bytes_read--; @@ -230,7 +240,7 @@ int next_line(void) {  			if(printing) putc(byte, outfile);  		} else if(was_ff) {  			if(byte >= MIN_EXT_TOK && byte <= MAX_EXT_TOK) { -				if(printing) fprintf(outfile, "%s", ext_tokens[byte - MIN_EXT_TOK]); +				if(printing) fputs(ext_tokens[byte - MIN_EXT_TOK], outfile);  			} else {  				if(printing) unknown_token(lineno, byte, 1);  				warnings++; @@ -239,7 +249,7 @@ int next_line(void) {  		} else if(byte == 0xff) {  			was_ff = 1;  		} else if(byte >= MIN_STD_TOK && byte <= MAX_STD_TOK) { -			if(printing) fprintf(outfile, "%s", std_tokens[byte - MIN_STD_TOK]); +			if(printing) fputs(std_tokens[byte - MIN_STD_TOK], outfile);  		} else if(byte >= 0x80) {  			if(printing) unknown_token(lineno, byte, 0);  			warnings++; @@ -262,6 +272,12 @@ int next_line(void) {  		fprintf(stderr, "      line %d length: %d\n", lineno, len);  	} +	if(len > MAX_LINE_LEN) { +		fprintf(stderr, "%s: line %d is suspiciously long (length %d > %d)\n", +			self, lineno, len, MAX_LINE_LEN); +		warnings++; +	} +  	if(last_ptr != -1) {  		int plen = ptr - last_ptr;  		if(len != plen) { | 
