diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-08 22:45:00 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-08 22:45:00 +0000 |
commit | 1ef3119fe613823a2145126c58948361ca7d3cd8 (patch) | |
tree | 5252d957ae512e1a727c9dec2b31e7b2a1d63e56 /main.c | |
parent | 214cdacca02552649d63f9045fdb8a17cfbb6fca (diff) |
Add initial code, just to get started
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -0,0 +1,62 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +#include "apl9.h" + +Rune *prompt(Rune *); +Datum *evalline(Rune *); + +Biobuf *stdin; + +void +main(void) +{ + int off = 0; + stdin = Bfdopen(0, OREAD); + + while(!off){ + Rune *input = prompt(L"\t"); + Datum *result = evalline(input); + if(result == nil){ + if(errormsg == nil) + off = 1; + else + print("ERROR: %S\n", errormsg); + }else{ + ppdatum(*result); + free(result); + } + } + exits(nil); +} + +Rune * +prompt(Rune *pr) +{ + Rune line[MAX_LINE_LENGTH]; + + print("%S",pr); + + int i = 0; + line[0] = 0; + while(i == 0 || line[i-1] != '\n') + line[i++] = Bgetrune(stdin); + line[i-1] = 0; + return runestrdup(line); +} + +Datum * +evalline(Rune *line) +{ + int ntoks; + Datum *tokens = lexline(line, &ntoks); + print("Evaluating line (n=%d): %S\n", ntoks, ppdatums(tokens, ntoks)); + Datum *result = eval(tokens, &ntoks); + if(ntoks == 1) + return result; + else{ + free(tokens); + return nil; + } +}
\ No newline at end of file |