From 05aabb97dcdb2a87f0ddebe5a32391101da318eb Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Tue, 31 Jan 2023 00:38:39 +0100 Subject: [PATCH] buggy commit --- parser.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++----- parser.h | 3 +- 2 files changed, 116 insertions(+), 11 deletions(-) diff --git a/parser.c b/parser.c index 395e2ae..09a6935 100644 --- a/parser.c +++ b/parser.c @@ -22,6 +22,7 @@ char *format = NULL; char *minform = NULL; workspace_t *programs = NULL; +int nb_programs = 0; /* compare codes */ @@ -233,7 +234,7 @@ element_t *parser (char *str, char **next, int prio) return ERROR_OP; } element_t **prog = NULL; - new = newelement (Prog, 0, 5); + new = newelement (Code, 0, 5); root = new; prog = &root; @@ -247,7 +248,7 @@ element_t *parser (char *str, char **next, int prio) delelement (root); return ERROR_OP; } - element_t *newprog = newelement (Prog, (*prog)->nbops + 1, 5); + element_t *newprog = newelement (Code, (*prog)->nbops + 1, 5); for (i = 0; i < (*prog)->nbops; i++) { newprog->ops[i] = (*prog)->ops[i]; (*prog)->ops[i] = NULL; @@ -532,7 +533,7 @@ void print_element (element_t *root, int level) case Not: func = "Not"; break; case Cond: func = "Condition"; break; case While: func = "While"; break; - case Prog: func = "Program"; break; + case Code: func = "Code"; break; case Print: func = "Print"; break; case Prog: func = "Program"; break; case Call: func = "Call"; break; @@ -681,7 +682,7 @@ double while_do (element_t *cond, element_t *action) /* program function */ -double program_do (element_t **prog, int nbcalls) +double execute_code (element_t **prog, int nbcalls) { double ret = 0; int i; @@ -734,15 +735,118 @@ void quit (void) /* program function */ void prog (int id, int nbmems, element_t *root) -{ } +{ + int i, n = -1; + + if (programs == NULL) { + + /* initial memory allocation */ + programs = (workspace_t *) calloc (1, sizeof (workspace_t)); + if (programs == NULL) { + VERBOSE (ERROR, fprintf (stderr, "can't allocate memory\n")); + exit (1); + } + nb_programs = 1; + n = 0; + + } else { + + /* look for existing program */ + for (i = 0; i < nb_programs; i++) { + if ((programs + i)->id == id) { + n = i; + break; + } + } + if (n == -1) { + + /* new program */ + n = nb_programs++; + programs = (workspace_t *) realloc (programs, nb_programs * sizeof (workspace_t)); + } else { + + /* clean old program */ + if ((programs + n)->storage) { + free ((programs + n)->storage); + } + if ((programs + n)->root) { + delelement ((programs + n)->root); + } + } + } + + /* set program */ + (programs + n)->id = id; + (programs + n)->answer = 0; + (programs + n)->storage = (double *) calloc (nbmems, sizeof (double)); + if ((programs + n)->storage == NULL) { + VERBOSE (ERROR, fprintf (stderr, "can't allocate memory\n")); + exit (1); + } + (programs + n)->storage_size = nbmems; + (programs + n)->root = root; +} double call (int id, int nbobs, element_t **ops) { - return 0; + workspace_t tmp = {0}; + int i, n = -1; + double ret = 0; + + if (programs) { + for (i = 0; i < nb_programs; i++) { + if ((programs + i)->id == i) { + n = i; + break; + } + } + + 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 + i)->storage; + storage_size = (programs + i)->storage_size; + if (nbobs > storage_size) { + storage = realloc (storage, nbobs * sizeof (double)); + storage_size = nbobs; + } + for (i = 0; i < nbobs; i++) { + store (i + 1, evaluate_element (ops[i], 0)); + } + + /* evaluate program */ + element_t *element = dupelement ((programs + n)->root); + ret = evaluate_element (element, 0); + + /* restore context */ + answer = tmp.answer; + storage = tmp.storage; + storage_size = tmp.storage_size; + } + + return ret; } void list () -{ } +{ + int i; + if (programs != NULL) { + fprintf (stdout, "programs:"); + for (i = 0; i < nb_programs; i++) { + fprintf (stdout, " %d", (programs + i)->id); + } + fprintf (stdout, "\n"); + } +} void edit (int id) { } @@ -876,7 +980,7 @@ double evaluate_element (element_t *root, char mask) case Ans: case Pi: case E: - case Prog: + case Code: break; case While: if (root->ops[0] == NULL) { @@ -940,13 +1044,13 @@ double evaluate_element (element_t *root, char mask) return 0; } case While: return while_do (root->ops[0], root->ops[1]); - case Prog: return program_do (root->ops, root->nbops); + 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 Call: return call ((int)op0, root->nbops + 1, root->ops + 1); case List: list (); break; case Edit: edit ((int)op0); break; - case Del: del (int (op0)); break; + case Del: del ((int)op0); break; } return 0; diff --git a/parser.h b/parser.h index 4907c67..8307c88 100644 --- a/parser.h +++ b/parser.h @@ -20,7 +20,7 @@ typedef enum { Ans, E, Pi, Equal, Diff, Ge, Le, Gt, Lt, And, Or, Not, - Cond, While, Prog, Print, + Cond, While, Code, Print, Prog, Call, List, Edit, Del } func_t; @@ -53,6 +53,7 @@ typedef struct _workspace_t { int id; double answer; double *storage; + int storage_size; element_t *root; } workspace_t; -- 2.30.2