#include <malloc.h>
+#include <math.h>
#include <stdlib.h>
#include "debug.h"
switch (root->func) {
case Val: func = "Value"; break;
- case Set: func = "Set"; break;
case Add: func = "Addition"; break;
case Sub: func = "Subtraction"; break;
case Mul: func = "Multiplication"; break;
}
}
+/* evaluate element tree */
+
+double evaluate_element (element_t *root)
+{
+ double op0 = 0, op1 = 0;
+
+ if ((root == NULL) || (root == ERROR_OP)) {
+ VERBOSE (WARNING, PRINTOUT ("error while evaluating\n"));
+ return 0;
+ }
+
+ switch (root->func) {
+ case Val:
+ if (root->ops[0]) {
+ return evaluate_element (root->ops[0]);
+ } else {
+ return root->value;
+ }
+ break;
+ case Add:
+ case Sub:
+ case Mul:
+ case Div:
+ case Pow:
+ if (root->ops[1]) {
+ op1 = evaluate_element (root->ops[1]);
+ } else {
+ VERBOSE (WARNING, PRINTOUT ("error while evaluating (op[1])\n"));
+ return 0;
+ }
+ /* fallthrough */
+ case Sqr:
+ case Cos:
+ case Sin:
+ case Atn:
+ case Log:
+ case Exp:
+ if (root->ops[0]) {
+ op0 = evaluate_element (root->ops[0]);
+ } else {
+ VERBOSE (WARNING, PRINTOUT ("error while evaluating (op[0])\n"));
+ return 0;
+ }
+ }
+
+ switch (root->func) {
+ case Add: return op0 + op1;
+ case Sub: return op0 - op1;
+ case Mul: return op0 * op1;
+ case Div: return op0 / op1;
+ case Pow: return pow (op0, op1);
+ case Sqr: return sqrt (op0);
+ case Cos: return cos (op0);
+ case Sin: return sin (op0);
+ case Atn: return atan (op0);
+ case Log: return log (op0);
+ case Exp: return exp (op0);
+ default: break;
+ }
+
+ return 0;
+}
+
/* vim: set ts=4 sw=4 et: */