aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/readline.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/readline.c')
-rw-r--r--src/bootstrap/readline.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/bootstrap/readline.c b/src/bootstrap/readline.c
new file mode 100644
index 0000000..dfd8285
--- /dev/null
+++ b/src/bootstrap/readline.c
@@ -0,0 +1,28 @@
1#define READLINE_VALID_CHAR(C) (((u8)(C) >= 0x20 && (u8)(C) < 0x7F) || (C) == '\n')
2
3StringView
4read_line(FILE *fd, char delimiter) {
5 #define RL_BUF_SIZE 1024
6 static char readline_buf[RL_BUF_SIZE];
7
8 // Clear buffer.
9 for (size_t i = 0; i < RL_BUF_SIZE; i++) {
10 readline_buf[i] = 0;
11 }
12
13 // Barebones readline implementation.
14 size_t n = 0;
15 char c;
16 while ((c = getc(fd)) != delimiter) {
17 if (c == '\b') {
18 readline_buf[n] = '\0';
19 n--;
20 } else if (READLINE_VALID_CHAR(c) && n < RL_BUF_SIZE) {
21 readline_buf[n] = c;
22 n++;
23 }
24 }
25
26 return (StringView){.start = (char *)&readline_buf, .n = n};
27}
28