X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=parser.c;h=2e83a4f451f74a766e1b70e2b3c2f3567eafdf50;hb=3d3e6770191a1eb48cf66898397a1a6e31b7cb89;hp=03ef985f49b892aca4b906e8ee15d85f8ad31c8e;hpb=6f14d1cc45dd4018686c330c13dfcdac95fa68ce;p=calc.git diff --git a/parser.c b/parser.c index 03ef985..2e83a4f 100644 --- a/parser.c +++ b/parser.c @@ -50,6 +50,9 @@ int codecmp (char *ref, char *str) void *callocordie (size_t count, size_t size) { + if (count * size == 0) { + return NULL; + } void *new = calloc (count, size); if (new == NULL) { VERBOSE (ERROR, fprintf (stderr, "can't allocate memory\n")); @@ -203,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")); @@ -475,6 +479,11 @@ element_t *parser (char *str, char **next, int prio) *next = str; } + /* save string */ + if (root != NULL) { + root->string = string; + } + return root; } @@ -771,6 +780,10 @@ void prog (int id, int nbmems, element_t *root) if ((programs + n)->root) { delelement ((programs + n)->root); } + if ((programs + n)->string) { + free ((programs + n)->string); + (programs + n)->string = NULL; + } } } @@ -797,41 +810,41 @@ double call (int id, int nbops, element_t **ops) break; } } - if (n == -1) { - VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); - return 0; - } + } + if (n == -1) { + VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); + return 0; + } - /* store context */ - tmp.answer = answer; - tmp.storage = storage; - tmp.storage_size = storage_size; - - /* change context */ - answer = 0; - storage = (programs + n)->storage; - storage_size = (programs + n)->storage_size; - if (nbops > storage_size) { - double *tmp = (double *) callocordie (nbops, sizeof (double)); - memcpy (tmp, storage, storage_size * sizeof (double)); - free (storage); - storage = tmp; - storage_size = nbops; - } - for (i = 0; i < nbops; i++) { - double val = evaluate_element (ops[i], 0); - store (i + 1, val); - } + /* store context */ + tmp.answer = answer; + tmp.storage = storage; + tmp.storage_size = storage_size; + + /* change context */ + answer = 0; + storage = (programs + n)->storage; + storage_size = (programs + n)->storage_size; + if (nbops > storage_size) { + double *tmp = (double *) callocordie (nbops, sizeof (double)); + memcpy (tmp, storage, storage_size * sizeof (double)); + free (storage); + storage = tmp; + storage_size = nbops; + } + for (i = 0; i < nbops; i++) { + double val = evaluate_element (ops[i], 0); + store (i + 1, val); + } - /* evaluate program */ - element_t *elements = dupelement ((programs + n)->root); - ret = evaluate_element (elements, 0); + /* evaluate program */ + element_t *elements = dupelement ((programs + n)->root); + ret = evaluate_element (elements, 0); - /* restore context */ - answer = tmp.answer; - storage = tmp.storage; - storage_size = tmp.storage_size; - } + /* restore context */ + answer = tmp.answer; + storage = tmp.storage; + storage_size = tmp.storage_size; return ret; } @@ -839,20 +852,105 @@ double call (int id, int nbops, element_t **ops) void list () { int i; - if (programs != NULL) { - fprintf (stdout, "programs:"); + fprintf (stdout, "programs:"); + for (i = 0; i < nb_programs; i++) { + fprintf (stdout, " %d", (programs + i)->id); + } + fprintf (stdout, "\n"); +} + +void edit (int id) +{ + int i, n = -1; + + if (programs) { + + /* look for program */ for (i = 0; i < nb_programs; i++) { - fprintf (stdout, " %d", (programs + i)->id); + if ((programs + i)->id == id) { + n = i; + break; + } } - fprintf (stdout, "\n"); } + if (n == -1) { + VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); + return; + } + + /* set string program */ + fprintf (stdout, "edit: %s\n", (programs + n)->string); } -void edit (int id) -{ } +void savestring (int id, char *string) +{ + int i, n = -1; + + if (programs) { + + /* look for program */ + for (i = 0; i < nb_programs; i++) { + if ((programs + i)->id == id) { + n = i; + break; + } + } + } + + /* 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); +} void del (int id) -{ } +{ + int i, j, n = -1; + + if (programs) { + + /* look for program */ + for (i = 0; i < nb_programs; i++) { + if ((programs + i)->id == id) { + n = i; + break; + } + } + } + if (n == -1) { + VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); + return; + } + + /* clean program */ + if ((programs + n)->storage) { + free ((programs + n)->storage); + } + if ((programs + n)->root) { + delelement ((programs + n)->root); + } + if ((programs + n)->string) { + free ((programs + n)->string); + } + + /* remove entry */ + workspace_t *tmp = (workspace_t *) callocordie (nb_programs - 1, sizeof (workspace_t)); + for (i = 0, j = 0; i < nb_programs; i++) { + if (i != n) { + memcpy (tmp + j, programs + i, sizeof (workspace_t)); + j++; + } + } + free (programs); + programs = tmp; + nb_programs--; +} /* help message */ @@ -1047,7 +1145,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]) { @@ -1109,7 +1210,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]); }