changeset 707:987541c66517

Simplify by merging several pass functions.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Apr 2013 22:08:47 +0300
parents d51dbf263a59
children 35ffb03ffd01
files dmeval.c
diffstat 1 files changed, 11 insertions(+), 119 deletions(-) [+]
line wrap: on
line diff
--- a/dmeval.c	Tue Apr 16 22:01:51 2013 +0300
+++ b/dmeval.c	Tue Apr 16 22:08:47 2013 +0300
@@ -816,23 +816,15 @@
 }
 
 
-static int dm_eval_reorder_pass1(DMEvalContext *ev, const DMEvalNode *node, DMEvalNode **result)
+static int dm_eval_reorder_passN(DMEvalContext *ev, const DMEvalNode *node, DMEvalNode **result,
+    const int op1, const int op2, const int op3)
 {
     DMEvalNode *tmp, *sub;
 
     for (; node != NULL; node = node->next)
-    switch (node->op)
     {
-        case OP_MUL:
-        case OP_DIV:
-        case OP_MOD:
-            if (node->ok)
-            {
-                if (dm_eval_push_node(result, node) == NULL)
-                    return -32;
-                break;
-            }
-
+        if (!node->ok && (node->op == op1 || node->op == op2 || node->op == op3))
+        {
             // Pop previous node, f.e. 5*3 -> 5
             if ((tmp = dm_eval_pop_node(result)) == NULL)
                 return -24;
@@ -854,110 +846,10 @@
                 return -72;
 
             dm_eval_push_node(&(sub->subexpr), node);
-            break;
-
-        default:
-            if (dm_eval_push_node(result, node) == NULL)
-                return -32;
-            break;
-    }
-
-    return 0;
-}
-
-static int dm_eval_reorder_pass2(DMEvalContext *ev, const DMEvalNode *node, DMEvalNode **result)
-{
-    DMEvalNode *tmp, *sub;
-
-    for (; node != NULL; node = node->next)
-    switch (node->op)
-    {
-        case OP_SUB:
-        case OP_ADD:
-            if (node->ok)
-            {
-                if (dm_eval_push_node(result, node) == NULL)
-                    return -32;
-                break;
-            }
-
-            // Pop previous node, f.e. 5*3 -> 5
-            if ((tmp = dm_eval_pop_node(result)) == NULL)
-                return -24;
-
-            // Add subexpression node
-            if ((sub = dm_eval_add_node(result, OP_SUBEXPR)) == NULL)
-                return -3;
-
-            // Add popped node into subexpression
-            dm_eval_push_node(&(sub->subexpr), tmp);
-            
-            // Add this operator into subexpression
-            DMEvalNode *foo = dm_eval_add_node(&(sub->subexpr), node->op);
-            foo->ok = TRUE;
-
-            // Next node
-            node = node->next;
-            if (node == NULL)
-                return -72;
-
-            dm_eval_push_node(&(sub->subexpr), node);
-            break;
-
-        default:
-            if (dm_eval_push_node(result, node) == NULL)
-                return -32;
-            break;
-    }
-
-    return 0;
-}
-
-
-static int dm_eval_reorder_pass3(DMEvalContext *ev, const DMEvalNode *node, DMEvalNode **result)
-{
-    DMEvalNode *tmp, *sub;
-    int res;
-
-    for (; node != NULL; node = node->next)
-    switch (node->op)
-    {
-        case OP_LSHIFT:
-        case OP_RSHIFT:
-            if (node->ok)
-            {
-                if (dm_eval_push_node(result, node) == NULL)
-                    return -32;
-                break;
-            }
-
-            // Pop previous node, f.e. 5*3 -> 5
-            if ((tmp = dm_eval_pop_node(result)) == NULL)
-                return -24;
-
-            // Add subexpression node
-            if ((sub = dm_eval_add_node(result, OP_SUBEXPR)) == NULL)
-                return -3;
-
-            // Add popped node into subexpression
-            dm_eval_push_node(&(sub->subexpr), tmp);
-            
-            // Add this operator into subexpression
-            DMEvalNode *foo = dm_eval_add_node(&(sub->subexpr), node->op);
-            foo->ok = TRUE;
-
-            // Next node
-            node = node->next;
-            if (node == NULL)
-                return -72;
-
-            dm_eval_push_node(&(sub->subexpr), node);
-            break;
-
-        default:
-            if (dm_eval_push_node(result, node) == NULL)
-                return -32;
-            break;
+        }
+        else
+        if (dm_eval_push_node(result, node) == NULL)
+            return -32;
     }
 
     return 0;
@@ -987,7 +879,7 @@
         return res;
     }
 
-    res = dm_eval_reorder_pass1(ev, tmp1, &tmp2);
+    res = dm_eval_reorder_passN(ev, tmp1, &tmp2, OP_MUL, OP_DIV, OP_MOD);
     RO_DEBUG("PASS1: ", tmp2);
     dm_eval_free(tmp1);
     
@@ -997,7 +889,7 @@
         return res;
     }
 
-    res = dm_eval_reorder_pass2(ev, tmp2, &tmp3);
+    res = dm_eval_reorder_passN(ev, tmp2, &tmp3, OP_SUB, OP_ADD, -1);
     RO_DEBUG("PASS2: ", tmp3);
     dm_eval_free(tmp2);
     if (res != 0)
@@ -1006,7 +898,7 @@
         return res;
     }
 
-    res = dm_eval_reorder_pass3(ev, tmp3, result);
+    res = dm_eval_reorder_passN(ev, tmp3, result, OP_LSHIFT, OP_RSHIFT, -1);
     RO_DEBUG("PASS3: ", *result);
     dm_eval_free(tmp3);