From ac4d176b18c9b7f4e5d9ec95406b0ca5092e131f Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Tue, 9 Jul 2024 16:55:27 -0400 Subject: whichbas: add and use set_type() (which respects keep_going). --- whichbas.c | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/whichbas.c b/whichbas.c index ef2c55b..ddea7a7 100644 --- a/whichbas.c +++ b/whichbas.c @@ -124,6 +124,11 @@ void remove_type(int type) { print_result(); } +void set_type(int type) { + bas_type = type; + if(!keep_going) print_result(); +} + CALLBACK(handle_cmd) { int has_args = 0, has_var_arg = 0, vartype = -1; unsigned char nexttok; @@ -151,8 +156,7 @@ CALLBACK(handle_cmd) { case CMD_CLOSE: case CMD_SOUND: if(!has_args) { - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); } break; case CMD_INPUT: @@ -183,8 +187,7 @@ CALLBACK(handle_cmd) { /* TB uses the same tokens for GET and PUT as Atari/BXL/BXE, but it allows the argument to be a variable without a # in front of it. */ if(nexttok != OP_HASH) { - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); } /* PARTIAL: we really should detect GET #1,A$. this is Turbo-only, but probably nobody ever uses it because it doesn't seem to *work*, @@ -194,8 +197,7 @@ CALLBACK(handle_cmd) { case CMD_TRAP: /* TB allows RESTORE #LABEL and TRAP #LABEL */ if(nexttok == OP_HASH) { - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); } break; default: break; @@ -207,8 +209,8 @@ CALLBACK(handle_cmd) { if(tok >= 0x65) { fprintf(stderr, "handle_cmd: invalid command %02x at line %d\n", tok, lineno); - bas_type = BT_INVALID; - print_result(); + keep_going = 0; + set_type(BT_INVALID); } /* we have tokens 0x3a to 0x68 in both TB and BXE, or 47 @@ -269,8 +271,7 @@ CALLBACK(handle_cmd) { */ /* So, if we see this token, it *has* to be Turbo's TRACE, whether or not it has an argument. */ - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); break; case 0x59: /* TEXT or PROCEDURE */ /* COMPLETE */ @@ -305,7 +306,7 @@ CALLBACK(handle_cmd) { } break; case 0x4a: /* UNLOCK (req'd arg) or DIR (optional arg) */ - /* PARTIAL: without args means TB, but with arg, + /* PARTIAL: without args means BXL/BXE, but with arg, it could be either */ if(!has_args) { remove_type(BT_TURBO); @@ -365,8 +366,7 @@ CALLBACK(handle_cmd) { it get LISTed as a line of 30 dashes. The explanation is a lot longer than the code... */ if(program[pos - 1] == 0x05 || nexttok == 0x9b) { - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); } else { remove_type(BT_TURBO); } @@ -428,8 +428,7 @@ CALLBACK(handle_op) { /* Turbo allows 256 variables, tokenizes the first 128 normally ($80-$FF). The extra ones above $FF are tokenized as $00, varnum - $80. None of our other BASICs uses $00 as an operator token, so.. */ - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); } /* attempt to detect BXL/BXE DIM for 2D string arrays. @@ -465,8 +464,8 @@ CALLBACK(handle_op) { if(tok >= 0x6E) { fprintf(stderr, "handle_op: invalid operator %02x at line %d\n", tok, lineno); - bas_type = BT_INVALID; - print_result(); + keep_going = 0; + set_type(BT_INVALID); } /* There are 25 extra operators in Turbo, and 20 of them are shared with @@ -555,8 +554,7 @@ CALLBACK(handle_op) { has2 = (get_vartype(nexttok2) == TYPE_SCALAR); } if(has2) { - bas_type = BT_BXE; - print_result(); + set_type(BT_BXE); } } break; @@ -574,8 +572,7 @@ CALLBACK(handle_op) { case 0x63: /* RND (pseudo-func, no arg) or ERR (func, 1 num arg) */ /* COMPLETE */ if(nexttok != OP_FUNC_LPAR) { - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); } case 0x66: /* %0 in TB, LEFT$( (pseudo-func, takes string) in BXL/BXE */ case 0x67: /* %1 in TB, RIGHT$( (pseudo-func, takes string) in BXL/BXE */ @@ -789,8 +786,7 @@ void check_variables(void) { with a type that's illegal in Atari/BXL/BXE. */ for(pos = vvstart; pos < codestart; pos += 8) { if((program[pos] & 0xc0) == 0xc0) { - bas_type = BT_TURBO; - print_result(); + set_type(BT_TURBO); } } -- cgit v1.2.3