Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}