#include #include #include #include "aa.h" #include "aa_math.h" /* need this for note handling * FIXME in threaded program we'd probably use thread local storage? */ static aaContext *curctx; static jmp_buf toplevel; static char buf[64000]; static void onerror(aaContext *ctx, const char *msg, aaObject *cl) { USED(cl); Bprint(ctx->fd[2], "error: %s\n", msg); Bflush(ctx->fd[2]); longjmp(toplevel, -1); } static void onnote(void *uregs, char *msg) { if(strncmp(msg, "sys: trap: ", 11) == 0) noted(NDFLT); Bprint(curctx->fd[2], "error: %s\n", msg); Bflush(curctx->fd[2]); notejmp(uregs, toplevel, -1); } void main(int argc, char **argv) { int gc; aaObject *obj; Biobuf *fp; aaContext *ctx = aa_open(buf, sizeof(buf), 0); aa_include_math(ctx); curctx = ctx; notify(onnote); if(argc > 1){ if((fp = Bopen(argv[1], OREAD)) == nil) aa_error(ctx, "could not open input file"); else ctx->fd[0] = fp; }else{ fp = ctx->fd[0]; aa_handlers(ctx)->error = onerror; Bprint(ctx->fd[2], "aa v0.0.1\n"); } gc = aa_savegc(ctx); setjmp(toplevel); for(;;){ aa_restoregc(ctx, gc); if(fp->fid == 0){ Bflush(ctx->fd[2]); Bflush(ctx->fd[1]); } if((obj = aa_read(ctx, fp)) == nil) break; obj = aa_eval(ctx, obj); if(fp->fid == 0) Bprint(ctx->fd[2], "\x08 ⇒ %§\n", obj); } aa_close(ctx); exits(nil); }