O_TYPE O_streq(O_ARGS) { return BOOL(mpdm_cmp(M1, M2) == 0); }
void test_compiler_diffs(void) { mpdm_t r, cc, ac; int n; struct { wchar_t *code; int line; } compiler_tests[] = { // CT(L"local a = 1, b = 2, c, d = 3;"), // CT(L"local a = 1;"), // CT(L"local v; 1;"), // CT(L"local x, y, z; 2;"), CT(L"a |= 6;"), CT(L"a %= 6;"), CT(L"a /= 6;"), CT(L"a *= 6;"), CT(L"a -= 6;"), CT(L"a += 6;"), CT(L"for (n = 0; n < 100; n = n + 1) { print('kill'); } 1234;"), CT(L"for (;;) { print('kill'); } 1234;"), CT(L"foreach (v, i, [1, 2, 3]) { print(e); } 666;"), CT(L"eol = driver == 'win32' && 'crlf' || 'lf';"), CT(L"255 $ '%x';"), CT(L"foreach (e, [1, 2, 3]) { print(e); } 666;"), // CT(L"global v; 1;"), // CT(L"global x, y, z; 2;"), CT(L"sub pi { 3.1416; } 100;"), CT(L"sub pi () { 3.1416; } 200;"), CT(L"sub by2(v) { v * 2; } 250;"), CT(L"sub mul(v1, v2) { v1 * v2; } 300;"), CT(L"mul = sub (v1, v2) { v1 * v2; }; 123;"), CT(L"by2 = sub (e) { e * 2; }; 100;"), CT(L"pi = sub { 3.14; }; 6;"), CT(L"f->write('hi', string(1 + 3), eol); 1;"), CT(L"f->read(); 1;"), CT(L"while (1) 2;"), CT(L"while (1) { 2; 3; }"), CT(L"while (a < 10) { a = a + 1; }"), CT(L"if (a == 1) { b = 2 + 4; c = 3 * 2; } else { d = 3; e = d / 2; }"), CT(L"if (1) 2; else 3;"), CT(L"if (1) { 2; 3; }"), CT(L"if (1) { 2; }"), CT(L"if (1) 2;"), CT(L"if (2 + 3) 4 + 5;"), CT(L"if (a == 1) b = 2;"), CT(L"list[0];"), CT(L"list[1] = 1;"), CT(L"MPSL['OPCODE'];"), CT(L"q = 1 + 2 * 3;"), CT(L"q.q = 1 * 2 + 3; q2 = [];"), CT(L"q = 100;"), CT(L"MPSL.CORE.random;"), CT(L"1 + 2; [1, 2] ; {};"), CT(L"a + 1;"), CT(L"1 * (2 + 3);"), CT(L"{};"), CT(L"{a: 1};"), CT(L"{c: 2, d: 3};"), CT(L"{'e' => 4, 'f' => 5};"), CT(L"{g: 6, 'h' => 7};"), CT(L"{a: 2 * 3, b: 5 + 8};"), CT(L"[];"), CT(L"[1, 2, 3];"), CT(L"[1, 2 + 3, 4];"), CT(L"MPSL.CORE.random();"), CT(L"bool(1, 2) + 666;"), CT(L"1 ; 2 ; 3;"), CT(L"random();"), CT(L"5 != '5';"), CT(L"10 == '10';"), CT(L"10 > 1 + 2;"), CT(L"1 + 2 * 3;"), CT(L"1 * 2 + 3;"), CT(L"1.2 + 3.4;"), CT(L"/* test test */"), CT(L"1;"), CT(L"!1;"), CT(L"'abcde';"), CT(L"3.14;"), CT(NULL) }; printf("\nComparing the output of the two compilers:\n"); r = mpdm_get_wcs(mpdm_root(), L"MPSL"); cc = mpdm_get_wcs(r, L"c_compiler"); ac = mpdm_get_wcs(r, L"a_compiler"); for (n = 0; compiler_tests[n].code; n++) { mpdm_t c, x1, x2, d1, d2; c = MPDM_S(compiler_tests[n].code); mpdm_ref(c); mpdm_set_wcs(r, cc, L"compiler"); x1 = mpsl_compile(c, NULL); d1 = mpsl_decompile(x1); mpdm_set_wcs(r, ac, L"compiler"); x2 = mpsl_compile(c, NULL); d2 = mpsl_decompile(x2); /* printf("%ls\n", mpdm_string(d1)); printf("%ls\n", mpdm_string(d2));*/ _do_test("compiler output equal", mpdm_cmp(d1, d2) == 0, compiler_tests[n].line); mpdm_unref(c); } mpdm_set_wcs(r, cc, L"compiler"); }
static mpdm_t kde4_drv_form(mpdm_t a, mpdm_t ctxt) { int n; mpdm_t widget_list; QWidget *qlist[100]; mpdm_t r; KDialog *dialog = new KDialog(window); dialog->setModal(true); dialog->setButtons(KDialog::Ok | KDialog::Cancel); widget_list = mpdm_aget(a, 0); KVBox *vb = new KVBox(dialog); dialog->setMainWidget(vb); for (n = 0; n < mpdm_size(widget_list); n++) { mpdm_t w = mpdm_aget(widget_list, n); wchar_t *type; mpdm_t t; KHBox *hb = new KHBox(vb); type = mpdm_string(mpdm_hget_s(w, L"type")); if ((t = mpdm_hget_s(w, L"label")) != NULL) { QLabel *ql = new QLabel(hb); ql->setText(str_to_qstring(mpdm_gettext(t))); } t = mpdm_hget_s(w, L"value"); if (wcscmp(type, L"text") == 0) { mpdm_t h; QComboBox *ql = new QComboBox(hb); ql->setEditable(true); ql->setMinimumContentsLength(30); ql->setMaxVisibleItems(8); if (t != NULL) ql->setEditText(str_to_qstring(t)); qlist[n] = ql; if ((h = mpdm_hget_s(w, L"history")) != NULL) { int i; /* has history; fill it */ h = mp_get_history(h); for (i = mpdm_size(h) - 1; i >= 0; i--) ql->addItem(str_to_qstring(mpdm_aget(h, i))); } } else if (wcscmp(type, L"password") == 0) { QLineEdit *ql = new QLineEdit(hb); ql->setEchoMode(QLineEdit::Password); qlist[n] = ql; } else if (wcscmp(type, L"checkbox") == 0) { QCheckBox *qc = new QCheckBox(hb); if (mpdm_ival(t)) qc->setCheckState(Qt::Checked); qlist[n] = qc; } else if (wcscmp(type, L"list") == 0) { int i; QListWidget *ql = new QListWidget(hb); ql->setMinimumWidth(480); /* use a monospaced font */ ql->setFont(QFont(QString("Mono"))); mpdm_t l = mpdm_hget_s(w, L"list"); for (i = 0; i < mpdm_size(l); i++) ql->addItem(str_to_qstring(mpdm_aget(l, i))); ql->setCurrentRow(mpdm_ival(t)); qlist[n] = ql; } if (n == 0) qlist[n]->setFocus(Qt::OtherFocusReason); } n = dialog->exec(); if (!n) return NULL; r = MPDM_A(mpdm_size(widget_list)); /* fill the return values */ for (n = 0; n < mpdm_size(widget_list); n++) { mpdm_t w = mpdm_aget(widget_list, n); mpdm_t v = NULL; wchar_t *type; type = mpdm_string(mpdm_hget_s(w, L"type")); if (wcscmp(type, L"text") == 0) { mpdm_t h; QComboBox *ql = (QComboBox *) qlist[n]; v = qstring_to_str(ql->currentText()); /* if it has history, add to it */ if ((h = mpdm_hget_s(w, L"history")) != NULL && v != NULL && mpdm_cmp_s(v, L"") != 0) { h = mp_get_history(h); if (mpdm_cmp(v, mpdm_aget(h, -1)) != 0) mpdm_push(h, v); } } else if (wcscmp(type, L"password") == 0) { QLineEdit *ql = (QLineEdit *) qlist[n]; v = qstring_to_str(ql->text()); } else if (wcscmp(type, L"checkbox") == 0) { QCheckBox *qb = (QCheckBox *) qlist[n]; v = MPDM_I(qb->checkState() == Qt::Checked); } else if (wcscmp(type, L"list") == 0) { QListWidget *ql = (QListWidget *) qlist[n]; v = MPDM_I(ql->currentRow()); } mpdm_aset(r, v, n); } return r; }
void test_mpsl2(void) { mpdm_t v; mpdm_t w; /* execution tests */ v = do_test_mpsl("666;"); mpdm_dump(v); v = do_test_exec(v, NULL); do_test("literal number", mpdm_ival(v) == 666); v = do_test_mpsl("\"goodbye\";"); v = do_test_exec(v, NULL); do_test("literal string", mpdm_cmp(v, MPDM_S(L"goodbye")) == 0); v = do_test_mpsl("1 + 3 + 5;"); v = do_test_exec(v, NULL); do_test("mpsl calculator 1", mpdm_rval(v) == 9.0); v = do_test_mpsl("1 + ((3 - 5) * 8);"); v = do_test_exec(v, NULL); do_test("mpsl calculator 2", mpdm_rval(v) == -15.0); /* next value cannot be tested as an exact equality, as rounding errors will manifest */ v = do_test_mpsl("1.5 + ((3.1 - 5.8) * 8.0);"); v = do_test_exec(v, NULL); do_test("mpsl calculator 3", mpdm_rval(v) < -20.0 && mpdm_rval(v) > -21.0); v = do_test_mpsl("2 + 3 * 4;"); v = do_test_exec(v, NULL); do_test("mpsl calculator 4", mpdm_rval(v) == 14.0); v = do_test_mpsl("2 * 3 + 4;"); v = do_test_exec(v, NULL); do_test("mpsl calculator 5", mpdm_rval(v) == 10.0); v = do_test_exec(do_test_mpsl("2 + 3 * 4;"), NULL); mpdm_ref(v); w = do_test_exec(do_test_mpsl("2 + (3 * 4);"), NULL); do_test("mpsl calculator 6 (operator precedence)", mpdm_rval(v) == mpdm_rval(w)); mpdm_unref(v); v = do_test_exec(do_test_mpsl("2 + 3 * 4;"), NULL); mpdm_ref(v); w = do_test_exec(do_test_mpsl("(2 + 3) * 4;"), NULL); do_test("mpsl calculator 7 (operator precedence)", mpdm_rval(v) != mpdm_rval(w)); mpdm_unref(v); v = do_test_mpsl("/* array */ [\"this\", \"one\", \"is\", 666, \"cool\"];"); v = do_test_exec(v, NULL); mpdm_dump(v); do_test("mpsl array", mpdm_ival(mpdm_get_i(v, 3)) == 666); v = do_test_mpsl ("/* hash */ { \"enero\" => \"january\", \"febrero\" => \"february\" };"); v = do_test_exec(v, NULL); mpdm_dump(v); do_test("mpsl hash", mpdm_cmp(mpdm_get(v, MPDM_S(L"febrero")), MPDM_S(L"february")) == 0); v = do_test_mpsl("! 1;"); v = do_test_exec(v, NULL); do_test("boolean not 1", !mpdm_is_true(v)); v = do_test_mpsl("! 0;"); v = do_test_exec(v, NULL); do_test("boolean not 2", v != NULL); v = do_test_mpsl("1 && 3;"); v = do_test_exec(v, NULL); do_test("boolean and 1", mpdm_ival(v) == 3); v = do_test_mpsl("1 && 0;"); v = do_test_exec(v, NULL); do_test("boolean and 2", !mpdm_is_true(v)); v = do_test_mpsl("0 && 1;"); v = do_test_exec(v, NULL); do_test("boolean and 3", !mpdm_is_true(v)); v = do_test_mpsl("1 || 3;"); v = do_test_exec(v, NULL); do_test("boolean or 1", mpdm_ival(v) == 1); v = do_test_mpsl("2 || 0;"); v = do_test_exec(v, NULL); do_test("boolean or 2", mpdm_ival(v) == 2); v = do_test_mpsl("0 || 3;"); v = do_test_exec(v, NULL); do_test("boolean or 3", mpdm_ival(v) == 3); v = do_test_mpsl("6 == 6;"); v = do_test_exec(v, NULL); do_test("numeric == 1", v != NULL); v = do_test_mpsl("8.0 == 8.0;"); v = do_test_exec(v, NULL); do_test("numeric == 2", v != NULL); v = do_test_mpsl("6 == 8;"); v = do_test_exec(v, NULL); do_test("numeric == 3", !mpdm_is_true(v)); v = do_test_mpsl("6 != 6;"); v = do_test_exec(v, NULL); do_test("numeric != 1", !mpdm_is_true(v)); v = do_test_mpsl("8.0 != 8.0;"); v = do_test_exec(v, NULL); do_test("numeric != 2", !mpdm_is_true(v)); v = do_test_mpsl("6 != 8;"); v = do_test_exec(v, NULL); do_test("numeric != 3", v != NULL); v = do_test_mpsl("6 < 6;"); v = do_test_exec(v, NULL); do_test("numeric < 1", !mpdm_is_true(v)); v = do_test_mpsl("8 < 6;"); v = do_test_exec(v, NULL); do_test("numeric < 2", !mpdm_is_true(v)); v = do_test_mpsl("5 < 6;"); v = do_test_exec(v, NULL); do_test("numeric < 3", v != NULL); v = do_test_mpsl("6 > 6;"); v = do_test_exec(v, NULL); do_test("numeric > 1", !mpdm_is_true(v)); v = do_test_mpsl("8 > 6;"); v = do_test_exec(v, NULL); do_test("numeric > 2", v != NULL); v = do_test_mpsl("5 > 6;"); v = do_test_exec(v, NULL); do_test("numeric > 3", !mpdm_is_true(v)); v = do_test_mpsl("6 <= 6;"); v = do_test_exec(v, NULL); do_test("numeric <= 1", v != NULL); v = do_test_mpsl("8 <= 6;"); v = do_test_exec(v, NULL); do_test("numeric <= 2", !mpdm_is_true(v)); v = do_test_mpsl("5 <= 6;"); v = do_test_exec(v, NULL); do_test("numeric <= 3", v != NULL); v = do_test_mpsl("6 >= 6;"); v = do_test_exec(v, NULL); do_test("numeric >= 1", v != NULL); v = do_test_mpsl("8 >= 6;"); v = do_test_exec(v, NULL); do_test("numeric >= 2", v != NULL); v = do_test_mpsl("5 >= 6;"); v = do_test_exec(v, NULL); do_test("numeric >= 3", !mpdm_is_true(v)); v = do_test_mpsl("11 % 6;"); v = do_test_exec(v, NULL); do_test("modulo", mpdm_ival(v) == 5); v = do_test_mpsl("variable=16384;"); mpdm_dump(v); v = do_test_exec(v, NULL); do_test("assign 1", mpdm_ival(v) == 16384); v = do_test_mpsl("array=[10, 20, 30, 40];"); v = do_test_exec(v, NULL); do_test("assign 2", mpdm_ival(mpdm_get_i(v, 2)) == 30); v = do_test_mpsl("a=1; b=2; c=3;"); mpdm_dump(v); v = do_test_exec(v, NULL); v = do_test_mpsl("CACHE={}; CACHE.regex=[]; CACHE.regex[0]=12345;"); v = do_test_exec(v, NULL); v = do_test_mpsl("variable;"); v = do_test_exec(v, NULL); do_test("symval 1", mpdm_ival(v) == 16384); v = do_test_mpsl("variable2=1 + ((3 - 5) * 8); variable2;"); mpdm_dump(v); v = do_test_exec(v, NULL); do_test("symval 2", mpdm_rval(v) == -15); v = do_test_mpsl("variable3=variable2 * 2;"); v = do_test_exec(v, NULL); do_test("symval 3", mpdm_ival(v) == -30); v = do_test_mpsl("sub mysum(a, b) { a + b; }"); mpdm_dump(v); v = do_test_exec(v, NULL); do_test("sub 1", v != NULL); v = do_test_mpsl("sub pi() { 3.1416; }"); mpdm_dump(v); v = do_test_exec(v, NULL); do_test("sub 2", v != NULL); v = do_test_mpsl("var10=pi();"); v = do_test_exec(v, NULL); do_test("exec 1", mpdm_rval(v) == 3.1416); v = do_test_mpsl("var11=pi() * 10000; var11;"); v = do_test_exec(v, NULL); do_test("exec 2", mpdm_rval(v) == 31416); v = do_test_mpsl("mysum(100, 20);"); v = do_test_exec(v, NULL); do_test("exec 3", mpdm_rval(v) == 120.0); v = do_test_mpsl("a = NULL;"); v = do_test_exec(v, NULL); do_test("NULL 1", v == NULL); v = do_test_mpsl("a == NULL;"); v = do_test_exec(v, NULL); do_test("NULL 2", mpdm_ival(v) == 1); v = do_test_mpsl("local a, b; a = 1; b = 2;"); v = do_test_exec(v, NULL); v = do_test_mpsl("a == NULL;"); v = do_test_exec(v, NULL); do_test("local 1", mpdm_ival(v) == 1); v = do_test_mpsl("66 * -1;"); v = do_test_exec(v, NULL); do_test("uminus", mpdm_ival(v) == -66); v = do_test_mpsl("\"test\" eq \"test\";"); v = do_test_exec(v, NULL); do_test("streq 1", mpdm_is_true(v)); v = do_test_mpsl("\"test\" eq \"prueba\";"); v = do_test_exec(v, NULL); do_test("streq 1", !mpdm_is_true(v)); v = do_test_mpsl("a = 6; ++ a;"); v = do_test_exec(v, NULL); do_test("pinc", mpdm_ival(v) == 7); v = do_test_mpsl("a++;"); v = do_test_exec(v, NULL); do_test("sinc", mpdm_ival(v) == 7); v = do_test_mpsl("a += 10;"); v = do_test_exec(v, NULL); do_test("iadd", mpdm_ival(v) == 18); v = do_test_mpsl("local a, b, c; a=1; b=2; c=3; if(a == b) c=1000; c;"); v = do_test_exec(v, NULL); do_test("if 1", mpdm_ival(v) == 3); v = do_test_mpsl("local a, b, c; a=1; b=2; c=3; if(a <= b) c=1000; c;"); v = do_test_exec(v, NULL); do_test("if 2", mpdm_ival(v) == 1000); v = do_test_mpsl("local a, b, c; a=1; b=2; if(a == b) c=1000; else c=2000; c;"); v = do_test_exec(v, NULL); do_test("ifelse", mpdm_ival(v) == 2000); v = do_test_mpsl("local a; a = 0; while(a < 100) { a++; } a;"); v = do_test_exec(v, NULL); do_test("ifelse", mpdm_ival(v) == 100); v = do_test_mpsl("a=mysum(100, 50); a;"); v = do_test_exec(v, NULL); do_test("mysum 1", mpdm_ival(v) == 150); v = do_test_mpsl("a=mysum(2000, 500); a;"); v = do_test_exec(v, NULL); do_test("mysum 2", mpdm_ival(v) == 2500); w = mpdm_ref(MPDM_A(2)); mpdm_set_i(w, MPDM_I(100), 0); mpdm_set_i(w, MPDM_I(50), 1); /* asks for the value of the mysum symbol (the code) */ v = do_test_mpsl("mysum;"); /* executes, so mysum() itself is being returned */ v = do_test_exec(v, NULL); mpdm_dump(v); do_test("mysum 3", mpdm_ival(do_test_exec(v, w)) == 150); mpdm_set_i(w, MPDM_I(75), 1); do_test("mysum 4", mpdm_ival(do_test_exec(v, w)) == 175); /* compiles (and executes) the definition of gcd() */ v = do_test_mpsl ("/* greatest common divisor (Euclid's algorithm) */ sub gcd(m, n) { while (m > 0) { if(n > m) { local t = m; m = n; n = t; } m -= n; } n; }"); do_test_exec(v, NULL); /* gets a pointer to gcd() */ v = do_test_exec(do_test_mpsl("gcd;"), NULL); mpdm_dump(v); /* executes gcd(100, 50); */ mpdm_set_i(w, MPDM_I(50), 1); do_test("gcd() 1", mpdm_ival(do_test_exec(v, w)) == 50); /* executes gcd(100, 75); */ mpdm_set_i(w, MPDM_I(75), 1); do_test("gcd() 2", mpdm_ival(do_test_exec(v, w)) == 25); mpdm_unref(w); /* string concatenation */ w = mpdm_ref(MPDM_S(L"big lebowski")); v = do_test_mpsl("\"big\" ~ \" lebowski\";"); do_test("~ (strcat 1)", mpdm_cmp(do_test_exec(v, NULL), w) == 0); v = do_test_mpsl("\"big\" ~ \" \" ~ \"lebowski\";"); do_test("~ (strcat 2)", mpdm_cmp(do_test_exec(v, NULL), w) == 0); mpdm_unref(w); }
/** integer = cmp(v); */ static mpdm_t F_cmp(F_ARGS) { return MPDM_I(mpdm_cmp(A0, A1)); }