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");