From 96d27c2a3e1a0fa0878beb3f9cd02f4b4ed8fdbb Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 8 Oct 2021 10:25:59 +0200 Subject: Initial commit w/ small readline echo function --- src/bootstrap/main.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 src/bootstrap/main.c (limited to 'src/bootstrap/main.c') diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c new file mode 100755 index 0000000..861c206 --- /dev/null +++ b/src/bootstrap/main.c @@ -0,0 +1,61 @@ +#include + +#include "shorthand.h" + +typedef struct StringView { + char *start; + size_t n; +} StringView; + +void +sv_write(StringView sv) { + for (size_t i = 0; i < sv.n; i++) { + putchar(sv.start[i]); + } +} + +StringView +read_line(void) { + #define RL_BUF_SIZE 1024 + static char readline_buf[RL_BUF_SIZE]; + + // 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 (((u8)c >= 0x20 && (u8)c <= 0x7F) && n < RL_BUF_SIZE) { + readline_buf[n] = c; + n++; + } + } + + return (StringView){.start = (char *)&readline_buf, .n = n}; +} + +void +display(StringView sv) { + if (sv.n != 0) { + sv_write(sv); + printf("\n"); + } +} + +#define REPL_PROMPT "bdl> " + +int +main(void) { + printf("BDL REPL (Press Ctrl-C to exit)\n"); + while (true) { + printf(REPL_PROMPT); + display(read_line()); + } + return 0; +} -- cgit v1.2.1