From 1d0ee825c8b70e9456bebc4bf2bc8366c2e89cbd Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 11 Oct 2021 12:16:28 +0200 Subject: Add a minimal read_line implementation --- src/bootstrap/main.c | 13 ++++++++++--- src/bootstrap/read_line.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/bootstrap/read_line.c diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c index b5fd821..662831e 100755 --- a/src/bootstrap/main.c +++ b/src/bootstrap/main.c @@ -4,6 +4,7 @@ #include #include "string_view.c" +#include "read_line.c" void process_source(const StringView *source) { @@ -14,11 +15,17 @@ process_source(const StringView *source) { void run_repl(void) { - printf("BDL REPL (Press Ctrl-C to exit)\n"); + printf("BDL REPL (Press Ctrl-D or Ctrl-C to exit)\n"); while (true) { printf(REPL_PROMPT); - getchar(); - process_source(NULL); + StringView sv = read_line(); + if (sv.start == NULL) { + return; + } + process_source(&sv); + if (sv.n != 0) { + printf("\n"); + } } } diff --git a/src/bootstrap/read_line.c b/src/bootstrap/read_line.c new file mode 100644 index 0000000..7612d05 --- /dev/null +++ b/src/bootstrap/read_line.c @@ -0,0 +1,32 @@ +#define RL_BUF_SIZE 1024 +static char readline_buf[RL_BUF_SIZE]; + +StringView +read_line(void) { + // Clear buffer. + for (size_t i = 0; i < RL_BUF_SIZE; i++) { + readline_buf[i] = 0; + } + + // Barebones readline implementation. + size_t n = 0; + char c; + while ((c = getchar()) != '\n') { + if (c == '\b') { + readline_buf[n] = '\0'; + n--; + } else if (c == EOF || c == '\0') { + return (StringView){ .start = NULL, .n = 0 }; + } else if ((c >= ' ' && c <= '~') && n < RL_BUF_SIZE) { + readline_buf[n] = c; + n++; + } + } + + StringView sv = (StringView){ + .start = (char *)&readline_buf, + .n = n, + }; + return sv; +} + -- cgit v1.2.1