#include #include #include #include #include #include "apl9.h" Biobuf *stdin; static int booted = 0; static Rune *startfile = L"runtime/start.apl"; static Rune *stdlibfile = L"runtime/stdlib.apl"; 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)){ displayerror(); while(getcurrentdfn()) popdfnframe(); goto restart; } if(!booted){ booted = 1; runfile(mkrunearray(stdlibfile)); runfile(mkrunearray(startfile)); } while(!off){ checkmem("main loop"); Datum *result = evalline(nil, stdin, 1); if(result) outputmain(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; }