new functions: quit and help
[calc.git] / parser.c
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;