From 2a2a3865926e4d6341aa4c323245d558debe8139 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Mon, 6 Apr 2026 21:26:24 -0500 Subject: [PATCH] Added InputBox --- apps/dvxbasic/compiler/lexer.c | 2 ++ apps/dvxbasic/compiler/lexer.h | 1 + apps/dvxbasic/compiler/parser.c | 48 +++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/apps/dvxbasic/compiler/lexer.c b/apps/dvxbasic/compiler/lexer.c index e83b75b..6b80f12 100644 --- a/apps/dvxbasic/compiler/lexer.c +++ b/apps/dvxbasic/compiler/lexer.c @@ -78,6 +78,8 @@ static const KeywordEntryT sKeywords[] = { { "LOOP", TOK_LOOP }, { "ME", TOK_ME }, { "MOD", TOK_MOD }, + { "INPUTBOX", TOK_INPUTBOX }, + { "INPUTBOX$", TOK_INPUTBOX }, { "MSGBOX", TOK_MSGBOX }, { "NEXT", TOK_NEXT }, { "NOT", TOK_NOT }, diff --git a/apps/dvxbasic/compiler/lexer.h b/apps/dvxbasic/compiler/lexer.h index 0acf3fd..158d662 100644 --- a/apps/dvxbasic/compiler/lexer.h +++ b/apps/dvxbasic/compiler/lexer.h @@ -108,6 +108,7 @@ typedef enum { TOK_LOOP, TOK_ME, TOK_MOD, + TOK_INPUTBOX, TOK_MSGBOX, TOK_NEXT, TOK_NOT, diff --git a/apps/dvxbasic/compiler/parser.c b/apps/dvxbasic/compiler/parser.c index c319cf9..e2205fb 100644 --- a/apps/dvxbasic/compiler/parser.c +++ b/apps/dvxbasic/compiler/parser.c @@ -1292,6 +1292,31 @@ static void parsePrimary(BasParserT *p) { return; } + // InputBox$(prompt [, title [, default]]) + if (tt == TOK_INPUTBOX) { + advance(p); + expect(p, TOK_LPAREN); + parseExpression(p); // prompt + + if (match(p, TOK_COMMA)) { + parseExpression(p); // title + } else { + basEmit8(&p->cg, OP_PUSH_STR); + basEmitU16(&p->cg, basAddConstant(&p->cg, "", 0)); + } + + if (match(p, TOK_COMMA)) { + parseExpression(p); // default + } else { + basEmit8(&p->cg, OP_PUSH_STR); + basEmitU16(&p->cg, basAddConstant(&p->cg, "", 0)); + } + + expect(p, TOK_RPAREN); + basEmit8(&p->cg, OP_INPUTBOX); + return; + } + // MsgBox(message [, flags]) -- as function expression returning button ID if (tt == TOK_MSGBOX) { advance(p); @@ -4900,6 +4925,29 @@ static void parseStatement(BasParserT *p) { } break; + case TOK_INPUTBOX: + // InputBox$ prompt [, title [, default]] (statement form, discard result) + advance(p); + parseExpression(p); // prompt + + if (match(p, TOK_COMMA)) { + parseExpression(p); // title + } else { + basEmit8(&p->cg, OP_PUSH_STR); + basEmitU16(&p->cg, basAddConstant(&p->cg, "", 0)); + } + + if (match(p, TOK_COMMA)) { + parseExpression(p); // default + } else { + basEmit8(&p->cg, OP_PUSH_STR); + basEmitU16(&p->cg, basAddConstant(&p->cg, "", 0)); + } + + basEmit8(&p->cg, OP_INPUTBOX); + basEmit8(&p->cg, OP_POP); // discard result + break; + case TOK_MSGBOX: // MsgBox message [, flags] (statement form, discard result) advance(p);