static int breakloop(char *hdr, char *cmsg, char *emsg, NODE *arg, int cflag) { NODE ***oldstk,*expr,*val; CONTEXT cntxt; int type; xlerrprint(hdr,cmsg,emsg,arg); xlflush(); if (((s_tracenable)->n_info.n_xsym.xsy_value)) { val = ((s_tlimit)->n_info.n_xsym.xsy_value); xlbaktrace(((val) && (val)->n_type == 5) ? (int)((val)->n_info.n_xint.xi_int) : -1); } oldstk = xlsave(&expr,(NODE **)0); xldebug++; xlbegin(&cntxt,8|16|32,true); for (type = 0; type == 0; ) { if (type = setjmp(cntxt.c_jmpbuf)) switch (type) { case 8: xlflush(); type = 0; continue; case 16: continue; case 32: if (cflag) { stdputstr("[ continue from break loop ]\n"); continue; } else xlabort("this error can't be continued"); } if (!xlread(((s_stdin)->n_info.n_xsym.xsy_value),&expr,0)) { type = 16; break; } expr = xleval(expr); xlprint(((s_stdout)->n_info.n_xsym.xsy_value),expr,1); xlterpri(((s_stdout)->n_info.n_xsym.xsy_value)); } xlend(&cntxt); xldebug--; xlstack = oldstk; if (type == 16) { stdputstr("[ abort to previous level ]\n"); xlsignal(0,(NODE *)0); } }
nyx_rval nyx_eval_expression(const char *expr_string) { LVAL expr = NULL; nyx_expr_string = expr_string; nyx_expr_len = strlen(nyx_expr_string); nyx_expr_pos = 0; nyx_result = NULL; nyx_parse_error_flag = 0; xlprot1(expr); /* setup the error return */ xlbegin(&nyx_cntxt,CF_TOPLEVEL|CF_CLEANUP|CF_BRKLEVEL,(LVAL)1); if (setjmp(nyx_cntxt.c_jmpbuf)) goto finish; while(nyx_expr_pos < nyx_expr_len) { expr = NULL; /* read an expression */ if (!xlread(getvalue(s_stdin), &expr, FALSE)) break; #if 0 /* save the input expression (so the user can refer to it as +, ++, or +++) */ xlrdsave(expr); #endif /* evaluate the expression */ nyx_result = xleval(expr); } xlflush(); finish: xlend(&nyx_cntxt); xlpop(); /* unprotect expr */ /* reset the globals to their initial state */ obarray = nyx_old_obarray; setvalue(xlenter("S"), NULL); gc(); return nyx_get_type(nyx_result); }
main(int argc, char **argv) { CONTEXT cntxt; NODE *expr; int i; osinit("XLISP version 1.6, Copyright (c) 1985, by David Betz"); xlbegin(&cntxt,64|8,(NODE *) 1); if (setjmp(cntxt.c_jmpbuf)) { printf("fatal initialization error\n"); osfinish(); exit(1); } xlinit(); xlend(&cntxt); xlbegin(&cntxt,64|8,true); if (setjmp(cntxt.c_jmpbuf) == 0) xlload("init.lsp",0,0); if (setjmp(cntxt.c_jmpbuf) == 0) for (i = 1; i < argc; i++) if (!xlload(argv[i],1,0)) xlfail("can't load file"); xlsave(&expr,(NODE **)0); while (1) { if (i = setjmp(cntxt.c_jmpbuf)) { if (i == 64) stdputstr("[ back to the top level ]\n"); ((s_evalhook)->n_info.n_xsym.xsy_value = ((NODE *)0)); ((s_applyhook)->n_info.n_xsym.xsy_value = ((NODE *)0)); xldebug = 0; xlflush(); } if (!xlread(((s_stdin)->n_info.n_xsym.xsy_value),&expr,0)) break; expr = xleval(expr); stdprint(expr); } xlend(&cntxt); osfinish (); exit (0); }
nyx_rval nyx_eval_expression(const char *expr_string) { LVAL expr = NULL; #if defined(NYX_MEMORY_STATS) && NYX_MEMORY_STATS printf("\nnyx_eval_expression before\n"); xmem(); #endif nyx_result = NULL; nyx_result_type = nyx_error; // Check argument if (!expr_string || !strlen(expr_string)) { return nyx_get_type(nyx_result); } nyx_expr_string = expr_string; nyx_expr_len = strlen(nyx_expr_string); nyx_expr_pos = 0; // Protect the expression from being garbage collected xlprot1(expr); // Setup a new context xlbegin(&nyx_cntxt, CF_TOPLEVEL|CF_CLEANUP|CF_BRKLEVEL|CF_ERROR, s_true); // Set the context jump destination if (setjmp(nyx_cntxt.c_jmpbuf)) { // If the script is cancelled or some other condition occurs that causes // the script to exit and return to this level, then we don't need to // restore the previous context. goto finish; } while (nyx_expr_pos < nyx_expr_len) { expr = NULL; // Read an expression if (!xlread(getvalue(s_stdin), &expr, FALSE)) { break; } #if 0 /* save the input expression (so the user can refer to it as +, ++, or +++) */ xlrdsave(expr); #endif // Evaluate the expression nyx_result = xleval(expr); } // This will unwind the xlisp context and restore internals to a point just // before we issued our xlbegin() above. This is important since the internal // xlisp stacks will contain pointers to invalid objects otherwise. // // Also note that execution will jump back up to the statement following the // setjmp() above. xljump(&nyx_cntxt, CF_TOPLEVEL, NIL); // Never reached finish: xlflush(); xlpop(); // unprotect expr gc(); #if defined(NYX_MEMORY_STATS) && NYX_MEMORY_STATS printf("\nnyx_eval_expression after\n"); xmem(); #endif return nyx_get_type(nyx_result); }
void nyx_continue() { xlflush(); xlcontinue(); }
void nyx_break() { xlflush(); xlbreak("BREAK", s_unbound); }
void nyx_stop() { xlflush(); xltoplevel(); }