X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=parser.c;h=1d35b4c44785dc85eee79b7600b2c62eebb40910;hb=89cf095594de27bde3e3be007d255cad56ab0eca;hp=13efac35bdac40ad675babcf184720e71a833323;hpb=3b4b0bbecb130cc76d4cd16d00518f70d11f0820;p=calc.git diff --git a/parser.c b/parser.c index 13efac3..1d35b4c 100644 --- a/parser.c +++ b/parser.c @@ -58,7 +58,7 @@ keyword_t operators[NB_OPERATORS] = { { "^", Pow, 2, 1, 4} }; -#define NB_FUNCTIONS 7 +#define NB_FUNCTIONS 9 keyword_t functions[NB_FUNCTIONS] = { { "sqrt", Sqr, 1, 4, 5}, { "pow", Pow, 2, 3, 5}, @@ -66,7 +66,9 @@ keyword_t functions[NB_FUNCTIONS] = { { "sin", Sin, 1, 3, 5}, { "atan", Atn, 1, 4, 5}, { "exp", Exp, 1, 3, 5}, - { "log", Log, 1, 3, 5} + { "log", Log, 1, 3, 5}, + { "quit", Qui, 0, 4, 5}, + { "help", Hel, 0, 4, 5} }; /* subparser function */ @@ -290,6 +292,7 @@ void print_element (element_t *root, int level) switch (root->func) { case Val: func = "Value"; break; + case Sig: func = "Sign"; break; case Add: func = "Addition"; break; case Sub: func = "Subtraction"; break; case Mul: func = "Multiplication"; break; @@ -302,7 +305,8 @@ void print_element (element_t *root, int level) case Atn: func = "Arc Tangent"; break; case Log: func = "Logarithm"; break; case Exp: func = "Exponantial"; break; - case Sig: func = "Sign"; break; + case Qui: func = "Quit"; break; + case Hel: func = "Help"; break; } PRINTOUT ("Function: %s\n", func); @@ -319,11 +323,32 @@ void print_element (element_t *root, int level) } } -#define MASK_SUB 0x1 -#define MASK_DIV 0x2 +/* quit function */ + +void quit (void) +{ + PRINTOUT ("bye\n"); + exit (0); +} + +/* help message */ + +void help (void) +{ + PRINTOUT ("calc is a simple calculator\n\n"); + PRINTOUT ("supported operators:\n"); + PRINTOUT (" + - * / % ^\n\n"); + PRINTOUT ("supported functions:\n"); + PRINTOUT (" pow sqrt cos sin atan log exp\n\n"); + PRINTOUT ("miscellaneous functions:\n"); + PRINTOUT (" quit help\n"); +} /* evaluate element tree */ +#define MASK_SUB 0x1 +#define MASK_DIV 0x2 + double evaluate_element (element_t *root, char mask) { double op0 = 0, op1 = 0; @@ -384,6 +409,10 @@ double evaluate_element (element_t *root, char mask) VERBOSE (WARNING, PRINTOUT ("error while evaluating (op[0])\n")); return 0; } + break; + case Qui: + case Hel: + break; } switch (root->func) { @@ -401,6 +430,8 @@ double evaluate_element (element_t *root, char mask) case Atn: return atan (op0); case Log: return log (op0); case Exp: return exp (op0); + case Qui: quit (); break; + case Hel: help (); break; } return 0;