Mercurial > hg > dmlib
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);