#include <string.h>
#include "alloc.h"
+#include "argument.h"
#include "debug.h"
#include "parser.h"
#include "stack.h"
/* global variables */
-int argument_size = 0;
-double *argument = NULL;
-
workspace_t *programs = NULL;
int nb_programs = 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) {
/* store context */
tmp.answer = answer;
tmp.argument = argument;
- tmp.argument_size = argument_size;
- tmp.storage = storage;
tmp.stack = stack;
+ tmp.storage = storage;
/* change context */
answer = 0;
- storage = (programs + n)->storage;
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;
if (argument) {
- free (argument);
+ free_tab (argument);
}
(programs + n)->stack = stack;
+ (programs + n)->storage = storage;
/* restore context */
answer = tmp.answer;
- storage = tmp.storage;
argument = tmp.argument;
- argument_size = tmp.argument_size;
+ storage = tmp.storage;
stack = tmp.stack;
return ret;