# HG changeset patch # User Matti Hamalainen # Date 1366138876 -10800 # Node ID 3d9e7c5c404694467a0b4d678658733ecd280cee # Parent fae0900fc9e971be91b09e9f12d5f4e98b710f8f Fix bitshift << >> operator precedence reordering. diff -r fae0900fc9e9 -r 3d9e7c5c4046 dmeval.c --- 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; }