fix some tests
[calc.git] / program.c
index dc433aa57ec969f2111aae27f46c526e325cdf73..b93a90cb299538f1dc0b79b0ae2223baba7c6021 100644 (file)
--- a/program.c
+++ b/program.c
@@ -73,8 +73,11 @@ void prog (int id, element_t *root)
 
 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) {
@@ -82,47 +85,63 @@ double call (int id, int nbargs, element_t **args)
         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 */
-    free_tab (argument);
-    argument = NULL;
-
     /* 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));
@@ -130,7 +149,11 @@ void edit (int 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)