|
|
@ -185,6 +185,9 @@ static AVEvalExpr * parse_primary(Parser *p) { |
|
|
|
char *next= p->s; |
|
|
|
char *next= p->s; |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!d) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
|
|
/* number */ |
|
|
|
/* number */ |
|
|
|
d->value = av_strtod(p->s, &next); |
|
|
|
d->value = av_strtod(p->s, &next); |
|
|
|
if(next != p->s){ |
|
|
|
if(next != p->s){ |
|
|
@ -288,6 +291,8 @@ static AVEvalExpr * parse_primary(Parser *p) { |
|
|
|
|
|
|
|
|
|
|
|
static AVEvalExpr * new_eval_expr(int type, int value, AVEvalExpr *p0, AVEvalExpr *p1){ |
|
|
|
static AVEvalExpr * new_eval_expr(int type, int value, AVEvalExpr *p0, AVEvalExpr *p1){ |
|
|
|
AVEvalExpr * e = av_mallocz(sizeof(AVEvalExpr)); |
|
|
|
AVEvalExpr * e = av_mallocz(sizeof(AVEvalExpr)); |
|
|
|
|
|
|
|
if (!e) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
e->type =type ; |
|
|
|
e->type =type ; |
|
|
|
e->value =value ; |
|
|
|
e->value =value ; |
|
|
|
e->param[0] =p0 ; |
|
|
|
e->param[0] =p0 ; |
|
|
@ -307,6 +312,8 @@ static AVEvalExpr * parse_factor(Parser *p){ |
|
|
|
while(p->s[0]=='^'){ |
|
|
|
while(p->s[0]=='^'){ |
|
|
|
p->s++; |
|
|
|
p->s++; |
|
|
|
e= new_eval_expr(e_pow, 1, e, parse_pow(p, &sign2)); |
|
|
|
e= new_eval_expr(e_pow, 1, e, parse_pow(p, &sign2)); |
|
|
|
|
|
|
|
if (!e) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
if (e->param[1]) e->param[1]->value *= (sign2|1); |
|
|
|
if (e->param[1]) e->param[1]->value *= (sign2|1); |
|
|
|
} |
|
|
|
} |
|
|
|
if (e) e->value *= (sign|1); |
|
|
|
if (e) e->value *= (sign|1); |
|
|
@ -318,6 +325,8 @@ static AVEvalExpr * parse_term(Parser *p){ |
|
|
|
while(p->s[0]=='*' || p->s[0]=='/'){ |
|
|
|
while(p->s[0]=='*' || p->s[0]=='/'){ |
|
|
|
int c= *p->s++; |
|
|
|
int c= *p->s++; |
|
|
|
e= new_eval_expr(c == '*' ? e_mul : e_div, 1, e, parse_factor(p)); |
|
|
|
e= new_eval_expr(c == '*' ? e_mul : e_div, 1, e, parse_factor(p)); |
|
|
|
|
|
|
|
if (!e) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
return e; |
|
|
|
return e; |
|
|
|
} |
|
|
|
} |
|
|
@ -326,6 +335,8 @@ static AVEvalExpr * parse_subexpr(Parser *p) { |
|
|
|
AVEvalExpr * e = parse_term(p); |
|
|
|
AVEvalExpr * e = parse_term(p); |
|
|
|
while(*p->s == '+' || *p->s == '-') { |
|
|
|
while(*p->s == '+' || *p->s == '-') { |
|
|
|
e= new_eval_expr(e_add, 1, e, parse_term(p)); |
|
|
|
e= new_eval_expr(e_add, 1, e, parse_term(p)); |
|
|
|
|
|
|
|
if (!e) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
return e; |
|
|
|
return e; |
|
|
@ -343,6 +354,8 @@ static AVEvalExpr * parse_expr(Parser *p) { |
|
|
|
while(*p->s == ';') { |
|
|
|
while(*p->s == ';') { |
|
|
|
p->s++; |
|
|
|
p->s++; |
|
|
|
e= new_eval_expr(e_last, 1, e, parse_subexpr(p)); |
|
|
|
e= new_eval_expr(e_last, 1, e, parse_subexpr(p)); |
|
|
|
|
|
|
|
if (!e) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
p->stack_index++; |
|
|
|
p->stack_index++; |
|
|
|