From d59a8079c3eb2d520a9d9defe865655627a7221d Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Tue, 31 Jan 2023 15:37:56 +0100 Subject: [PATCH] add del feature --- calc.c | 2 +- parser.c | 116 ++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 78 insertions(+), 40 deletions(-) diff --git a/calc.c b/calc.c index e20b066..d5b0246 100644 --- a/calc.c +++ b/calc.c @@ -378,7 +378,7 @@ int main (int argc, char *argv[]) // test: echo -e 'mem (3)\nclr' | calc.exe -v 3 | grep -q Clear // test: echo -e 'prog (2, 2, {rcl (2) - rcl (1)})\nprog (1, 1, {cos (rcl (1)^2)})\ncall (1, pi/6)\nprog (2, 1, {rcl (1) * 3})\ncall (2, 1, 2)\nls' | calc.exe // test: echo -e 'prog (1, 2, {rcl (2) - rcl (1)})\ncall (1, 2, 3)\nls\nedit (1)\ndel (1)\nls' | calc.exe -v 3 |grep -q Program -// test: echo -e 'prog (2, 2, {rcl (2) - rcl (1)})\ncall (1, 2, 3)\nls\nedit (1)\ndel (1)\nls' | calc.exe | grep -c error | xargs test 1 = +// test: echo -e 'prog (2, 2, {rcl (2) - rcl (1)})\nprog (3, 1, cos(rcl (1) * pi / 3))\ncall (1, 2, 3)\nls\nedit (1)\ndel (1)\n\ndel (2)\ncall (2, 1, 4)' | calc.exe | grep -c error | xargs test 3 = // Gauss sequence // test: echo -e '{sto (1, 0), sto (10, 0), while (inc (10) < 100, {sto (1, rcl (1) + rcl (10)), print (rcl (1))})};' | calc.exe | grep -q '=> 5050' diff --git a/parser.c b/parser.c index 03ef985..4f50a0e 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")); @@ -797,41 +800,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 +842,55 @@ double call (int id, int nbops, element_t **ops) 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"); + fprintf (stdout, "programs:"); + for (i = 0; i < nb_programs; i++) { + fprintf (stdout, " %d", (programs + i)->id); } + fprintf (stdout, "\n"); } void edit (int id) { } 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); + } + + /* 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 */ -- 2.30.2