// test: echo "1 + cos (2 - 3)" | calc.exe | grep -q '=> 1\.5403'
// test: echo "cos (1 / 2) * 3" | calc.exe | grep -q '=> 2\.63275'
// test: echo "1 + 4 * (2 - 3)" | calc.exe | grep -q '=> -3'
+// test: echo "10 - (5 + 5)" | calc.exe | grep -q '=> 0'
+// test: echo "10 + (5 + 5) * 2" | calc.exe | grep -q '=> 30'
// test: echo "(2 - 3) / 4" | calc.exe | grep -q '=> -0\.25'
// test: echo "pow (8 - 3, 4 / 3)" | calc.exe | grep -q '=> 8\.54988'
// test: echo "1 + -2" | calc.exe | grep -q '=> -1'
// test: echo "2 + cos (pi +" | calc.exe | grep -q 'error'
// test: echo "2 + cos (pi" | calc.exe | grep -q 'error'
// test: echo "(2 + " | calc.exe | grep -q 'error'
+// test: echo "1 (2 + 3)" | calc.exe | grep -q 'error'
// test: echo "cos (1, 2)" | calc.exe | grep -q 'error'
// test: echo "sqrt 2" | calc.exe | grep -q 'error'
// test: echo "pow (2)" | calc.exe | grep -q 'error'
if (*str == '(') {
VERBOSE (DEBUG, fprintf (stdout, "start processing bracket\n"));
if (root) {
+ if (root->func == Val) {
+ delelement (root);
+ return ERROR_OP;
+ }
do {
found = 0;
new = parser (str + 1, &str, 0);
}
} while (*str == ',');
} else {
- root = newelement (Val, 1, 5);
+ root = newelement (Id, 1, 5);
new = parser (str + 1, &str, 0);
if ((new == NULL) || ((new != ERROR_OP) && (new->prio == 9))) {
delelement (new);
switch (root->func) {
case Val: func = "Value"; break;
+ case Id: func = "Ident"; break;
case Sig: func = "Sign"; break;
case Add: func = "Addition"; break;
case Sub: func = "Subtraction"; break;
return 0;
}
/* fallthrough */
+ case Id:
case Sqr:
case Cos:
case Sin:
switch (root->func) {
case Val: return op0;
+ case Id: return op0;
case Sig: return -op0;
case Add: return ((mask & MASK_SUB) == 0) ? op0 + op1 : op0 - op1;
case Sub: return ((mask & MASK_SUB) == 0) ? op0 - op1 : op0 + op1;