# HG changeset patch # User Matti Hamalainen # Date 1366135000 -10800 # Node ID 48321a711bec1744019783dae53451b10d3bbc92 # Parent de664bfc750914d3689844ee06e98c0587d9765b Work towards plugging memory leaks. diff -r de664bfc7509 -r 48321a711bec dmeval.c --- a/dmeval.c Tue Apr 16 20:31:32 2013 +0300 +++ b/dmeval.c Tue Apr 16 20:56:40 2013 +0300 @@ -511,12 +511,13 @@ if ((node = dm_eval_add_node(list, OP_CONST)) == NULL) { dm_set_mode(ev, PARSE_ERROR); - break; } - - node->val = atof(tmpStr); - dm_set_mode(ev, PARSE_START); - ev->expect = PARSE_OPER | PARSE_END; + else + { + node->val = atof(tmpStr); + dm_set_mode(ev, PARSE_START); + ev->expect = PARSE_OPER | PARSE_END; + } } } break; @@ -755,7 +756,6 @@ static int dm_eval_reorder_pass0(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result) { - DMEvalNode *list = NULL; DMEvalNode *tmp, *sub; int i, res; @@ -763,10 +763,10 @@ switch (node->op) { case OP_SUB: - if ((tmp = dm_eval_peek_node(&list)) == NULL || tmp->op <= OP_FUNC) + if ((tmp = dm_eval_peek_node(result)) == NULL || tmp->op <= OP_FUNC) { // Add subexpression node - if ((sub = dm_eval_add_node(&list, OP_SUBEXPR)) == NULL) + if ((sub = dm_eval_add_node(result, OP_SUBEXPR)) == NULL) return -3; // Add this operator into subexpression @@ -780,13 +780,13 @@ dm_eval_push_node(&(sub->subexpr), node); } else - if (dm_eval_push_node(&list, node) == NULL) + if (dm_eval_push_node(result, node) == NULL) return -32; break; case OP_FUNC: - if ((tmp = dm_eval_push_node(&list, node)) == NULL) + if ((tmp = dm_eval_push_node(result, node)) == NULL) return -1; for (i = 0; i < node->id->nargs; i++) @@ -797,7 +797,7 @@ break; case OP_SUBEXPR: - if ((tmp = dm_eval_push_node(&list, node)) == NULL) + if ((tmp = dm_eval_push_node(result, node)) == NULL) return -1; if ((res = dm_eval_reorder(ev, node->subexpr, &(tmp->subexpr))) != 0) @@ -805,19 +805,17 @@ break; default: - if (dm_eval_push_node(&list, node) == NULL) + if (dm_eval_push_node(result, node) == NULL) return -32; break; } - *result = list; return 0; } static int dm_eval_reorder_pass1(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result) { - DMEvalNode *list = NULL; DMEvalNode *tmp, *sub; for (; node != NULL; node = node->next) @@ -828,17 +826,17 @@ case OP_MOD: if (node->ok) { - if (dm_eval_push_node(&list, node) == NULL) + 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(&list)) == NULL) + if ((tmp = dm_eval_pop_node(result)) == NULL) return -24; // Add subexpression node - if ((sub = dm_eval_add_node(&list, OP_SUBEXPR)) == NULL) + if ((sub = dm_eval_add_node(result, OP_SUBEXPR)) == NULL) return -3; // Add popped node into subexpression @@ -857,18 +855,16 @@ break; default: - if (dm_eval_push_node(&list, node) == NULL) + if (dm_eval_push_node(result, node) == NULL) return -32; break; } - *result = list; return 0; } static int dm_eval_reorder_pass2(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result) { - DMEvalNode *list = NULL; DMEvalNode *tmp, *sub; for (; node != NULL; node = node->next) @@ -878,17 +874,17 @@ case OP_ADD: if (node->ok) { - if (dm_eval_push_node(&list, node) == NULL) + 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(&list)) == NULL) + if ((tmp = dm_eval_pop_node(result)) == NULL) return -24; // Add subexpression node - if ((sub = dm_eval_add_node(&list, OP_SUBEXPR)) == NULL) + if ((sub = dm_eval_add_node(result, OP_SUBEXPR)) == NULL) return -3; // Add popped node into subexpression @@ -907,19 +903,17 @@ break; default: - if (dm_eval_push_node(&list, node) == NULL) + if (dm_eval_push_node(result, node) == NULL) return -32; break; } - *result = list; return 0; } static int dm_eval_reorder_pass3(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result) { - DMEvalNode *list = NULL; DMEvalNode *tmp, *sub; int res; @@ -929,33 +923,29 @@ case OP_LSHIFT: case OP_RSHIFT: // Bitshift operator precedence is .. different - if (dm_eval_push_node(&list, node) == NULL) + if (dm_eval_push_node(result, node) == NULL) return -32; - if ((sub = dm_eval_add_node(&list, OP_SUBEXPR)) == NULL) + if ((sub = dm_eval_add_node(result, OP_SUBEXPR)) == NULL) return -3; - node = node->next; - if (node == NULL) + if (node->next == NULL) return -14; - tmp = NULL; - if ((res = dm_eval_reorder(ev, node, &tmp)) != 0) + if ((res = dm_eval_reorder_pass3(ev, node->next, &(sub->subexpr))) != 0) return res; - sub->subexpr = tmp; node = NULL; break; default: - if (dm_eval_push_node(&list, node) == NULL) + if (dm_eval_push_node(result, node) == NULL) return -32; node = node->next; break; } - *result = list; return 0; } @@ -965,16 +955,35 @@ DMEvalNode *tmp1 = NULL, *tmp2 = NULL, *tmp3 = NULL; int res; - if ((res = dm_eval_reorder_pass0(ev, node, &tmp1)) != 0) + res = dm_eval_reorder_pass0(ev, node, &tmp1); + + if (res != 0) + { + dm_eval_free(tmp1); return res; + } - if ((res = dm_eval_reorder_pass1(ev, tmp1, &tmp2)) != 0) + res = dm_eval_reorder_pass1(ev, tmp1, &tmp2); + dm_eval_free(tmp1); + + if (res != 0) + { + dm_eval_free(tmp2); return res; + } - if ((res = dm_eval_reorder_pass2(ev, tmp2, &tmp3)) != 0) + res = dm_eval_reorder_pass2(ev, tmp2, &tmp3); + dm_eval_free(tmp2); + if (res != 0) + { + dm_eval_free(tmp3); return res; + } - return dm_eval_reorder_pass3(ev, tmp3, result); + res = dm_eval_reorder_pass3(ev, tmp3, result); + dm_eval_free(tmp3); + + return res; }