#include #include #include #include "apl9.h" Rune *prompt(Rune *); Datum *evalline(Rune *); Biobuf *stdin; void main(int argc, char *argv[]) { int off = 0; stdin = Bfdopen(0, OREAD); globalsymtab = newsymtab(); currentsymtab = globalsymtab; traceeval = 0; ARGBEGIN{ case 't': traceeval = 1; break; }ARGEND 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{ if(result[0].shy == 0) print("%S\n", 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) { Statement *stmts = lexline(line, globalsymtab); Datum *result = eval(stmts); if(result) return result; else{ Statement *s = stmts; while(s != nil){ Statement *tmp = s; s = s->next; free(tmp->toks); free(tmp); } return nil; } }