correct push
[calc.git] / program.c
index c5b8231929394303669b5cab32b27b3b75830897..18a9719d3a318be6819dd5483f5f4a5a92e4cd30 100644 (file)
--- a/program.c
+++ b/program.c
@@ -3,18 +3,17 @@
 #include <string.h>
 
 #include "alloc.h"
+#include "argument.h"
 #include "debug.h"
 #include "parser.h"
 #include "stack.h"
 #include "storage.h"
+#include "tabular.h"
 
 #include "program.h"
 
 /* global variables */
 
-int argument_size = 0;
-double *argument = NULL;
-
 workspace_t *programs = NULL;
 int nb_programs = 0;
 
@@ -52,10 +51,10 @@ 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 ((programs + n)->stack);
+                free_tab ((programs + n)->stack);
             }
             if ((programs + n)->root) {
                 delelement ((programs + n)->root);
@@ -71,27 +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)->stack_size = 0;
     (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) {
@@ -112,51 +98,36 @@ 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.stack_size = stack_size;
+    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;
-    stack_size = (programs + n)->stack_size;
     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)->stack_size = stack_size;
+    (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;
-    stack_size = tmp.stack_size;
 
     return ret;
 }
@@ -244,10 +215,10 @@ void del (int id)
 
     /* clean program */
     if ((programs + n)->storage) {
-        free ((programs + n)->storage);
+        free_tab ((programs + n)->storage);
     }
     if ((programs + n)->stack) {
-        free ((programs + n)->stack);
+        free_tab ((programs + n)->stack);
     }
     if ((programs + n)->root) {
         delelement ((programs + n)->root);