static void node_init(strm_state* state) { strm_var_def("STDIN", strm_ptr_value(strm_io_new(0, STRM_IO_READ))); strm_var_def("STDOUT", strm_ptr_value(strm_io_new(1, STRM_IO_WRITE))); strm_var_def("STDERR", strm_ptr_value(strm_io_new(2, STRM_IO_WRITE))); strm_var_def("puts", strm_cfunc_value(exec_puts)); strm_var_def("+", strm_cfunc_value(exec_plus)); strm_var_def("-", strm_cfunc_value(exec_minus)); strm_var_def("*", strm_cfunc_value(exec_mult)); strm_var_def("/", strm_cfunc_value(exec_div)); strm_var_def("<", strm_cfunc_value(exec_lt)); strm_var_def("<=", strm_cfunc_value(exec_le)); strm_var_def(">", strm_cfunc_value(exec_gt)); strm_var_def(">=", strm_cfunc_value(exec_ge)); strm_var_def("==", strm_cfunc_value(exec_eq)); strm_var_def("!=", strm_cfunc_value(exec_neq)); strm_var_def("|", strm_cfunc_value(exec_bar)); strm_var_def("%", strm_cfunc_value(exec_mod)); strm_var_def("fread", strm_cfunc_value(exec_fread)); strm_var_def("fwrite", strm_cfunc_value(exec_fwrite)); strm_seq_init(state); strm_socket_init(state); strm_csv_init(state); }
int node_run(parser_state* p) { strm_value v; node_init(&p->ctx); strm_seq_init(&p->ctx); exec_expr(&p->ctx, (node*)p->lval, &v); if (p->ctx.exc != NULL) { strm_value v; exec_cputs(&p->ctx, stderr, 1, &p->ctx.exc->arg, &v); /* TODO: garbage correct previous exception value */ p->ctx.exc = NULL; } return 0; }