X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=parser.c;h=0359234f352fb4669805cd3162d7aa957784d0c4;hb=523841a1e0785a34286154a46319d9bd435bd8d7;hp=b3f370d0c059f6715fdf0b7141027809ec643f3e;hpb=2e34899a2fff5d5a6414b8f6a0a2c7c207c35923;p=calc.git diff --git a/parser.c b/parser.c index b3f370d..0359234 100644 --- a/parser.c +++ b/parser.c @@ -206,6 +206,7 @@ element_t *subparser (element_t **proot, char **pstr, func_t func, int nbops, in element_t *parser (char *str, char **next, int prio) { element_t *root = NULL; + char *string = str; int i; VERBOSE (DEBUG, fprintf (stdout, "Starting parsing\n")); @@ -478,6 +479,11 @@ element_t *parser (char *str, char **next, int prio) *next = str; } + /* save string */ + if (root != NULL) { + root->string = string; + } + return root; } @@ -669,12 +675,15 @@ double while_do (element_t *cond, element_t *action) VERBOSE (DEBUG, fprintf (stdout, "loop...\n")); temp = dupelement (cond); - if (!evaluate_element (temp, 0)) { + double test = evaluate_element (temp, 0); + delelement (temp); + if (!test) { break; } if (action) { temp = dupelement (action); ret = evaluate_element (temp, 0); + delelement (temp); } } @@ -776,6 +785,7 @@ void prog (int id, int nbmems, element_t *root) } if ((programs + n)->string) { free ((programs + n)->string); + (programs + n)->string = NULL; } } } @@ -833,6 +843,7 @@ double call (int id, int nbops, element_t **ops) /* evaluate program */ element_t *elements = dupelement ((programs + n)->root); ret = evaluate_element (elements, 0); + delelement (elements); /* restore context */ answer = tmp.answer; @@ -872,11 +883,10 @@ void edit (int id) } /* set string program */ - //rl_insert_text ((programs + n)->string); - VERBOSE (INFO, fprintf (stdout, "edit: %s\n", (programs + n)->string)); + fprintf (stdout, "edit: %s\n", (programs + n)->string); } -void save_string (int id, char *string) +void savestring (int id, char *string) { int i, n = -1; @@ -890,15 +900,16 @@ void save_string (int id, char *string) } } } - if (n == -1) { - VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); - return; - } - /* save program */ - if ((programs + n)->string) { - free ((programs + n)->string); - } + /* unnecesary code */ + //if (n == -1) { + // VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); + // return; + //} + //if ((programs + n)->string) { + // free ((programs + n)->string); + //} + (programs + n)->string = strdup (string); } @@ -1138,7 +1149,10 @@ double evaluate_element (element_t *root, char mask) case While: return while_do (root->ops[0], root->ops[1]); case Code: return execute_code (root->ops, root->nbops); case Print: return print (op0); - case Prog: prog ((int)op0, (int)op1, root->ops[2]); break; + case Prog: + prog ((int)op0, (int)op1, root->ops[2]); + savestring ((int)op0, root->string); + break; case Call: for (i = 1, nb =0; i < root->nbops; i++) { if (root->ops[i]) { @@ -1200,7 +1214,7 @@ void free_completion_list (char **list) int i; if (list) { - for (i = 0; i < NB_FUNCTIONS + NB_CONSTANTS; i++) { + for (i = 0; i < NB_OPERATORS + NB_FUNCTIONS + NB_CONSTANTS + NB_SYMBOLS + 1; i++) { if (list[i] != NULL) { free (list[i]); }