new functions: quit and help
authorLaurent Mazet <mazet@softndesign.org>
Fri, 30 Dec 2022 17:07:05 +0000 (18:07 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Fri, 30 Dec 2022 17:07:05 +0000 (18:07 +0100)
calc.c
parser.c
parser.h

diff --git a/calc.c b/calc.c
index a57137475d7f4a8c7dc83ff251eef54d6224f4aa..d24bda307c1bf7e8a177091c7e3e22193c837b17 100644 (file)
--- 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: */
index 13efac35bdac40ad675babcf184720e71a833323..1d35b4c44785dc85eee79b7600b2c62eebb40910 100644 (file)
--- 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;
index c746aaf4dfe757d00fc8dd223484046660536070..26022e5e585a469c67b824484a86912be28bf5f4 100644 (file)
--- 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 */