X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=program.c;h=18a9719d3a318be6819dd5483f5f4a5a92e4cd30;hb=24724cdc5ea25aae7c110f60a74a671aed86761c;hp=c5b8231929394303669b5cab32b27b3b75830897;hpb=7059478fd3b758df4177b9b409bfa927cb959937;p=calc.git diff --git a/program.c b/program.c index c5b8231..18a9719 100644 --- a/program.c +++ b/program.c @@ -3,18 +3,17 @@ #include #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);