changeset 704:3d9e7c5c4046

Fix bitshift << >> operator precedence reordering.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Apr 2013 22:01:16 +0300
parents fae0900fc9e9
children 39c03b7dd853
files dmeval.c
diffstat 1 files changed, 24 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/dmeval.c	Tue Apr 16 21:42:28 2013 +0300
+++ b/dmeval.c	Tue Apr 16 22:01:16 2013 +0300
@@ -919,32 +919,44 @@
     DMEvalNode *tmp, *sub;
     int res;
 
-    while (node != NULL)
+    for (; node != NULL; node = node->next)
     switch (node->op)
     {
         case OP_LSHIFT:
         case OP_RSHIFT:
-            // Bitshift operator precedence is .. different
-            if (dm_eval_push_node(result, node) == NULL)
-                return -32;
-            
+            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;
 
-            if (node->next == NULL)
-                return -14;
+            // 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;
 
-            if ((res = dm_eval_reorder_pass3(ev, node->next, &(sub->subexpr))) != 0)
-                return res;
+            // Next node
+            node = node->next;
+            if (node == NULL)
+                return -72;
 
-            node = NULL;
+            dm_eval_push_node(&(sub->subexpr), node);
             break;
 
         default:
             if (dm_eval_push_node(result, node) == NULL)
                 return -32;
-
-            node = node->next;
             break;
     }