Mercurial > hg > dmlib
changeset 680:4422a1880859
More work.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 16 Apr 2013 15:24:20 +0300 |
parents | 1dc7bd5f99f7 |
children | d9a55e797f30 |
files | dmeval.c dmeval.h tests/evaltest.c |
diffstat | 3 files changed, 36 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/dmeval.c Tue Apr 16 15:13:37 2013 +0300 +++ b/dmeval.c Tue Apr 16 15:24:20 2013 +0300 @@ -745,7 +745,7 @@ */ -int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result, int pass) +static int dm_eval_reorder_do(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result, int pass) { DMEvalNode *list = NULL; int i, res; @@ -778,7 +778,7 @@ if ((tmp = dm_eval_push_node(&(sub->subexpr), node)) == NULL) return -178; - if ((res = dm_eval_reorder(ev, node->subexpr, &(tmp->subexpr), pass)) != 0) + if ((res = dm_eval_reorder_do(ev, node->subexpr, &(tmp->subexpr), pass)) != 0) return res; } else @@ -810,7 +810,7 @@ for (i = 0; i < DM_MAX_ARGS; i++) { - if ((res = dm_eval_reorder(ev, node->args[i], &(tmp->args[i]), pass)) != 0) + if ((res = dm_eval_reorder_do(ev, node->args[i], &(tmp->args[i]), pass)) != 0) return res; } node = node->next; @@ -820,7 +820,7 @@ if ((tmp = dm_eval_push_node(&list, node)) == NULL) return -1; - if ((res = dm_eval_reorder(ev, node->subexpr, &(tmp->subexpr), pass)) != 0) + if ((res = dm_eval_reorder_do(ev, node->subexpr, &(tmp->subexpr), pass)) != 0) return res; node = node->next; break; @@ -854,7 +854,7 @@ if ((tmp = dm_eval_push_node(&(sub->subexpr), node)) == NULL) return -178; - if ((res = dm_eval_reorder(ev, node->subexpr, &(tmp->subexpr), pass)) != 0) + if ((res = dm_eval_reorder_do(ev, node->subexpr, &(tmp->subexpr), pass)) != 0) return res; } else @@ -877,7 +877,7 @@ return -14; tmp = NULL; - if ((res = dm_eval_reorder(ev, node, &tmp, pass)) != 0) + if ((res = dm_eval_reorder_do(ev, node, &tmp, pass)) != 0) return res; sub->subexpr = tmp; @@ -910,6 +910,21 @@ } +int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result) +{ + DMEvalNode *tmp = NULL; + int res; + + if ((res = dm_eval_reorder_do(ev, node, &tmp, 0)) != 0) + return res; + + res = dm_eval_reorder_do(ev, tmp, result, 1); + + dm_eval_free(tmp); + return res; +} + + static int dm_eval_get(DMEvalContext *ev, DMEvalNode *node, DMValue *result) { if (node == NULL)
--- a/dmeval.h Tue Apr 16 15:13:37 2013 +0300 +++ b/dmeval.h Tue Apr 16 15:24:20 2013 +0300 @@ -88,7 +88,7 @@ void dm_eval_clear_err(DMEvalContext *ev); int dm_eval_parse_expr(DMEvalContext *ev, char *expr, DMEvalNode **result); -int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result, int pass); +int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result); int dm_eval_exec(DMEvalContext *ev, DMEvalNode *tree, DMValue *presult); void dm_print_optree(DMEvalContext *ev, DMEvalNode *node);
--- a/tests/evaltest.c Tue Apr 16 15:13:37 2013 +0300 +++ b/tests/evaltest.c Tue Apr 16 15:24:20 2013 +0300 @@ -67,7 +67,7 @@ DMEvalContext *ev = dm_eval_new(); DMEvalNode *parsed = NULL, *ordered = NULL; DMValue result, t, f = 44100.0f; - int ret, i; + int ret; dmVerbosity = 2; optFormula = "-pi * -2"; @@ -83,6 +83,7 @@ dm_eval_add_var(ev, "t", &t); dm_eval_add_var(ev, "f", &f); + // Parse expression ret = dm_eval_parse_expr(ev, optFormula, &parsed); dmMsg(1, "parse ret=%d\n", ret); if (ev->err) @@ -94,25 +95,21 @@ if (ret != 0) return -1; - for (i = 0; i < 2; i++) - { - dm_eval_clear_err(ev); - - ret = dm_eval_reorder(ev, parsed, &ordered, 0); - dmMsg(1, "reorder ret=%d\n", ret); - if (ev->err) - dmError("%s\n", ev->errStr); + // Perform reordering + dm_eval_clear_err(ev); + + ret = dm_eval_reorder(ev, parsed, &ordered); + dmMsg(1, "reorder ret=%d\n", ret); + if (ev->err) + dmError("%s\n", ev->errStr); - if (dmVerbosity > 0) - dm_print_optree(ev, ordered); + if (dmVerbosity > 0) + dm_print_optree(ev, ordered); - if (ret != 0) - return -2; - - parsed = ordered; - } + if (ret != 0) + return -2; - + // Benchmark or execute if (optBenchmark) { dmMsg(0, "Benchmarking ...\n");