#include #include #include #include #include #include "apl9.h" Biobuf *stdin; void threadmain(int argc, char *argv[]) { int off = 0; stdin = Bfdopen(0, OREAD); initthreads(); initsymtab(); initquadnames(); traceeval = 0; debugmem = 0; ARGBEGIN{ case 't': traceeval = 1; break; case 'm': debugmem = 1; mainmem->flags |= POOL_NOREUSE; break; }ARGEND ErrorGuard *eg = newerrorguard(mkscalarint(0), nil); restart: if(setjmp(eg->jmp)){ ThreadData *td = getthreaddata(); Rune *msg = errorstr(td->lasterror); if(td->lasterrormsg){ if(runestrlen(msg) == 0) print("%S\n", td->lasterrormsg); else print("%S: %S\n", errorstr(td->lasterror), td->lasterrormsg); }else print("%S\n", errorstr(td->lasterror)); while(getcurrentdfn()) popdfnframe(); goto restart; } while(!off){ checkmem("main loop"); if(needsnewline){ print("\n"); needsnewline = 0; } print("\t"); Datum *result = evalline(nil, stdin, 1); if(result && !result->shy) print("%S\n", ppdatum(result)); freedatum(result); /* print("Unfreed arrays: %d\n", arrayalloccounts); print("Unfreed datums: %d\n", datumalloccounts); */ } threadexitsall(nil); } 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) incdatumref(result); Statement *s = stmts; while(s != nil){ Statement *tmp = s; s = s->next; freestatement(*tmp); free(tmp); } return result; }