X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=parser.c;h=b9823abaa25f10acd08cc4f40e2667a2e94ea902;hb=e2a309f921968691af1566000dd694f191eca857;hp=eba4fb7cf62e635927735e9912ad66bb9e734d12;hpb=a24bd5195f9990159a974c98751f1473f29b9fa4;p=calc.git diff --git a/parser.c b/parser.c index eba4fb7..b9823ab 100644 --- a/parser.c +++ b/parser.c @@ -4,6 +4,7 @@ #include #include "alloc.h" +#include "argument.h" #include "debug.h" #include "element.h" #include "format.h" @@ -61,7 +62,7 @@ keyword_t operators[NB_OPERATORS] = { { "|", Or, 2, 1, -2} }; -#define NB_FUNCTIONS 50 +#define NB_FUNCTIONS 51 keyword_t functions[NB_FUNCTIONS] = { { "sqrt", Sqr, 1, 4, 5}, { "pow", Pow, 2, 3, 5}, @@ -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}, @@ -113,6 +114,7 @@ keyword_t functions[NB_FUNCTIONS] = { { "prod", Prod, 0, 4, 5}, { "sum", Sum, 0, 3, 5}, { "var", Variance, 2, 3, 5}, + { "format", Precision, 1, 6, 9} }; #define NB_CONSTANTS 3 @@ -480,7 +482,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; @@ -521,6 +523,7 @@ void print_element (element_t *root, int level) case Prod: func = "Product"; break; case Sum: func = "Sum"; break; case Variance: func = "Variance"; break; + case Precision: func = "Precision"; break; } fprintf (stdout, "Function: %s\n", func); @@ -616,7 +619,7 @@ void help (void) fprintf (stdout, "stack func.:"); fprintf (stdout, " max mean med min ord prod sum var\n"); fprintf (stdout, "control management:"); - fprintf (stdout, " help quit\n"); + fprintf (stdout, " format help quit\n"); fprintf (stdout, "constants:"); fprintf (stdout, " ans e pi\n"); } @@ -668,7 +671,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 +681,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 +705,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 +743,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); @@ -763,6 +776,10 @@ double evaluate_element (element_t *root, char mask) op0 = evaluate_element (root->ops[0], 0); op1 = (root->ops[1]) ? evaluate_element (root->ops[1], 0) : answer; } + break; + case Precision: + op0 = (root->ops[0]) ? evaluate_element (root->ops[0], 0) : -1; + break; } switch (root->func) { @@ -789,12 +806,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 +844,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++; } @@ -876,6 +893,15 @@ double evaluate_element (element_t *root, char mask) return op0 * op0 + op1 * op1; } return variance (); + case Precision: + if (op0 > 0) { + set_precision ((int)op0); + set_format (); + } else if (op0 != -1) { + VERBOSE (WARNING, fprintf (stdout, "error incorrect precision (%g)\n", op0)); + return 0; + } + return get_precision(); } return 0;