From b478d55399c493752bc86fe0c59d6070a1b506dc Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Sun, 7 Jul 2024 00:36:32 -0400 Subject: whichbas: stop after first match, add -k to restore original behaviour. --- whichbas.c | 33 +++++++++++++++++++++------------ whichbas.rst | 19 ++++++++++++++----- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/whichbas.c b/whichbas.c index c407c33..dabf414 100644 --- a/whichbas.c +++ b/whichbas.c @@ -20,16 +20,19 @@ int comma_count; /* count of regular commas (not string/array) in statement */ unsigned char last_cmd; unsigned short last_cmd_pos; +int keep_going = 0; /* -k flag */ + void print_help(void) { - printf("Usage: %s [-v] \n", self); + printf("Usage: %s [-v] [-k] \n", self); } void parse_args(int argc, char **argv) { int opt; - while( (opt = getopt(argc, argv, "v")) != -1) { + while( (opt = getopt(argc, argv, "vk")) != -1) { switch(opt) { case 'v': verbose = 1; break; + case 'k': keep_going = verbose = 1; break; default: print_help(); exit(1); @@ -50,10 +53,6 @@ void add_type(int type) { } */ -void remove_type(int type) { - bas_type &= ((~type) & 0x0f); -} - void print_result(void) { const char *name; @@ -75,6 +74,16 @@ void print_result(void) { exit(bas_type == BT_ATARI ? 0 : bas_type + 8); } +void remove_type(int type) { + bas_type &= ((~type) & 0x0f); + + if(keep_going) return; + + /* without -k, stop if it gets narrowed down to one of these two. */ + if(bas_type == BT_TURBO || bas_type == BT_BXE) + print_result(); +} + CALLBACK(handle_cmd) { int has_args = 0; unsigned char nexttok; @@ -83,7 +92,7 @@ CALLBACK(handle_cmd) { last_cmd_pos = pos; comma_count = 0; - if(verbose) fprintf(stderr, "handle_cmd: lineno %d, tok $%02x, bas_type was %02x...", lineno, tok, bas_type); + if(verbose) fprintf(stderr, "handle_cmd: lineno %d, tok $%02x, bas_type was %02x\n", lineno, tok, bas_type); if(tok <= CMD_ERROR) return; /* legal in BASIC, ignore */ remove_type(BT_ATARI); @@ -204,7 +213,7 @@ CALLBACK(handle_cmd) { } default: break; } - if(verbose) fprintf(stderr, " now %02x\n", bas_type); + if(verbose) fprintf(stderr, " bas_type now %02x\n", bas_type); } CALLBACK(handle_op) { @@ -213,11 +222,11 @@ CALLBACK(handle_op) { if(tok == OP_COMMA) comma_count++; - if(verbose) fprintf(stderr, "handle_op: lineno %d, tok $%02x, comma_count %d, bas_type was %02x...", lineno, tok, comma_count, bas_type); + if(verbose) fprintf(stderr, "handle_op: lineno %d, tok $%02x, comma_count %d, bas_type was %02x\n", lineno, tok, comma_count, bas_type); if(tok == 0x0d) remove_type(BT_ATARI); /* hex const (turbo *and* bxl/xe) */ if(tok <= OP_FUNC_STRIG) { - if(verbose) fprintf(stderr, " now %02x\n", bas_type); + if(verbose) fprintf(stderr, " bas_type now %02x\n", bas_type); return; /* legal in BASIC, ignore */ } remove_type(BT_ATARI); @@ -276,11 +285,11 @@ CALLBACK(handle_op) { remove_type(BT_TURBO); } } - if(verbose) fprintf(stderr, " now %02x\n", bas_type); + if(verbose) fprintf(stderr, " bas_type now %02x\n", bas_type); } CALLBACK(handle_end_stmt) { - if(verbose) fprintf(stderr, "handle_end_stmt: lineno %d, tok $%02x, last_cmd $%02x, comma_count %d, bas_type was %02x...", lineno, tok, last_cmd, comma_count, bas_type); + if(verbose) fprintf(stderr, "handle_end_stmt: lineno %d, tok $%02x, last_cmd $%02x, comma_count %d, bas_type was %02x\n", lineno, tok, last_cmd, comma_count, bas_type); switch(last_cmd) { case 0x38: /* DPOKE (2 args) or WHILE (1 arg) */ if(comma_count) { diff --git a/whichbas.rst b/whichbas.rst index 5e7363c..3eb8854 100644 --- a/whichbas.rst +++ b/whichbas.rst @@ -18,6 +18,20 @@ DESCRIPTION BASIC XL, BASIC XE, or Atari Microsoft BASIC program and attempts to discover which BASIC is required to run it. +OPTIONS +======= + +Detection Options +----------------- + +**-k** + Keep going. The default is to stop looking at the program if the + BASIC type gets narrowed down to either Turbo BASIC XL or BASIC XE. + This option also enables **-v** (verbose). It's really only useful + for testing, if you're hacking on **whichbas** itself. + +.. include:: genopts.rst + NOTES ===== Turbo BASIC, BASIC XL, and BASIC XE are all supersets of Atari BASIC. @@ -62,11 +76,6 @@ Turbo and BXL/BXE support extended variable types. **whichbas** knows nothing about other BASICs such as Frost BASIC, BASIC/A+, Altirra BASIC... -OPTIONS -======= - -.. include:: genopts.rst - EXIT STATUS =========== -- cgit v1.2.3