From 3860d330a370b2cb2cf1a1b26fa91907a9748245 Mon Sep 17 00:00:00 2001 From: Preston Pan Date: Thu, 4 Jan 2024 22:01:50 -0800 Subject: first commit --- main.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 main.c (limited to 'main.c') diff --git a/main.c b/main.c new file mode 100644 index 0000000..34bad00 --- /dev/null +++ b/main.c @@ -0,0 +1,62 @@ +#include "parser.h" +#include +#include +#include + +#define MAX 50 +#define JUSTDO(a) \ + if (!(a)) { \ + perror(#a); \ + exit(1); \ + } + +extern ht_t *WORD_TABLE; +extern array_t *STACK; +extern char *INBUF; +extern parser_t *PARSER; + +/** char *get_line FILE *f + * reads an arbitrarily long line of text or until EOF + * caller must free the pointer returned after use + */ +char *get_line(FILE *f) { + int len = MAX; + char buf[MAX], *e = NULL, *ret; + JUSTDO(ret = calloc(MAX, 1)); + while (fgets(buf, MAX, f)) { + if (len - strlen(ret) < MAX) + JUSTDO(ret = realloc(ret, len *= 2)); + strcat(ret, buf); + if ((e = strrchr(ret, '\n'))) + break; + } + if (e) + *e = '\0'; + return ret; +} + +int main(int argc, char **argv) { + PARSER = init_parser(""); + value_t *v; + STACK = init_array(10); + WORD_TABLE = init_ht(500); + + printf("exit to exit REPL;\n"); + while (1) { + printf("> "); + INBUF = get_line(stdin); + parser_reset(PARSER, INBUF); + while (1) { + v = parser_get_next(PARSER); + if (v == NULL) + break; + eval(v); + } + free(INBUF); + } + ht_free(WORD_TABLE); + array_free(STACK); + free(PARSER); + free(INBUF); + return 0; +} -- cgit