| 126 | }; |
| 127 | |
| 128 | static double eval_expr(Parser * p, AVExpr * e) { |
| 129 | switch (e->type) { |
| 130 | case e_value: return e->value; |
| 131 | case e_const: return e->value * p->const_value[e->a.const_index]; |
| 132 | case e_func0: return e->value * e->a.func0(eval_expr(p, e->param[0])); |
| 133 | case e_func1: return e->value * e->a.func1(p->opaque, eval_expr(p, e->param[0])); |
| 134 | case e_func2: return e->value * e->a.func2(p->opaque, eval_expr(p, e->param[0]), eval_expr(p, e->param[1])); |
| 135 | case e_squish: return 1/(1+exp(4*eval_expr(p, e->param[0]))); |
| 136 | case e_gauss: { double d = eval_expr(p, e->param[0]); return exp(-d*d/2)/sqrt(2*M_PI); } |
| 137 | case e_ld: return e->value * p->var[av_clip(eval_expr(p, e->param[0]), 0, VARS-1)]; |
| 138 | case e_while: { |
| 139 | double d = NAN; |
| 140 | while(eval_expr(p, e->param[0])) |
| 141 | d=eval_expr(p, e->param[1]); |
| 142 | return d; |
| 143 | } |
| 144 | default: { |
| 145 | double d = eval_expr(p, e->param[0]); |
| 146 | double d2 = eval_expr(p, e->param[1]); |
| 147 | switch (e->type) { |
| 148 | case e_mod: return e->value * (d - floor(d/d2)*d2); |
| 149 | case e_max: return e->value * (d > d2 ? d : d2); |
| 150 | case e_min: return e->value * (d < d2 ? d : d2); |
| 151 | case e_eq: return e->value * (d == d2 ? 1.0 : 0.0); |
| 152 | case e_gt: return e->value * (d > d2 ? 1.0 : 0.0); |
| 153 | case e_gte: return e->value * (d >= d2 ? 1.0 : 0.0); |
| 154 | case e_pow: return e->value * pow(d, d2); |
| 155 | case e_mul: return e->value * (d * d2); |
| 156 | case e_div: return e->value * (d / d2); |
| 157 | case e_add: return e->value * (d + d2); |
| 158 | case e_last:return e->value * d2; |
| 159 | case e_st : return e->value * (p->var[av_clip(d, 0, VARS-1)]= d2); |
| 160 | } |
| 161 | } |
| 162 | } |
| 163 | return NAN; |
| 164 | } |
| 165 | |
| 166 | static AVExpr * parse_expr(Parser *p); |
| 167 |
no test coverage detected