/* functions */
-#define NB_OPERATORS 5
+#define NB_OPERATORS 6
keyword_t operators[NB_OPERATORS] = {
{ "+\t", Add, 2, 1, 1},
{ "-\t", Sub, 2, 1, 1},
{ "*", Mul, 2, 1, 2},
{ "/", Div, 2, 1, 2},
- { "^", Pow, 2, 1, 3}
+ { "%", Mod, 2, 1, 3},
+ { "^", Pow, 2, 1, 4}
};
#define NB_FUNCTIONS 7
keyword_t functions[NB_FUNCTIONS] = {
- { "sqrt", Sqr, 1, 4, 4},
- { "pow", Pow, 2, 3, 4},
- { "cos", Cos, 1, 3, 4},
- { "sin", Sin, 1, 3, 4},
- { "atan", Atn, 1, 4, 4},
- { "exp", Exp, 1, 3, 4},
- { "log", Log, 1, 3, 4}
+ { "sqrt", Sqr, 1, 4, 5},
+ { "pow", Pow, 2, 3, 5},
+ { "cos", Cos, 1, 3, 5},
+ { "sin", Sin, 1, 3, 5},
+ { "atan", Atn, 1, 4, 5},
+ { "exp", Exp, 1, 3, 5},
+ { "log", Log, 1, 3, 5}
};
/* parser function */
VERBOSE (DEBUG, PRINTOUT ("start processing operator\n"));
if (root) {
if ((prio) && (prio > operator->prio)) {
- VERBOSE (DEBUG, PRINTOUT ("stop processing operator because operator priority\n"));
+ VERBOSE (DEBUG, PRINTOUT ("stop because operator priority\n"));
*next = str;
return root;
}
float value = strtof (str, &pt);
VERBOSE (INFO, PRINTOUT ("Value: %f\n", value));
if (str != pt) {
- new = newelement (Val, 1, 4);
- if (new == NULL) {
- return ERROR_OP;
- }
- new->value = value;
if (root == NULL) {
+ new = newelement (Val, 1, 4);
+ if (new == NULL) {
+ return ERROR_OP;
+ }
+ new->value = value;
root = new;
+ str = pt;
} else if (root->func == Val) {
if ((*str == '+') || (*str == '-')) {
- element_t *add = newelement (Add, 2, 1);
- if (add == NULL) {
+ if ((prio) && (prio > 1)) {
+ VERBOSE (DEBUG, PRINTOUT ("stop because operator priority\n"));
+ *next = str;
+ return root;
+ }
+ new = newelement (Add, 2, 1);
+ if (new == NULL) {
+ return ERROR_OP;
+ }
+ new->ops[0] = root;
+ new->ops[1] = parser (str, &str, new->prio);
+ if (new->ops[1] == ERROR_OP) {
+ return ERROR_OP;
+ }
+ root = newelement (Val, 1, 4);
+ if (root == ERROR_OP) {
return ERROR_OP;
}
- add->ops[0] = root;
- add->ops[1] = new;
- root = add;
+ root->ops[0] = new;
} else {
return ERROR_OP;
}
} else {
return ERROR_OP;
}
- str = pt;
found = 1;
}
VERBOSE (DEBUG, PRINTOUT ("stop processing value\n"));
case Sub: func = "Subtraction"; break;
case Mul: func = "Multiplication"; break;
case Div: func = "Division"; break;
+ case Mod: func = "Modulo"; break;
case Pow: func = "Power"; break;
case Sqr: func = "Square Root"; break;
case Cos: func = "Cosine"; break;
case Sub:
case Mul:
case Div:
+ case Mod:
case Pow:
if (root->ops[1]) {
op1 = evaluate_element (root->ops[1]);
case Sub: return op0 - op1;
case Mul: return op0 * op1;
case Div: return op0 / op1;
+ case Mod: return fmod (op0, op1);
case Pow: return pow (op0, op1);
case Sqr: return sqrt (op0);
case Cos: return cos (op0);