double call (int id, int nbargs, element_t **args)
{
+ int i;
double ret = 0;
+ VERBOSE (DEBUG, fprintf (stdout, "new call (%d)\n", id));
+
/* look for program */
int n = lookfor_program (id);
if (n == -1) {
return 0;
}
+ /* display debug information */
+ VERBOSE (DEBUG, fprintf (stdout, "nbargs: %d\n", nbargs));
+ for (i = 0; i < nbargs; i++) {
+ VERBOSE (DEBUG, fprintf (stdout, "argument %d\n", i + 1); print_element (args[i], 0));
+ }
+ VERBOSE (DEBUG, fprintf (stdout, "program\n"); print_element (programs[n]->root, 0));
+
/* backup context */
workspace_t *tmp = backup_ws (alloc_ws ());
restore_ws (programs[n]);
-
+
/* set arguments */
- free_tab (argument);
- argument = NULL;
- if (nbargs > 0) {
- def (nbargs, args);
+ VERBOSE (DEBUG, fprintf (stdout, "argument before evaluation (%d)\n", size_tab (argument)));
+ for (i = 0; i < size_tab (argument); i++) {
+ VERBOSE (DEBUG, fprintf (stdout, "arg %d value: %g\n", i + 1, get_tab (argument, i + 1)));
+ }
+ VERBOSE (DEBUG, fprintf (stdout, "evaluate %d args\n", nbargs));
+ tab_t *new_argument = def (nbargs, args);
+ tab_t *old_argument = argument;
+ argument = new_argument;
+ VERBOSE (DEBUG, fprintf (stdout, "argument after evaluation (%d)\n", size_tab (argument)));
+ for (i = 0; i < size_tab (argument); i++) {
+ VERBOSE (DEBUG, fprintf (stdout, "arg %d value: %g\n", i + 1, get_tab (argument, i + 1)));
}
/* evaluate program */
answer = 0;
element_t *elements = dupelement (programs[n]->root);
ret = evaluate_element (elements, 0);
+ VERBOSE (DEBUG, fprintf (stdout, "ret; %g\n", ret));
delelement (elements);
- /* clean arguments */
- if (argument) {
- free_tab (argument);
- }
- argument = NULL;
- if (nbargs > 0) {
- def (nbargs, args);
- }
-
/* restore context */
backup_ws (programs[n]);
restore_ws (tmp);
+ free_ws (tmp);
+
+ /* clean arguments */
+ free_tab (argument);
+ argument = old_argument;
return ret;
}
void list ()
{
int i;
- fprintf (stdout, "programs:");
+ printf ("programs:");
for (i = 0; i < nb_programs; i++) {
- fprintf (stdout, " %d", programs[i]->id);
+ printf (" %d", programs[i]->id);
}
- fprintf (stdout, "\n");
+ printf ("\n");
}
void edit (int id)
{
+ extern char *edit_line;
int n = lookfor_program (id);
if (n == -1) {
VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id));
}
/* set string program */
- fprintf (stdout, "edit: %s\n", programs[n]->string);
+ if (edit_line) {
+ free (edit_line);
+ }
+ edit_line = strdup (programs[n]->string);
+ //printf ("edit: %s\n", programs[n]->string);
}
void savestring (int id, char *string)