comparison eval.c @ 2433:0934621b6453 libavcodec

simplify, null pointer, selftest
author michael
date Sat, 15 Jan 2005 19:05:26 +0000
parents 2152760d08ad
children 24aa9209e8b0
comparison
equal deleted inserted replaced
2432:d9cf90e66883 2433:0934621b6453
97 p->s= next; 97 p->s= next;
98 return; 98 return;
99 } 99 }
100 100
101 /* named constants */ 101 /* named constants */
102 for(i=0; p->const_name[i]; i++){ 102 for(i=0; p->const_name && p->const_name[i]; i++){
103 if(strmatch(p->s, p->const_name[i])){ 103 if(strmatch(p->s, p->const_name[i])){
104 push(p, p->const_value[i]); 104 push(p, p->const_value[i]);
105 p->s+= strlen(p->const_name[i]); 105 p->s+= strlen(p->const_name[i]);
106 return; 106 return;
107 } 107 }
145 else if( strmatch(next, "lte" ) ) d= d >= d2 ? 0.0 : 1.0; 145 else if( strmatch(next, "lte" ) ) d= d >= d2 ? 0.0 : 1.0;
146 else if( strmatch(next, "eq" ) ) d= d == d2 ? 1.0 : 0.0; 146 else if( strmatch(next, "eq" ) ) d= d == d2 ? 1.0 : 0.0;
147 // else if( strmatch(next, "l1" ) ) d= 1 + d2*(d - 1); 147 // else if( strmatch(next, "l1" ) ) d= 1 + d2*(d - 1);
148 // else if( strmatch(next, "sq01" ) ) d= (d >= 0.0 && d <=1.0) ? 1.0 : 0.0; 148 // else if( strmatch(next, "sq01" ) ) d= (d >= 0.0 && d <=1.0) ? 1.0 : 0.0;
149 else{ 149 else{
150 int error=1;
151 for(i=0; p->func1_name && p->func1_name[i]; i++){ 150 for(i=0; p->func1_name && p->func1_name[i]; i++){
152 if(strmatch(next, p->func1_name[i])){ 151 if(strmatch(next, p->func1_name[i])){
153 d= p->func1[i](p->opaque, d); 152 d= p->func1[i](p->opaque, d);
154 error=0; 153 goto push_ret;
155 break;
156 } 154 }
157 } 155 }
158 156
159 for(i=0; p->func2_name && p->func2_name[i]; i++){ 157 for(i=0; p->func2_name && p->func2_name[i]; i++){
160 if(strmatch(next, p->func2_name[i])){ 158 if(strmatch(next, p->func2_name[i])){
161 d= p->func2[i](p->opaque, d, d2); 159 d= p->func2[i](p->opaque, d, d2);
162 error=0; 160 goto push_ret;
163 break;
164 } 161 }
165 } 162 }
166 163
167 if(error){ 164 av_log(NULL, AV_LOG_ERROR, "Parser: unknown function in \"%s\"\n", next);
168 av_log(NULL, AV_LOG_ERROR, "Parser: unknown function in \"%s\"\n", next); 165 return;
169 return; 166 }
170 } 167
171 } 168 push_ret:
172
173 push(p, d); 169 push(p, d);
174 } 170 }
175 171
176 static void evalPow(Parser *p){ 172 static void evalPow(Parser *p){
177 int neg= 0; 173 int neg= 0;
181 neg= 1; 177 neg= 1;
182 p->s++; 178 p->s++;
183 } 179 }
184 180
185 if(p->s[0]=='('){ 181 if(p->s[0]=='('){
186 p->s++;; 182 p->s++;
187 evalExpression(p); 183 evalExpression(p);
188 184
189 if(p->s[0]!=')') 185 if(p->s[0]!=')')
190 av_log(NULL, AV_LOG_ERROR, "Parser: missing )\n"); 186 av_log(NULL, AV_LOG_ERROR, "Parser: missing )\n");
191 p->s++; 187 p->s++;
253 p.opaque = opaque; 249 p.opaque = opaque;
254 250
255 evalExpression(&p); 251 evalExpression(&p);
256 return pop(&p); 252 return pop(&p);
257 } 253 }
254
255 #ifdef TEST
256 #undef printf
257 static double const_values[]={
258 M_PI,
259 M_E,
260 0
261 };
262 static const char *const_names[]={
263 "PI",
264 "E",
265 0
266 };
267 main(){
268 printf("%f == 12.7\n", ff_eval("1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", const_values, const_names, NULL, NULL, NULL, NULL, NULL));
269 }
270 #endif