From: Laurent Mazet Date: Fri, 30 Dec 2022 17:07:05 +0000 (+0100) Subject: new functions: quit and help X-Git-Tag: v0.8~56 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=89cf095594de27bde3e3be007d255cad56ab0eca;p=calc.git new functions: quit and help --- diff --git a/calc.c b/calc.c index a571374..d24bda3 100644 --- a/calc.c +++ b/calc.c @@ -166,5 +166,7 @@ int main (int argc, char *argv[]) // test: echo "95 - 6.3 * 15 - 1" | calc.exe | grep -q '=> -5.000028e-1' // test: echo "95-6.3+15" | calc.exe | grep -q '=> 1.037e2' // test: echo "-cos (0) + 1" | calc.exe | grep -q '=> 0' +// test: echo "quit" | calc.exe | grep -q 'bye' +// test: echo "help" | calc.exe | grep -q 'miscellaneous' /* vim: set ts=4 sw=4 et: */ 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; diff --git a/parser.h b/parser.h index c746aaf..26022e5 100644 --- a/parser.h +++ b/parser.h @@ -4,13 +4,13 @@ /* function type */ typedef enum { - Val = 0, + Val = 0, Sig, Add, Sub, Mul, Div, Mod, Pow, Sqr, Cos, Sin, Atn, Log, Exp, - Sig + Qui, Hel } func_t; /* keyword type */