-
- double left_arg, right_arg;
- infix_op_t * infix_op;
-
- /* Shouldn't happen */
- if (tree_expr == NULL)
- return EVAL_ERROR;
-
- /* A leaf node, evaluate the general expression. If the expression is null as well, return zero */
- if (tree_expr->infix_op == NULL) {
- if (tree_expr->gen_expr == NULL)
- return 0;
- else
- return eval_gen_expr(tree_expr->gen_expr);
- }
-
- /* Otherwise, this node is an infix operator. Evaluate
- accordingly */
-
- infix_op = (infix_op_t*)tree_expr->infix_op;
- #ifdef EVAL_DEBUG
- printf("(");
- fflush(stdout);
- #endif
-
- left_arg = eval_tree_expr(tree_expr->left);
-
- #ifdef EVAL_DEBUG
-
- switch (infix_op->type) {
- case INFIX_ADD:
- printf("+");
- break;
- case INFIX_MINUS:
- printf("-");
- break;
- case INFIX_MULT:
- printf("*");
- break;
- case INFIX_MOD:
- printf("%%");
- break;
- case INFIX_OR:
- printf("|");
- break;
- case INFIX_AND:
- printf("&");
- break;
- case INFIX_DIV:
- printf("/");
- break;
- default:
- printf("?");
- }
-
- fflush(stdout);
- #endif
-
- right_arg = eval_tree_expr(tree_expr->right);
-
- #ifdef EVAL_DEBUG
- printf(")");
- fflush(stdout);
- #endif
-
- switch (infix_op->type) {
- case INFIX_ADD:
- return (left_arg + right_arg);
- case INFIX_MINUS:
- return (left_arg - right_arg);
- case INFIX_MULT:
- return (left_arg * right_arg);
- case INFIX_MOD:
- if ((int)right_arg == 0) {
- #ifdef EVAL_DEBUG
- printf("eval_tree_expr: modulo zero!\n");
- #endif
- return DIV_BY_ZERO;
- }
- return ((int)left_arg % (int)right_arg);
- case INFIX_OR:
- return ((int)left_arg | (int)right_arg);
- case INFIX_AND:
- return ((int)left_arg & (int)right_arg);
- case INFIX_DIV:
- if (right_arg == 0) {
- #ifdef EVAL_DEBUG
- printf("eval_tree_expr: division by zero!\n");
- #endif
- return MAX_DOUBLE_SIZE;
- }
- return (left_arg / right_arg);
- default:
- #ifdef EVAL_DEBUG
- printf("eval_tree_expr: unknown infix operator!\n");
+
+ double left_arg, right_arg;
+ infix_op_t * infix_op;
+
+ /* Shouldn't happen */
+ if (tree_expr == NULL)
+ return EVAL_ERROR;
+
+ /* A leaf node, evaluate the general expression. If the expression is null as well, return zero */
+ if (tree_expr->infix_op == NULL) {
+ if (tree_expr->gen_expr == NULL)
+ return 0;
+ else
+ return eval_gen_expr(tree_expr->gen_expr);
+ }
+
+ /* Otherwise, this node is an infix operator. Evaluate
+ accordingly */
+
+ infix_op = (infix_op_t*)tree_expr->infix_op;
+ #ifdef EVAL_DEBUG
+ printf("(");
+ fflush(stdout);
+ #endif
+
+ left_arg = eval_tree_expr(tree_expr->left);
+
+ #ifdef EVAL_DEBUG
+
+ switch (infix_op->type) {
+ case INFIX_ADD:
+ printf("+");
+ break;
+ case INFIX_MINUS:
+ printf("-");
+ break;
+ case INFIX_MULT:
+ printf("*");
+ break;
+ case INFIX_MOD:
+ printf("%%");
+ break;
+ case INFIX_OR:
+ printf("|");
+ break;
+ case INFIX_AND:
+ printf("&");
+ break;
+ case INFIX_DIV:
+ printf("/");
+ break;
+ default:
+ printf("?");
+ }
+
+ fflush(stdout);
+ #endif
+
+ right_arg = eval_tree_expr(tree_expr->right);
+
+ #ifdef EVAL_DEBUG
+ printf(")");
+ fflush(stdout);
+ #endif
+
+ switch (infix_op->type) {
+ case INFIX_ADD:
+ return (left_arg + right_arg);
+ case INFIX_MINUS:
+ return (left_arg - right_arg);
+ case INFIX_MULT:
+ return (left_arg * right_arg);
+ case INFIX_MOD:
+ if ((int)right_arg == 0) {
+ #ifdef EVAL_DEBUG
+ printf("eval_tree_expr: modulo zero!\n");
+ #endif
+ return DIV_BY_ZERO;
+ }
+ return ((int)left_arg % (int)right_arg);
+ case INFIX_OR:
+ return ((int)left_arg | (int)right_arg);
+ case INFIX_AND:
+ return ((int)left_arg & (int)right_arg);
+ case INFIX_DIV:
+ if (right_arg == 0) {
+ #ifdef EVAL_DEBUG
+ printf("eval_tree_expr: division by zero!\n");
+ #endif
+ return MAX_DOUBLE_SIZE;
+ }
+ return (left_arg / right_arg);
+ default:
+ #ifdef EVAL_DEBUG
+ printf("eval_tree_expr: unknown infix operator!\n");