diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-11 12:16:28 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-11 12:16:28 +0200 |
commit | 1d0ee825c8b70e9456bebc4bf2bc8366c2e89cbd (patch) | |
tree | 8f7d6c4faaba6f6003f4e43a6d316092cc118342 /src/bootstrap/read_line.c | |
parent | 14c4d1583236480b9fa7f902e0eb24979549d21d (diff) | |
download | bdl-1d0ee825c8b70e9456bebc4bf2bc8366c2e89cbd.tar.gz bdl-1d0ee825c8b70e9456bebc4bf2bc8366c2e89cbd.zip |
Add a minimal read_line implementationv0.1
Diffstat (limited to 'src/bootstrap/read_line.c')
-rw-r--r-- | src/bootstrap/read_line.c | 32 |
1 files changed, 32 insertions, 0 deletions
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 @@ | |||
1 | #define RL_BUF_SIZE 1024 | ||
2 | static char readline_buf[RL_BUF_SIZE]; | ||
3 | |||
4 | StringView | ||
5 | read_line(void) { | ||
6 | // Clear buffer. | ||
7 | for (size_t i = 0; i < RL_BUF_SIZE; i++) { | ||
8 | readline_buf[i] = 0; | ||
9 | } | ||
10 | |||
11 | // Barebones readline implementation. | ||
12 | size_t n = 0; | ||
13 | char c; | ||
14 | while ((c = getchar()) != '\n') { | ||
15 | if (c == '\b') { | ||
16 | readline_buf[n] = '\0'; | ||
17 | n--; | ||
18 | } else if (c == EOF || c == '\0') { | ||
19 | return (StringView){ .start = NULL, .n = 0 }; | ||
20 | } else if ((c >= ' ' && c <= '~') && n < RL_BUF_SIZE) { | ||
21 | readline_buf[n] = c; | ||
22 | n++; | ||
23 | } | ||
24 | } | ||
25 | |||
26 | StringView sv = (StringView){ | ||
27 | .start = (char *)&readline_buf, | ||
28 | .n = n, | ||
29 | }; | ||
30 | return sv; | ||
31 | } | ||
32 | |||