// test: echo -e '1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1\n1 + 1' | calc.exe -n | grep -q 2
// test: echo -e '1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1\n1 + 1' | calc.exe | grep -q 64
// test: echo -e '1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1\n1 + 1' | calc.exe | grep -q 2
-// test: echo -e '-cos (1)\n1 + 1\n1 - 1\n1 * 1\n1 / 1\n3%2\n2^2\nsqrt (2)\ncos (0)\nsin (0)\natan (0)\nlog (1)\nexp (1)\nans\ne\npi\nsto (1)\nrcl (2)\ndisp\nhelp\nquit' | calc.exe -v 3 | grep -q bye
-// test: echo -e '1 +\n1 -\n1 * 1\n1 /\n3%\n2^\nsqrt ()\ncos ()\nsin ()\natan ()\nlog ()\nexp ()\n1 + (\n1+2(\n1+2cos\n1+2pi' | calc.exe | grep -c error | xargs test 15 =
+// test: echo -e '-cos (1)\n1 + 1\n1 - 1\n1 * 1\n1 / 1\n3%2\n2^2\nsqrt (2)\ncos (0)\nsin (0)\ntan (0)\nacos (0)\nasin (0)\natan (0)\nlog (1)\nexp (1)\nabs (-1)\nceil (1.2)\nfloor (-1.2)\nans\ne\npi\nsto (1)\nrcl (2)\ndisp\nhelp\nquit' | calc.exe -v 3 | grep -q bye
+// test: echo -e '1 +\n1 -\n1 * 1\n1 /\n3%\n2^\nsqrt ()\ncos ()\nsin ()\ntan ()\nacos ()\nasin ()\natan ()\nlog ()\nexp ()\nabs ()\nceil ()\nfloor ()\n1 + (\n1+2(\n1+2cos\n1+2pi' | calc.exe | grep -c error | xargs test 21 =
// test: echo -e '1 + 1\nans' | calc.exe -p 3 | grep -c 2 | xargs test 2 =
// test: echo -e 'sin (pi / 2)' | calc.exe -p 4 | grep -q 1
// test: echo -e 'e ^ 2' | calc.exe | grep -q '7\.38906'
{ "|", Or, 2, 1, -2}
};
-#define NB_FUNCTIONS 17
+#define NB_FUNCTIONS 23
keyword_t functions[NB_FUNCTIONS] = {
{ "sqrt", Sqr, 1, 4, 5},
{ "pow", Pow, 2, 3, 5},
{ "cos", Cos, 1, 3, 5},
{ "sin", Sin, 1, 3, 5},
+ { "tan", Tan, 1, 3, 5},
+ { "acos", Acos, 1, 4, 5},
+ { "asin", Asin, 1, 4, 5},
{ "atan", Atan, 1, 4, 5},
- { "exp", Exp, 1, 3, 5},
{ "log", Log, 1, 3, 5},
+ { "exp", Exp, 1, 3, 5},
+ { "abs", Abs, 1, 3, 5},
+ { "floor", Floor, 1, 5, 5},
+ { "ceil", Ceil, 1, 4, 5},
{ "sto", Store, 2, 3, 5},
{ "rcl", Recall, 1, 3, 5},
{ "inc", Inc, 1, 3, 5},
case Sqr: func = "Square Root"; break;
case Cos: func = "Cosine"; break;
case Sin: func = "Sine"; break;
+ case Tan: func = "Tangent"; break;
+ case Acos: func = "Arc Cosine"; break;
+ case Asin: func = "Arc Sine"; break;
case Atan: func = "Arc Tangent"; break;
case Log: func = "Logarithm"; break;
case Exp: func = "Exponantial"; break;
+ case Abs: func = "Absolute value"; break;
+ case Ceil: func = "Ceil value"; break;
+ case Floor: func = "Floor value"; break;
case Store: func = "Store"; break;
case Recall: func = "Recall"; break;
case Inc: func = "Increase"; break;
fprintf (stdout, " == != >= <= > <\n");
fprintf (stdout, "logical operators:");
fprintf (stdout, " & | !\n");
+ fprintf (stdout, "mathematic functions:");
+ fprintf (stdout, " pow sqrt cos sin tan acos asin atan log exp\n");
fprintf (stdout, "supported functions:");
- fprintf (stdout, " pow sqrt cos sin atan log exp\n");
+ fprintf (stdout, " abs ceil floor\n");
fprintf (stdout, "storage functions:");
fprintf (stdout, " sto rcl inc dec\n");
fprintf (stdout, "conditional functions:");
case Sqr:
case Cos:
case Sin:
+ case Tan:
+ case Acos:
+ case Asin:
case Atan:
case Log:
case Exp:
+ case Abs:
+ case Ceil:
+ case Floor:
case Recall:
case Inc:
case Dec:
case Sqr: return sqrt (op0);
case Cos: return cos (op0);
case Sin: return sin (op0);
+ case Tan: return tan (op0);
+ case Acos: return acos (op0);
+ case Asin: return asin (op0);
case Atan: return atan (op0);
case Log: return log (op0);
case Exp: return exp (op0);
+ case Abs: return fabs (op0);
+ case Ceil: return ceil (op0);
+ case Floor: return floor (op0);
case Store: return store ((int)op0, (op1) ? op1 : answer);
case Recall: return recall ((int)op0);
case Inc: return increase ((int)op0);