correct a memory leak
[calc.git] / parser.c
index 714ea87168fb069db17fb72c0393bbee9666a304..0359234f352fb4669805cd3162d7aa957784d0c4 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -675,12 +675,15 @@ double while_do (element_t *cond, element_t *action)
         VERBOSE (DEBUG, fprintf (stdout, "loop...\n"));
 
         temp = dupelement (cond);
-        if (!evaluate_element (temp, 0)) {
+        double test = evaluate_element (temp, 0);
+        delelement (temp);
+        if (!test) {
             break;
         }
         if (action) {
             temp = dupelement (action);
             ret = evaluate_element (temp, 0);
+            delelement (temp);
         }
     }
 
@@ -840,6 +843,7 @@ double call (int id, int nbops, element_t **ops)
     /* evaluate program */
     element_t *elements = dupelement ((programs + n)->root);
     ret = evaluate_element (elements, 0);
+    delelement (elements);
 
     /* restore context */
     answer = tmp.answer;
@@ -896,15 +900,16 @@ void savestring (int id, char *string)
             }
         }
     }
-    if (n == -1) {
-        VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
-        return;
-    }
 
-    /* save program */
-    if ((programs + n)->string) {
-        free ((programs + n)->string);
-    }
+    /* unnecesary code */
+    //if (n == -1) {
+    //    VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
+    //    return;
+    //}
+    //if ((programs + n)->string) {
+    //    free ((programs + n)->string);
+    //}
+
     (programs + n)->string = strdup (string);
 }
 
@@ -1209,7 +1214,7 @@ void free_completion_list (char **list)
     int i;
 
     if (list) {
-        for (i = 0; i < NB_FUNCTIONS + NB_CONSTANTS; i++) {
+        for (i = 0; i < NB_OPERATORS + NB_FUNCTIONS + NB_CONSTANTS + NB_SYMBOLS + 1; i++) {
             if (list[i] != NULL) {
                 free (list[i]);
             }