X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=parser.c;h=0f4e6418e46593fe9afd14ed4fb4b63a09fe3109;hb=b6311fa2c6d14d644f8289cb96b5aee862956b61;hp=94f4c73fd0d752910b28d70ca02261c81446ea65;hpb=20a645614be5667c1c32169e837b97c067156edb;p=calc.git diff --git a/parser.c b/parser.c index 94f4c73..0f4e641 100644 --- a/parser.c +++ b/parser.c @@ -62,7 +62,7 @@ keyword_t operators[NB_OPERATORS] = { { "|", Or, 2, 1, -2} }; -#define NB_FUNCTIONS 51 +#define NB_FUNCTIONS 52 keyword_t functions[NB_FUNCTIONS] = { { "sqrt", Sqr, 1, 4, 5}, { "pow", Pow, 2, 3, 5}, @@ -114,7 +114,8 @@ 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} + { "format", Precision, 1, 6, 9}, + { "base", Base, 2, 4, 9} }; #define NB_CONSTANTS 3 @@ -373,7 +374,7 @@ element_t *parser (char *str, char **next, int prio) VERBOSE (DEBUG, fprintf (stdout, "start processing value\n")); char *pt; - double value = (ibase == 10) ? strtod (str, &pt) : strtoul (str, &pt, ibase); + double value = (get_ibase () == 10) ? strtod (str, &pt) : strtoul (str, &pt, get_ibase ()); VERBOSE (INFO, fprintf (stdout, "Value: %f\n", value)); if (str != pt) { if ((root == NULL) || (root->prio == 6)) { @@ -447,7 +448,7 @@ void print_element (element_t *root, int level) } for (i = 0; i < level; i++) { - fprintf (stdout, " "); + printf (" "); } switch (root->func) { @@ -521,15 +522,16 @@ void print_element (element_t *root, int level) case Sum: func = "Sum"; break; case Variance: func = "Variance"; break; case Precision: func = "Precision"; break; + case Base: func = "Base"; break; } - fprintf (stdout, "Function: %s\n", func); + printf ("Function: %s\n", func); if ((root->func == Val) && (root->ops[0] == NULL)) { for (i = 0; i < level; i++) { - fprintf (stdout, " "); + printf (" "); } - fprintf (stdout, "value: %f\n", root->value); + printf ("value: %f\n", root->value); } else { for (i = 0; i < root->nbops; i++) { print_element (root->ops[i], level + 1); @@ -582,7 +584,7 @@ double execute_code (element_t **prog, int nbcalls) void quit (void) { - fprintf (stdout, "bye\n"); + printf ("bye\n"); exit (0); } @@ -590,35 +592,67 @@ void quit (void) void help (void) { - fprintf (stdout, "calc is a simple calculator\n\n"); - fprintf (stdout, "arithmetic op.:"); - fprintf (stdout, " + - * / %% ^\n"); - fprintf (stdout, "comparison op.:"); - fprintf (stdout, " == != >= <= > <\n"); - fprintf (stdout, "logical op.:"); - fprintf (stdout, " & | !\n"); - fprintf (stdout, "mathematic func.:"); - fprintf (stdout, " exp ln log pow sqrt\n"); - fprintf (stdout, "trigonometric func.:"); - fprintf (stdout, " acos asin atan cos sin tan\n"); - fprintf (stdout, "error functions:"); - fprintf (stdout, " erf erfc\n"); - fprintf (stdout, "miscellaneous func.:"); - fprintf (stdout, " abs ceil floor\n"); - fprintf (stdout, "storage func.:"); - fprintf (stdout, " clear dec disp inc mem rcl sto\n"); - fprintf (stdout, "control flow prim.:"); - fprintf (stdout, " cond print while {} ;\n"); - fprintf (stdout, "program management:"); - fprintf (stdout, " arg call del edit ls prog\n"); - fprintf (stdout, "stack management:"); - fprintf (stdout, " get len pop push put set show\n"); - fprintf (stdout, "stack func.:"); - fprintf (stdout, " max mean med min ord prod sum var\n"); - fprintf (stdout, "control management:"); - fprintf (stdout, " format help quit\n"); - fprintf (stdout, "constants:"); - fprintf (stdout, " ans e pi\n"); + printf ("calc is a simple calculator\n\n"); + printf ("arithmetic op.:"); + printf (" + - * / %% ^\n"); + printf ("comparison op.:"); + printf (" == != >= <= > <\n"); + printf ("logical op.:"); + printf (" & | !\n"); + printf ("mathematic func.:"); + printf (" exp ln log pow sqrt\n"); + printf ("trigonometric func.:"); + printf (" acos asin atan cos sin tan\n"); + printf ("error functions:"); + printf (" erf erfc\n"); + printf ("miscellaneous func.:"); + printf (" abs ceil floor\n"); + printf ("storage func.:"); + printf (" clear dec disp inc mem rcl sto\n"); + printf ("control flow prim.:"); + printf (" cond print while {} ;\n"); + printf ("program management:"); + printf (" arg call del edit ls prog\n"); + printf ("stack management:"); + printf (" get len pop push put set show\n"); + printf ("stack func.:"); + printf (" max mean med min ord prod sum var\n"); + printf ("control management:"); + printf (" base format help quit\n"); + printf ("constants:"); + printf (" ans e pi\n"); +} + +/* format function */ + +int format (int precision) +{ + if (precision > 0) { + set_precision (precision); + set_format (); + } else if (precision != -1) { + VERBOSE (WARNING, fprintf (stdout, "error incorrect precision (%d)\n", precision)); + return 0; + } + return get_precision (); +} + +/* base function */ + +void base (int in, int out) +{ + if ((in > 0) && (in < 37)) { + set_base (in, in); + if ((out > 0) && (out < 37)) { + set_base (in, out); + } else if (out != - 1) { + VERBOSE (WARNING, fprintf (stdout, "error incorrect output base (%d)\n", out)); + } + } else if (in != -1 ) { + VERBOSE (WARNING, fprintf (stdout, "error incorrect input base (%d)\n", in)); + } else { + printf ("base (I/O): %s\n", show_base ()); + } } /* evaluate element tree */ @@ -777,6 +811,10 @@ double evaluate_element (element_t *root, char mask) case Precision: op0 = (root->ops[0]) ? evaluate_element (root->ops[0], 0) : -1; break; + case Base: + op0 = (root->ops[0]) ? evaluate_element (root->ops[0], 0) : -1; + op1 = (root->ops[1]) ? evaluate_element (root->ops[1], 0) : -1; + break; } switch (root->func) { @@ -891,14 +929,10 @@ double evaluate_element (element_t *root, char mask) } 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 format ((int)op0); + case Base: + base ((int)op0, (int)op1); + break; } return 0;