mpdm_t do_test_exec(mpdm_t x, mpdm_t a) { static mpdm_t v = NULL; do_set(&v, mpdm_exec(x, a, NULL)); return (v); }
/** * mpsl_set_symbol - Sets value to a symbol. * @s: symbol name * @v: value * @l: local symbol table * * Assigns the value @v to the @s symbol. If the value exists as * a local symbol, it's assigned to it; otherwise, it's set as a global * symbol (and created if it does not exist). */ mpdm_t mpsl_set_symbol(mpdm_t s, mpdm_t v, mpdm_t l) { int n; mpdm_t r, p, w; mpdm_ref(l); mpdm_ref(s); mpdm_ref(v); /* get the local or global symbol table */ if ((r = find_local_symtbl(s, l)) == NULL) r = mpdm_root(); /* splits the path, if needed */ if (MPDM_IS_ARRAY(s)) p = mpdm_ref(s); else p = mpdm_ref(mpdm_split_s(s, L".")); w = r; for (n = 0; w != NULL && n < mpdm_size(p); n++) { /* is executable? run it and take its output */ while (MPDM_IS_EXEC(w)) w = mpdm_exec(w, NULL, NULL); /* last component? */ if (n == mpdm_size(p) - 1) { /* yes; do the setting */ if (MPDM_IS_HASH(w)) w = mpdm_hset(w, mpdm_aget(p, n), v); else if (MPDM_IS_ARRAY(w)) w = mpdm_aset(w, v, mpdm_ival(mpdm_aget(p, n))); } else { if (MPDM_IS_HASH(w)) w = mpdm_hget(w, mpdm_aget(p, n)); else if (MPDM_IS_ARRAY(w)) w = mpdm_aget(w, mpdm_ival(mpdm_aget(p, n))); else { mpdm_void(w); w = NULL; } } } mpdm_unref(p); mpdm_unref(v); mpdm_unref(s); mpdm_unref(l); return w; }
void test_abort_and_eval(void) { mpdm_t v; mpdm_t e; mpsl_abort = 0; v = mpdm_ref(mpsl_compile(MPDM_S(L"1000;"), NULL)); do_test("Abort 1", mpdm_ival(mpdm_exec(v, NULL, NULL)) == 1000); /* set global abort function */ mpsl_abort = 1; do_test("Abort 2", mpdm_exec(v, NULL, NULL) == NULL); mpsl_abort = 0; do_test("Abort 3", mpdm_ival(mpdm_exec(v, NULL, NULL)) == 1000); mpdm_unref(v); mpsl_error(NULL); v = mpsl_eval(MPDM_S(L"invalid_code()"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); printf("The following error is OK:\n"); mpdm_dump(e); do_test("eval 1", v == NULL && e != NULL); v = mpsl_eval(MPDM_S(L"undef_func();"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); printf("The following error is also OK:\n"); mpdm_dump(e); do_test("eval 2", v == NULL && e != NULL); v = mpsl_eval(MPDM_S(L"load('unexistent_file.mpsl');"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); printf("The following error is also OK:\n"); mpdm_dump(e); do_test("eval 3", v == NULL && e != NULL); v = mpsl_eval(MPDM_S(L"2000;"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); do_test("eval 4", mpdm_ival(v) == 2000 && e == NULL); }
O_TYPE execsym(O_ARGS, int th, int m) { mpdm_t s, v, p, o = NULL, r = NULL; /* gets the symbol name */ s = RF(M1); /* gets the arguments */ p = RF(M2); /* if it's to be called as a method, the object should be inserted into the local symtable before searching the symbol */ if (m && (o = mpdm_aget(p, 0)) && MPDM_IS_HASH(o)) { mpdm_push(l, o); } else m = 0; /* gets the symbol value */ v = GET(s); if (!MPDM_IS_EXEC(v)) { /* not found or NULL value? error */ mpdm_t t, w; char tmp[128]; w = RF(mpdm_join_s(s, L".")); t = RF(MPDM_2MBS((wchar_t *) w->data)); snprintf(tmp, sizeof(tmp), "Undefined function %s()", (char *) t->data); mpsl_error(MPDM_MBS(tmp)); UF(w); UF(t); } else { /* execute */ r = RF(th ? mpdm_exec_thread(v, p, l) : mpdm_exec(v, p, l)); } UF(s); UF(p); /* drop the object from the local symtable */ if (m) mpdm_adel(l, -1); return UFND(r); }
static mpdm_t nc_getkey(mpdm_t args, mpdm_t ctxt) /* reads a key and converts to an action */ { static int shift = 0; wchar_t *f = NULL; mpdm_t k = NULL; /* any pending key? return it */ if ((k = mp_pending_key()) != NULL) return k; f = nc_getwch(); if (f[0] == -1) { mpdm_void(mpdm_exec(timer_func, NULL, NULL)); return NULL; } if (shift) { switch (f[0]) { case L'0': f = L"f10"; break; case L'1': f = L"f1"; break; case L'2': f = L"f2"; break; case L'3': f = L"f3"; break; case L'4': f = L"f4"; break; case L'5': f = L"f5"; break; case L'6': f = L"f6"; break; case L'7': f = L"f7"; break; case L'8': f = L"f8"; break; case L'9': f = L"f9"; break; case KEY_LEFT: f = L"alt-cursor-left"; break; case KEY_RIGHT: f = L"alt-cursor-right"; break; case KEY_DOWN: f = L"alt-cursor-down"; break; case KEY_UP: f = L"alt-cursor-up"; break; case KEY_END: f = L"alt-end"; break; case KEY_HOME: f = L"alt-home"; break; case L'\r': f = L"alt-enter"; break; case L'\e': f = L"escape"; break; case KEY_ENTER: f = L"alt-enter"; break; case L' ': f = L"alt-space"; break; case L'a': f = L"alt-a"; break; case L'b': f = L"alt-b"; break; case L'c': f = L"alt-c"; break; case L'd': f = L"alt-d"; break; case L'e': f = L"alt-e"; break; case L'f': f = L"alt-f"; break; case L'g': f = L"alt-g"; break; case L'h': f = L"alt-h"; break; case L'i': f = L"alt-i"; break; case L'j': f = L"alt-j"; break; case L'k': f = L"alt-k"; break; case L'l': f = L"alt-l"; break; case L'm': f = L"alt-m"; break; case L'n': f = L"alt-n"; break; case L'o': f = L"alt-o"; break; case L'p': f = L"alt-p"; break; case L'q': f = L"alt-q"; break; case L'r': f = L"alt-r"; break; case L's': f = L"alt-s"; break; case L't': f = L"alt-t"; break; case L'u': f = L"alt-u"; break; case L'v': f = L"alt-v"; break; case L'w': f = L"alt-w"; break; case L'x': f = L"alt-x"; break; case L'y': f = L"alt-y"; break; case L'z': f = L"alt-z"; break; case L'\'': f = L"alt-'"; break; case L',': f = L"alt-,"; break; case L'-': f = L"alt--"; break; case L'.': f = L"alt-."; break; case L'/': f = L"alt-/"; break; case L'=': f = L"alt-="; break; } shift = 0; } else { switch (f[0]) {
/** load(source_file); */ static mpdm_t F_load(F_ARGS) { return mpdm_exec(mpsl_compile_file(A0, mpsl_get_symbol(MPDM_S(L"INC"), l)), NULL, l); }