int Formula::eval_neq(char *&s, Args *args, bool *vars) const { int left = eval_sum(s, args, vars); while (*s) { if (myisspace(*s)) { ++s; } else if (*s == '<') { // this is needed due to side effects caused by min() macro... int tmp = eval_sum(++s, args, vars); left = min(left, tmp); } else if (*s == '>') { // this is needed due to side effects caused by max() macro... int tmp = eval_sum(++s, args, vars); left = max(left, tmp); } else { break; } } return left; }
static int eval_exp(const char **s) { int base; while (isspace(**s)) ++*s; switch (**s) { // Unary '+' and '-' operators case '+': ++*s; base = eval_exp(s); break; case '-': ++*s; base = -eval_exp(s); break; case '(': ++*s; // Eat "(" base = eval_sum(s); if (**s != ')') longjmp(err_jmp_buf, 1); ++*s; // Eat ")" break; default: base = eval_num(s); } // Check if we have an exponent while (isspace(**s)) ++*s; if (**s == '*' && *(*s + 1) == '*') { *s += 2; // Eat "**" return pow(base, eval_exp(s)); } return base; }
bool eval(const char *s, int *res) { int tmp; if (setjmp(err_jmp_buf) == 1) return false; tmp = eval_sum(&s); if (*s != '\0') // Found extra trailing characters return false; *res = tmp; return true; }