# HG changeset patch # User michael # Date 1161025616 0 # Node ID 0f2bb0baf6f077930b46dd7b0b3510cc55c96e8f # Parent edda4c177c594e43bd4e928d96e095b798e68dff fix -a^b which was interpreted as (-a)^b diff -r edda4c177c59 -r 0f2bb0baf6f0 eval.c --- a/eval.c Mon Oct 16 18:36:44 2006 +0000 +++ b/eval.c Mon Oct 16 19:06:56 2006 +0000 @@ -209,19 +209,22 @@ return d; } -static double evalPow(Parser *p){ - int sign= (*p->s == '+') - (*p->s == '-'); - p->s += sign&1; - return (sign|1) * evalPrimary(p); +static double evalPow(Parser *p, int *sign){ + *sign= (*p->s == '+') - (*p->s == '-'); + p->s += *sign&1; + return evalPrimary(p); } static double evalFactor(Parser *p){ - double ret= evalPow(p); + int sign, sign2; + double ret, e; + ret= evalPow(p, &sign); while(p->s[0]=='^'){ p->s++; - ret= pow(ret, evalPow(p)); + e= evalPow(p, &sign2); + ret= pow(ret, (sign2|1) * e); } - return ret; + return (sign|1) * ret; } static double evalTerm(Parser *p){