aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/main.c')
-rwxr-xr-xsrc/bootstrap/main.c61
1 files changed, 61 insertions, 0 deletions
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 @@
1#include <stdio.h>
2
3#include "shorthand.h"
4
5typedef struct StringView {
6 char *start;
7 size_t n;
8} StringView;
9
10void
11sv_write(StringView sv) {
12 for (size_t i = 0; i < sv.n; i++) {
13 putchar(sv.start[i]);
14 }
15}
16
17StringView
18read_line(void) {
19 #define RL_BUF_SIZE 1024
20 static char readline_buf[RL_BUF_SIZE];
21
22 // Clear buffer.
23 for (size_t i = 0; i < RL_BUF_SIZE; i++) {
24 readline_buf[i] = 0;
25 }
26
27 // Barebones readline implementation.
28 size_t n = 0;
29 char c;
30 while ((c = getchar()) != '\n') {
31 if (c == '\b') {
32 readline_buf[n] = '\0';
33 n--;
34 } else if (((u8)c >= 0x20 && (u8)c <= 0x7F) && n < RL_BUF_SIZE) {
35 readline_buf[n] = c;
36 n++;
37 }
38 }
39
40 return (StringView){.start = (char *)&readline_buf, .n = n};
41}
42
43void
44display(StringView sv) {
45 if (sv.n != 0) {
46 sv_write(sv);
47 printf("\n");
48 }
49}
50
51#define REPL_PROMPT "bdl> "
52
53int
54main(void) {
55 printf("BDL REPL (Press Ctrl-C to exit)\n");
56 while (true) {
57 printf(REPL_PROMPT);
58 display(read_line());
59 }
60 return 0;
61}