aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/main.c
blob: 861c206ce00c819ba84ff2e12fe9859af126151c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>

#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;
}