From 29447bf5ec02d4e2a6bc917d84a1f2010b9f4da1 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 18 Nov 2024 09:55:02 +0000 Subject: [PATCH] frontend: split interactive and non-interactive modes into separate commands --- frontend/cmd/exec.c | 41 +++++++++++++++++++++++++++++ frontend/cmd/repl.c | 63 +++++++++++++++++++++++++++++++++++++++++++++ frontend/main.c | 32 ----------------------- 3 files changed, 104 insertions(+), 32 deletions(-) diff --git a/frontend/cmd/exec.c b/frontend/cmd/exec.c index e69de29..5718ed8 100644 --- a/frontend/cmd/exec.c +++ b/frontend/cmd/exec.c @@ -0,0 +1,41 @@ +#include "cmd.h" + +#include + +enum { + ARG_FILE +}; + +static int exec(const b_command *cmd, const b_arglist *args, const b_array *_) +{ + return 0; +} + +B_COMMAND(CMD_ROOT, B_COMMAND_INVALID_ID) +{ + B_COMMAND_NAME("ivy"); + B_COMMAND_DESC("evaluate an Ivy source file or Ivy object file."); + B_COMMAND_HELP_OPTION(); + B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); + B_COMMAND_FUNCTION(exec); + + B_COMMAND_ARG(ARG_FILE) + { + B_ARG_NAME("file"); + B_ARG_DESC("The file to execute."); + B_ARG_NR_VALUES(1); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_OPT_PLACEHOLDER(); + B_COMMAND_USAGE_ARG(ARG_FILE); + } + + B_COMMAND_USAGE() + { + B_COMMAND_USAGE_COMMAND_PLACEHOLDER(); + B_COMMAND_USAGE_OPT_PLACEHOLDER(); + B_COMMAND_USAGE_ARG_PLACEHOLDER(); + } +} diff --git a/frontend/cmd/repl.c b/frontend/cmd/repl.c index 2bb459b..c5e8a05 100644 --- a/frontend/cmd/repl.c +++ b/frontend/cmd/repl.c @@ -1,3 +1,66 @@ +#include "../debug.h" +#include "../line-ed/line-ed.h" #include "cmd.h" #include +#include +#include +#include + +int repl(const b_command *cmd, const b_arglist *args, const b_array *_) +{ + char buf[1024]; + struct line_ed *ed = line_ed_create(); + struct ivy_lexer *lex; + enum ivy_status status = ivy_lexer_create(&lex); + + if (status != IVY_OK) { + line_ed_destroy(ed); + return -1; + } + + ivy_lexer_set_source(lex, &ed->l_line_source); + + while (true) { + struct ivy_token *tok = ivy_lexer_read(lex); + status = ivy_lexer_get_status(lex); + if (status == IVY_ERR_EOF) { + break; + } + + if (status != IVY_OK) { + b_err("lex error (%s)", + ivy_status_to_string(ivy_lexer_get_status(lex))); + break; + } + + print_lex_token(tok); +#if 0 + long v = line_ed_readline(ed, buf, sizeof buf); + if (v == -1) { + break; + } + + if (v == 0) { + continue; + } + + buf[strcspn(buf, "\n")] = 0; + + printf("input: '%s'\n", buf); +#endif + } + + ivy_lexer_destroy(lex); + line_ed_destroy(ed); + return 0; +} + +B_COMMAND(CMD_REPL, CMD_ROOT) +{ + B_COMMAND_NAME("shell"); + B_COMMAND_SHORT_NAME('S'); + B_COMMAND_DESC("start an interactive Ivy shell."); + B_COMMAND_HELP_OPTION(); + B_COMMAND_FUNCTION(repl); +} diff --git a/frontend/main.c b/frontend/main.c index 934aad8..f0bbbb7 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -2,38 +2,6 @@ #include -enum { - ARG_FILE -}; - -B_COMMAND(CMD_ROOT, B_COMMAND_INVALID_ID) -{ - B_COMMAND_NAME("ivy"); - B_COMMAND_DESC("evaluate an Ivy source file or Ivy object file."); - B_COMMAND_HELP_OPTION(); - B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); - - B_COMMAND_ARG(ARG_FILE) - { - B_ARG_NAME("file"); - B_ARG_DESC("The file to execute."); - B_ARG_NR_VALUES(1); - } - - B_COMMAND_USAGE() - { - B_COMMAND_USAGE_OPT_PLACEHOLDER(); - B_COMMAND_USAGE_ARG(ARG_FILE); - } - - B_COMMAND_USAGE() - { - B_COMMAND_USAGE_COMMAND_PLACEHOLDER(); - B_COMMAND_USAGE_OPT_PLACEHOLDER(); - B_COMMAND_USAGE_ARG_PLACEHOLDER(); - } -} - int main(int argc, const char **argv) { return b_command_dispatch(CMD_ROOT, argc, argv);