correct push
[calc.git] / program.c
index 97f99293114bd95b76ac4601d62c4b5645fd1a4f..18a9719d3a318be6819dd5483f5f4a5a92e4cd30 100644 (file)
--- a/program.c
+++ b/program.c
@@ -1,7 +1,9 @@
 #include <malloc.h>
+#include <stdio.h>
 #include <string.h>
 
 #include "alloc.h"
+#include "argument.h"
 #include "debug.h"
 #include "parser.h"
 #include "stack.h"
@@ -12,9 +14,6 @@
 
 /* global variables */
 
-int argument_size = 0;
-double *argument = NULL;
-
 workspace_t *programs = NULL;
 int nb_programs = 0;
 
@@ -52,7 +51,7 @@ void prog (int id, element_t *root)
 
             /* clean old program */
             if ((programs + n)->storage) {
-                free ((programs + n)->storage);
+                free_tab ((programs + n)->storage);
             }
             if ((programs + n)->stack) {
                 free_tab ((programs + n)->stack);
@@ -71,26 +70,14 @@ void prog (int id, element_t *root)
     (programs + n)->id = id;
     (programs + n)->answer = 0;
     (programs + n)->storage = NULL;
-    (programs + n)->storage_size = 0;
     (programs + n)->stack = NULL;
     (programs + n)->root = dupelement (root);
 }
 
-double arg (int id)
-{
-    double ret = 0;
-    if ((id <= 0) || (id > argument_size)) {
-        VERBOSE (WARNING, fprintf (stdout, "error out of bound (%d/%d)\n", id, argument_size));
-    } else {
-        ret = argument[id - 1];
-    }
-    return ret;
-}
-
 double call (int id, int nbargs, element_t **args)
 {
     workspace_t tmp = {0};
-    int i, l, n = -1;
+    int i, n = -1;
     double ret = 0;
 
     if (programs) {
@@ -111,46 +98,35 @@ double call (int id, int nbargs, element_t **args)
     /* store context */
     tmp.answer = answer;
     tmp.argument = argument;
-    tmp.argument_size = argument_size;
-    tmp.storage = storage;
-    tmp.storage_size = storage_size;
     tmp.stack = stack;
+    tmp.storage = storage;
 
     /* change context */
     answer = 0;
-    storage = (programs + n)->storage;
-    storage_size = (programs + n)->storage_size;
     argument = NULL;
-    argument_size = 0;
-    stack = (programs + n)->stack;
     if (nbargs > 0) {
-        argument = (double *) callocordie (nbargs, sizeof (double));
-        for (i = 0, l = 0; i < nbargs; l++) {
-            if (args[l]) {
-                argument[i++] = evaluate_element (args[l], 0);
-            }
-        }
-        argument_size = nbargs;
+        def (nbargs, args);
     }
+    stack = (programs + n)->stack;
+    storage = (programs + n)->storage;
 
     /* evaluate program */
     element_t *elements = dupelement ((programs + n)->root);
     ret = evaluate_element (elements, 0);
     delelement (elements);
+
+    /* cleaning context */
     (programs + n)->answer = answer;
-    (programs + n)->storage = storage;
-    (programs + n)->storage_size = storage_size;
     if (argument) {
-        free (argument);
+        free_tab (argument);
     }
     (programs + n)->stack = stack;
+    (programs + n)->storage = storage;
 
     /* restore context */
     answer = tmp.answer;
-    storage = tmp.storage;
-    storage_size = tmp.storage_size;
     argument = tmp.argument;
-    argument_size = tmp.argument_size;
+    storage = tmp.storage;
     stack = tmp.stack;
 
     return ret;
@@ -239,7 +215,7 @@ void del (int id)
 
     /* clean program */
     if ((programs + n)->storage) {
-        free ((programs + n)->storage);
+        free_tab ((programs + n)->storage);
     }
     if ((programs + n)->stack) {
         free_tab ((programs + n)->stack);