Merge branch 'refactoring'
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Mon, 20 Feb 2023 15:01:09 +0000 (16:01 +0100)
committerLaurent Mazet <laurent.mazet@thalesgroup.com>
Mon, 20 Feb 2023 15:01:09 +0000 (16:01 +0100)
calc.c
element.h
parser.c
storage.c
storage.h

diff --git a/calc.c b/calc.c
index 7476252d1c42312ffd17042e69c0cfb3bcf0ffbc..08ff10c14308c34769a49fb69af5111c367033a9 100644 (file)
--- a/calc.c
+++ b/calc.c
@@ -372,7 +372,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 error
+// test: echo -e 'mem\nmem (3)\nsto (4, pi)' | calc.exe | grep -q "error out of bound"
 // 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 c36c5596e5b3ed04f4e8a96ebffe5ba885608e81..15e6ecc2eb991302afb9a4ec412c839b3944c918 100644 (file)
--- a/element.h
+++ b/element.h
@@ -14,7 +14,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,
index 7bdcda5a1ec7c06b06c4400dcfd6dd39ef631ab9..bf1a7dc9a0a95c17096d51f6b89850ed62d659c0 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -85,7 +85,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},
@@ -481,7 +481,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;
@@ -669,7 +669,6 @@ double evaluate_element (element_t *root, char mask)
     case Div:
     case Mod:
     case Pow:
-    case Store:
     case Equal:
     case Diff:
     case Ge:
@@ -680,7 +679,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;
         }
@@ -704,7 +703,6 @@ double evaluate_element (element_t *root, char mask)
     case Inc:
     case Dec:
     case Not:
-    case Mem:
     case Cond:
     case Prog:
     case Arg:
@@ -743,10 +741,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);
@@ -790,12 +800,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 dda1856155387d8f8d5b5afbd9697eabfaee2215..4a559f27433086ceda169ce7f734afffd8450157 100644 (file)
--- a/storage.c
+++ b/storage.c
@@ -16,11 +16,15 @@ tab_t *storage = NULL;
 
 /* storage functions */
 
-void memory (int nb)
+int memory (int nb)
 {
-    if (nb != size_tab (storage)) {
+    if ((nb != -1) && (nb != size_tab (storage))) {
         storage = resize_tab (storage, nb);
     }
+    if (size_tab (storage) == -1) {
+        memory (DEFAULT_STORAGE_SIZE);
+    }
+    return size_tab (storage);
 }
 
 double store (int id, double value)
index d538e7b84deaf54d58be9104551696582d64b643..896c264459fe78efc4dae5f4a45040615f6a7368 100644 (file)
--- a/storage.h
+++ b/storage.h
@@ -9,7 +9,7 @@ extern tab_t *storage;
 
 /* storage functions */
 
-void memory (int nb);
+int memory (int nb);
 double store (int id, double value);
 double recall (int id);
 double increase (int id);