add del feature
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Tue, 31 Jan 2023 14:37:56 +0000 (15:37 +0100)
committerLaurent Mazet <laurent.mazet@thalesgroup.com>
Tue, 31 Jan 2023 14:37:56 +0000 (15:37 +0100)
calc.c
parser.c

diff --git a/calc.c b/calc.c
index e20b066dcd3b4538204f8feebfe22a9b01e06f88..d5b02468f9dd2b66bc6f9ca906094d22e0d5841d 100644 (file)
--- 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'
index 03ef985f49b892aca4b906e8ee15d85f8ad31c8e..4f50a0e8b7703571cb52b6a0bddb32aabc16b290 100644 (file)
--- 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 */