change perl program calls
[calc.git] / parser.c
index eba4fb7cf62e635927735e9912ad66bb9e734d12..bf1a7dc9a0a95c17096d51f6b89850ed62d659c0 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -4,6 +4,7 @@
 #include <string.h>
 
 #include "alloc.h"
+#include "argument.h"
 #include "debug.h"
 #include "element.h"
 #include "format.h"
@@ -84,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},
@@ -480,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;
@@ -668,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:
@@ -679,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;
         }
@@ -703,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:
@@ -742,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);
@@ -789,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;
@@ -827,7 +838,7 @@ double evaluate_element (element_t *root, char mask)
         break;
     case Arg: return arg ((int)op0);
     case Call:
-        for (i = 1, nb =0; i < root->nbops; i++) {
+        for (i = 1, nb = 0; i < root->nbops; i++) {
             if (root->ops[i]) {
                 nb++;
             }