changeset 697:48321a711bec

Work towards plugging memory leaks.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Apr 2013 20:56:40 +0300
parents de664bfc7509
children e0829d794f46
files dmeval.c
diffstat 1 files changed, 48 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }