correct edit function
[calc.git] / parser.c
index bf1a7dc9a0a95c17096d51f6b89850ed62d659c0..b9823abaa25f10acd08cc4f40e2667a2e94ea902 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -62,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},
@@ -114,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
@@ -522,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);
@@ -617,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");
 }
@@ -774,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) {
@@ -887,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;