diff options
| -rw-r--r-- | cxrefbas.1 | 14 | ||||
| -rw-r--r-- | cxrefbas.c | 15 | ||||
| -rw-r--r-- | cxrefbas.rst | 14 | ||||
| -rw-r--r-- | linetab.c | 21 | 
4 files changed, 49 insertions, 15 deletions
| @@ -37,8 +37,14 @@ cxrefbas [\fB\-v\fP] \fBinput\-file\fP  .sp  \fBcxrefbas\fP reads an Atari 8\-bit BASIC tokenized program. For each  line number in the program, it prints a list of lines that reference -it. Each line number reference is followed by a letter that indicates -the type of reference: +it. +.sp +\fBinput\-file\fP must be a tokenized (SAVEd) Atari BASIC program. Use +\fI\-\fP to read from standard input, but \fBcxrefbas\fP will refuse to read +from standard input if it\(aqs a terminal. +.sp +Each line number reference in the output is followed by a letter that +indicates the type of reference:  .INDENT 0.0  .TP  .B \fBG\fP @@ -58,6 +64,10 @@ the type of reference:  .TP  .B \fBT\fP  \fITRAP\fP\&. +.TP +.B \fBL\fP +\fILIST\fP\&. It\(aqs very rare for a program to \fILIST\fP parts of itself, but +it\(aqs allowed by BASIC so it\(aqs supported here.  .UNINDENT  .sp  If a line doesn\(aqt exist, but is referenced (e.g. \fIGOTO 100\fP, but there @@ -19,14 +19,15 @@ void print_ref_table(void) {  			for(j = 0; j < refcounts[i]; j++) {  				printf("%d:", linerefs[i][j].lineno);  				switch(linerefs[i][j].cmd) { -					case CMD_GOTO: c = 'G'; break; -					case CMD_GO_TO: c = 'G'; break; -					case CMD_GOSUB: c = 'S'; break; +					case CMD_GOTO:    c = 'G'; break; +					case CMD_GO_TO:   c = 'G'; break; +					case CMD_GOSUB:   c = 'S'; break;  					case CMD_RESTORE: c = 'R'; break; -					case CMD_TRAP: c = 'T'; break; -					case CMD_IF: c = 'I'; break; -					case CMD_ON: c = 'O'; break; -					default: c = '?'; break; +					case CMD_TRAP:    c = 'T'; break; +					case CMD_IF:      c = 'I'; break; +					case CMD_ON:      c = 'O'; break; +					case CMD_LIST:    c = 'L'; break; +					default:          c = '?'; break;  				}  				putchar(c);  				putchar(' '); diff --git a/cxrefbas.rst b/cxrefbas.rst index 3966e9c..d80d818 100644 --- a/cxrefbas.rst +++ b/cxrefbas.rst @@ -18,8 +18,14 @@ DESCRIPTION  **cxrefbas** reads an Atari 8-bit BASIC tokenized program. For each  line number in the program, it prints a list of lines that reference -it. Each line number reference is followed by a letter that indicates -the type of reference: +it. + +**input-file** must be a tokenized (SAVEd) Atari BASIC program. Use +*-* to read from standard input, but **cxrefbas** will refuse to read +from standard input if it's a terminal. + +Each line number reference in the output is followed by a letter that +indicates the type of reference:  **G**    *GOTO* (without *ON*) or *GO TO*. @@ -39,6 +45,10 @@ the type of reference:  **T**    *TRAP*. +**L** +  *LIST*. It's very rare for a program to *LIST* parts of itself, but +  it's allowed by BASIC so it's supported here. +  If a line doesn't exist, but is referenced (e.g. *GOTO 100*, but there  is no line 100), it's printed in the table, prefixed with *!*. @@ -75,16 +75,15 @@ void computed_msg(unsigned short lineno) {  			cmd = "RESTORE"; break;  		case CMD_TRAP:  			cmd = "TRAP"; break; -			/* -		case CMD_IF: -			cmd = "IF/THEN"; break; -			*/  		case CMD_ON:  			if(on_op == OP_GOSUB)  				cmd = "ON/GOSUB";  			else  				cmd = "ON/GOTO";  			break; +		case CMD_LIST: +			cmd = "LIST"; +			break;  		default: /* should never happen! */  			cmd = "???"; break;  	} @@ -99,6 +98,7 @@ CALLBACK(got_var) {  		case CMD_GOSUB:  		case CMD_RESTORE:  		case CMD_TRAP: +		case CMD_LIST:  			computed_msg(lineno);  			break;  		default: @@ -150,6 +150,19 @@ CALLBACK(got_exp) {  				}  			}  			break; +		case CMD_LIST: { +				switch(last_tok) { +					case CMD_LIST: +					case OP_COMMA: +						if(standalone) +							add_lineref(lineno, pos + 1); +						else +							computed_msg(lineno); +						break; +					default: +						break; +				} +			}  		default:  			break;  	} | 
