#include #include #include #include #include "apl9.h" Biobuf *stdin; void main(int argc, char *argv[]) { int off = 0; stdin = Bfdopen(0, OREAD); initsymtab(); initquadnames(); traceeval = 0; debugmem = 0; ARGBEGIN{ case 't': traceeval = 1; break; case 'm': debugmem = 1; mainmem->flags |= POOL_NOREUSE; break; }ARGEND int errorcode; restart: SETUPERROR(errorcode); if(errorcode){ /* remove aborted dfn frames */ while(getcurrentdfn()) popdfnframe(); if(globalerror.msg) print("%S: %S\n", errorstrs[errorcode], globalerror.msg); else print("%S\n", errorstrs[errorcode]); goto restart; } while(!off){ checkmem("main loop"); print("\t"); Datum *result = evalline(nil, stdin, 1); if(result == nil) continue; else{ if(result[0].shy == 0) print("%S\n", ppdatum(*result)); if(result->tag == ArrayTag) freearray(result->array); free(result); } /* print("Unfreed arrays: %d\n", alloccounts); */ } 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, Biobuf *bio, int toplevel) { Statement *stmts; if(line) stmts = lexlinestr(line, toplevel); else if(bio) stmts = lexlinebio(bio, toplevel); else stmts = lexlinebio(stdin, toplevel); Datum *result = eval(stmts, toplevel); if(result) return result; else{ Statement *s = stmts; while(s != nil){ Statement *tmp = s; s = s->next; free(tmp->toks); free(tmp); } return nil; } }