From eadb6e8f8d73566be4b155451dcf4dd8b9e5e634 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Tue, 7 Feb 2023 16:34:09 +0100 Subject: [PATCH] mem without argument returns size --- calc.c | 2 +- parser.c | 32 +++++++++++++++++++++++--------- parser.h | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/calc.c b/calc.c index 97b2159..0d5e8ea 100644 --- 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" diff --git a/parser.c b/parser.c index 223b173..f566fbe 100644 --- 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; diff --git a/parser.h b/parser.h index 27bc1e1..b5361da 100644 --- 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, -- 2.30.2