#include #include #include #include #include #include #include "bas.h" int target_var, lastline, assign, is_for, is_next, is_dim, is_read, is_input; int in_dim, in_read, in_input; int refcounts[128]; void print_help(void) { fprintf(stderr, "Usage: %s program.bas\n", self); exit(0); } CALLBACK(new_line) { assign = is_for = is_next = is_dim = is_read = is_input = 0; } CALLBACK(end_line) { if(lastline != lineno) return; printf("%d", lineno); if(assign || is_for || is_next || is_dim || is_read || is_input) { putchar('='); if(assign) putchar('A'); if(is_for) putchar('F'); if(is_next) putchar('N'); if(is_dim) putchar('D'); if(is_read) putchar('R'); if(is_input) putchar('I'); } putchar(' '); } CALLBACK(new_command) { switch(tok) { case CMD_LET: case CMD_ILET: assign = 1; break; case CMD_FOR: is_for = 1; break; case CMD_NEXT: is_next = 1; break; case CMD_DIM: in_dim = 1; break; case CMD_READ: in_read= 1; break; case CMD_INPUT: in_input= 1; break; default: break; } } CALLBACK(end_stmt) { in_dim = in_read = in_input = 0; } CALLBACK(handle_var) { if(in_dim) is_dim = 1; if(in_input) is_input = 1; if(in_read) is_read = 1; if(lastline == lineno) return; if((tok & 0x7f) == target_var) { refcounts[target_var]++; lastline = lineno; } } int main(int argc, char **argv) { unsigned short pos; unsigned short vnpos; int unref = 0; set_self(*argv); parse_general_args(argc, argv, print_help); open_input(argv[1]); readfile(); parse_header(); on_var_token = handle_var; on_start_line = new_line; on_end_line = end_line; on_cmd_token = new_command; on_end_stmt = end_stmt; target_var = 0; vnpos = vnstart; for(pos = vvstart; pos < codestart; pos += 8) { /* print the variable name */ while(program[vnpos] < 0x80) putchar(program[vnpos++]); putchar(program[vnpos++] & 0x7f); printf("/%02x: ", target_var | 0x80); lastline = -1; walk_all_code(); if(!refcounts[target_var]) { unref++; printf("(no references)"); } else { printf("(%d)", refcounts[target_var]); } putchar('\n'); if(target_var++ == 128) break; } printf(" %d variables, %d unreferenced.\n", target_var, unref); return 0; }