示例#1
0
文件: stress.c 项目: angelortega/mpsl
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);
}
示例#2
0
/**
 * 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;
}
示例#3
0
文件: stress.c 项目: angelortega/mpsl
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);
}
示例#4
0
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);
}
示例#5
0
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]) {
示例#6
0
文件: mpsl_f.c 项目: angelortega/mpsl
/** 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);
}