diff options
author | B. Watson <urchlay@slackware.uk> | 2024-06-15 17:06:56 -0400 |
---|---|---|
committer | B. Watson <urchlay@slackware.uk> | 2024-06-15 17:06:56 -0400 |
commit | decd8312b033235cb64db2fcd3ffa4829bd21af7 (patch) | |
tree | 7dda739f2c5281207a118c1bcc9986786cba49f9 /vxrefbas.c | |
parent | 5b4d161d5c82105f92006aa9cebbcd72b9383178 (diff) | |
download | bw-atari8-tools-decd8312b033235cb64db2fcd3ffa4829bd21af7.tar.gz |
vxrefbas: WIP.
Diffstat (limited to 'vxrefbas.c')
-rw-r--r-- | vxrefbas.c | 42 |
1 files changed, 28 insertions, 14 deletions
@@ -7,9 +7,9 @@ #include "bas.h" -int A, F, N, D, I, R, G; +int A, F, N, D, I, R, G, O, L; int target_var, lastline; -unsigned char last_cmd = 0, last_op = 0; +unsigned char last_cmd = 0; int refcounts[128]; void print_help(void) { @@ -18,13 +18,13 @@ void print_help(void) { } CALLBACK(new_line) { - A = F = N = D = I = R = G = 0; + A = F = N = D = I = R = G = O = L = 0; } CALLBACK(end_line) { if(lastline != lineno) return; - if(A || F || N || D || I || R || G) { + if(A || F || N || D || I || R || G || O || L) { putchar('='); if(A) putchar('A'); if(F) putchar('F'); @@ -33,6 +33,8 @@ CALLBACK(end_line) { if(I) putchar('I'); if(R) putchar('R'); if(G) putchar('G'); + if(O) putchar('O'); + if(L) putchar('L'); } putchar(' '); @@ -43,11 +45,12 @@ CALLBACK(new_command) { } CALLBACK(end_stmt) { - last_cmd = last_op = 0; + last_cmd = 0; } CALLBACK(handle_var) { - unsigned char last_tok; + unsigned char last_tok, next_tok; + int was_cmd, was_comma, was_semicolon; if(tok != (target_var | 0x80)) return; @@ -57,30 +60,41 @@ CALLBACK(handle_var) { } lastline = lineno; + last_tok = program[pos - 1]; + next_tok = program[pos + 1]; + was_cmd = (last_tok == last_cmd); + was_comma = (last_tok == OP_COMMA); + was_semicolon = (last_tok == OP_SEMICOLON); switch(last_cmd) { case CMD_LET: case CMD_ILET: - if(last_tok == last_cmd) A = 1; + if(was_cmd) A = 1; break; case CMD_FOR: - if(last_tok == last_cmd) F = 1; + if(was_cmd) F = 1; break; case CMD_NEXT: - if(last_tok == last_cmd) N = 1; + if(was_cmd) N = 1; break; case CMD_DIM: - if(last_tok == last_cmd || last_tok == OP_COMMA) D = 1; + if(was_cmd || was_comma) D = 1; break; - case CMD_INPUT: - if(last_tok == last_cmd || last_tok == OP_COMMA) I = 1; + case CMD_INPUT: /* INPUT #1;A and INPUT #1,A are both allowed, grr. */ + if(was_cmd || was_comma || was_semicolon) I = 1; break; case CMD_READ: - if(last_tok == last_cmd || last_tok == OP_COMMA) R = 1; + if(was_cmd || was_comma) R = 1; break; case CMD_GET: - if(last_tok == OP_COMMA) G = 1; + if(was_comma) G = 1; + break; + case CMD_NOTE: + if(was_comma) O = 1; + break; + case CMD_LOCATE: + if(next_tok == OP_EOS || next_tok == OP_EOL) L = 1; break; } } |