mem without argument returns size
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Tue, 7 Feb 2023 15:34:09 +0000 (16:34 +0100)
committerLaurent Mazet <laurent.mazet@thalesgroup.com>
Tue, 7 Feb 2023 15:34:09 +0000 (16:34 +0100)
calc.c
parser.c
parser.h

diff --git a/calc.c b/calc.c
index 97b21595e79a335e978ce368b1b442bd231fbdb9..0d5e8eafa92c2d8737db154356457c43a62f166b 100644 (file)
--- a/calc.c
+++ b/calc.c
@@ -370,7 +370,7 @@ int main (int argc, char *argv[])
 // test: echo -e 'si\t\t (pi / 2)' | calc.exe | grep -q '=> 1'
 // test: echo -e '\t\t' | calc.exe | grep -q 'print'
 // test: echo -e '1 + 1;\nans + 1' | calc.exe | grep -qv 2
-// test: echo -e 'mem (3)\nsto (4, pi)' | calc.exe | grep -q "invalid index"
+// test: echo -e 'mem\nmem (3)\nsto (4, pi)' | calc.exe | grep -q "invalid index"
 // test: echo -e 'sto (2, 3)\nmem (2)\ndisp' | calc.exe | grep -q 'storage: 0 3$'
 // test: echo -e 'disp' | calc.exe | grep -q "storage: 0 0 0 0 0 0 0 0 0 0"
 // test: echo -e 'sto (3, 10)\ndisp' | calc.exe | grep -q "storage: 0 0 10 0 0 0 0 0 0 0"
index 223b173bafd76faf34ba7ac0eca01f7b438d1965..f566fbe4dd905384f7d5e8ca96516e274f034d79 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -160,7 +160,7 @@ keyword_t functions[NB_FUNCTIONS] = {
     { "inc",  Inc, 1, 3, 5},
     { "dec",  Dec, 1, 3, 5},
     { "disp", Disp, 0, 4, 9},
-    { "mem",  Mem, 1, 3, 5},
+    { "mem",  Memory, 1, 3, 5},
     { "clr",  Clear, 0, 3, 9},
     { "quit", Quit, 0, 4, 9},
     { "help", Help, 0, 4, 9},
@@ -556,7 +556,7 @@ void print_element (element_t *root, int level)
     case Inc: func = "Increase"; break;
     case Dec: func = "Decrease"; break;
     case Disp: func = "Display"; break;
-    case Mem: func = "Memory"; break;
+    case Memory: func = "Memory"; break;
     case Clear: func = "Clear"; break;
     case Quit: func = "Quit"; break;
     case Help: func = "Help"; break;
@@ -615,11 +615,11 @@ void print_element (element_t *root, int level)
 
 /* storage functions */
 
-void memory (int nb)
+int memory (int nb)
 {
     int i, l;
     double *tmp = NULL;
-    if (nb != storage_size) {
+    if ((nb != -1) && (nb != storage_size)) {
         l = (nb < storage_size) ? nb : storage_size;
         tmp = (double *) callocordie (nb, sizeof (double));
         for (i = 0; i < l; i++) {
@@ -631,6 +631,10 @@ void memory (int nb)
         storage = tmp;
         storage_size = nb;
     }
+    if (storage_size == -1) {
+        memory (DEFAULT_STORAGE_SIZE);
+    }
+    return storage_size;
 }
 
 double store (int index, double value)
@@ -1345,7 +1349,6 @@ double evaluate_element (element_t *root, char mask)
     case Div:
     case Mod:
     case Pow:
-    case Store:
     case Equal:
     case Diff:
     case Ge:
@@ -1356,7 +1359,7 @@ double evaluate_element (element_t *root, char mask)
     case Or:
         if (root->ops[1]) {
             op1 = evaluate_element (root->ops[1], nextmask);
-        } else if (root->func != Store) {
+        } else {
             VERBOSE (WARNING, fprintf (stdout, "error while evaluating (op[1])\n"));
             return 0;
         }
@@ -1380,7 +1383,6 @@ double evaluate_element (element_t *root, char mask)
     case Inc:
     case Dec:
     case Not:
-    case Mem:
     case Cond:
     case Prog:
     case Arg:
@@ -1419,10 +1421,22 @@ double evaluate_element (element_t *root, char mask)
             return 0;
         }
         break;
+    case Memory:
+        if (root->ops[0] == NULL) {
+            op0 = -1;
+        } else {
+            op0 = (int)evaluate_element (root->ops[0], 0);
+            if (op0 < 0) {
+                VERBOSE (WARNING, fprintf (stdout, "error incorrect memory size (%d)\n", (int)op0));
+                return 0;
+            }
+        }
+        break;
     case Push:
     case Print:
         op0 = (root->ops[0]) ? evaluate_element (root->ops[0], 0) : answer;
         break;
+    case Store:
     case Put:
         if (root->ops[0]) {
             op0 = evaluate_element (root->ops[0], 0);
@@ -1466,12 +1480,12 @@ double evaluate_element (element_t *root, char mask)
     case Abs: return fabs (op0);
     case Ceil: return ceil (op0);
     case Floor: return floor (op0);
-    case Store: return store ((int)op0, (op1) ? op1 : answer);
+    case Store: return store ((int)op0, op1);
     case Recall: return recall ((int)op0);
     case Inc: return increase ((int)op0);
     case Dec: return decrease ((int)op0);
     case Disp: display (); break;
-    case Mem: memory ((int)op0); break;
+    case Memory: return memory ((root->ops[0]) ? (int)op0 : -1);
     case Clear: clear (); break;
     case Quit: quit (); break;
     case Help: help (); break;
index 27bc1e1843c2fc9f4fbd027de38a3d59b5fe39bc..b5361da17c5dab36082c695a5a4beeb8aa0ef1ad 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -16,7 +16,7 @@ typedef enum {
     Ln, Log, Exp,
     Erfc, Erf,
     Abs, Ceil, Floor,
-    Store, Recall, Inc, Dec, Disp, Mem, Clear,
+    Store, Recall, Inc, Dec, Disp, Memory, Clear,
     Quit, Help,
     Ans, E, Pi,
     Equal, Diff, Ge, Le, Gt, Lt,