X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=parser.c;h=b9823abaa25f10acd08cc4f40e2667a2e94ea902;hb=e2a309f921968691af1566000dd694f191eca857;hp=bf1a7dc9a0a95c17096d51f6b89850ed62d659c0;hpb=bdcb95da42ef20e0385e0c0404cb25844c3bb137;p=calc.git diff --git a/parser.c b/parser.c index bf1a7dc..b9823ab 100644 --- 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;