Mercurial > libavcodec.hg
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]=='/'){ |
