comparison eval.c @ 4032:0f2bb0baf6f0 libavcodec

fix -a^b which was interpreted as (-a)^b
author michael
date Mon, 16 Oct 2006 19:06:56 +0000
parents edda4c177c59
children cedb63307f3d
comparison
equal deleted inserted replaced
4031:edda4c177c59 4032:0f2bb0baf6f0
207 } 207 }
208 208
209 return d; 209 return d;
210 } 210 }
211 211
212 static double evalPow(Parser *p){ 212 static double evalPow(Parser *p, int *sign){
213 int sign= (*p->s == '+') - (*p->s == '-'); 213 *sign= (*p->s == '+') - (*p->s == '-');
214 p->s += sign&1; 214 p->s += *sign&1;
215 return (sign|1) * evalPrimary(p); 215 return evalPrimary(p);
216 } 216 }
217 217
218 static double evalFactor(Parser *p){ 218 static double evalFactor(Parser *p){
219 double ret= evalPow(p); 219 int sign, sign2;
220 double ret, e;
221 ret= evalPow(p, &sign);
220 while(p->s[0]=='^'){ 222 while(p->s[0]=='^'){
221 p->s++; 223 p->s++;
222 ret= pow(ret, evalPow(p)); 224 e= evalPow(p, &sign2);
223 } 225 ret= pow(ret, (sign2|1) * e);
224 return ret; 226 }
227 return (sign|1) * ret;
225 } 228 }
226 229
227 static double evalTerm(Parser *p){ 230 static double evalTerm(Parser *p){
228 double ret= evalFactor(p); 231 double ret= evalFactor(p);
229 while(p->s[0]=='*' || p->s[0]=='/'){ 232 while(p->s[0]=='*' || p->s[0]=='/'){