Commit 3c2c52ba authored by Stefano Sabatini's avatar Stefano Sabatini

eval: implement not() expression

parent cf06e3e4
...@@ -76,6 +76,9 @@ integer. For example, "trunc(-1.5)" is "-1.0". ...@@ -76,6 +76,9 @@ integer. For example, "trunc(-1.5)" is "-1.0".
@item sqrt(expr) @item sqrt(expr)
Compute the square root of @var{expr}. This is equivalent to Compute the square root of @var{expr}. This is equivalent to
"(@var{expr})^.5". "(@var{expr})^.5".
@item not(expr)
Return 1.0 if @var{expr} is zero, 0.0 otherwise.
@end table @end table
Note that: Note that:
...@@ -93,11 +96,6 @@ is equivalent to ...@@ -93,11 +96,6 @@ is equivalent to
A*B + not(A)*C A*B + not(A)*C
@end example @end example
When A evaluates to either 1 or 0, that is the same as
@example
A*B + eq(A,0)*C
@end example
In your C code, you can extend the list of unary and binary functions, In your C code, you can extend the list of unary and binary functions,
and define recognized constants, so that they are available for your and define recognized constants, so that they are available for your
expressions. expressions.
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#define LIBAVUTIL_VERSION_MAJOR 51 #define LIBAVUTIL_VERSION_MAJOR 51
#define LIBAVUTIL_VERSION_MINOR 2 #define LIBAVUTIL_VERSION_MINOR 2
#define LIBAVUTIL_VERSION_MICRO 1 #define LIBAVUTIL_VERSION_MICRO 2
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \ LIBAVUTIL_VERSION_MINOR, \
......
...@@ -125,7 +125,7 @@ struct AVExpr { ...@@ -125,7 +125,7 @@ struct AVExpr {
e_mod, e_max, e_min, e_eq, e_gt, e_gte, e_mod, e_max, e_min, e_eq, e_gt, e_gte,
e_pow, e_mul, e_div, e_add, e_pow, e_mul, e_div, e_add,
e_last, e_st, e_while, e_floor, e_ceil, e_trunc, e_last, e_st, e_while, e_floor, e_ceil, e_trunc,
e_sqrt, e_sqrt, e_not,
} type; } type;
double value; // is sign in other types double value; // is sign in other types
union { union {
...@@ -153,6 +153,7 @@ static double eval_expr(Parser *p, AVExpr *e) ...@@ -153,6 +153,7 @@ static double eval_expr(Parser *p, AVExpr *e)
case e_ceil : return e->value * ceil (eval_expr(p, e->param[0])); case e_ceil : return e->value * ceil (eval_expr(p, e->param[0]));
case e_trunc: return e->value * trunc(eval_expr(p, e->param[0])); case e_trunc: return e->value * trunc(eval_expr(p, e->param[0]));
case e_sqrt: return e->value * sqrt (eval_expr(p, e->param[0])); case e_sqrt: return e->value * sqrt (eval_expr(p, e->param[0]));
case e_not: return e->value * eval_expr(p, e->param[0]) == 0;
case e_while: { case e_while: {
double d = NAN; double d = NAN;
while (eval_expr(p, e->param[0])) while (eval_expr(p, e->param[0]))
...@@ -288,6 +289,7 @@ static int parse_primary(AVExpr **e, Parser *p) ...@@ -288,6 +289,7 @@ static int parse_primary(AVExpr **e, Parser *p)
else if (strmatch(next, "ceil" )) d->type = e_ceil; else if (strmatch(next, "ceil" )) d->type = e_ceil;
else if (strmatch(next, "trunc" )) d->type = e_trunc; else if (strmatch(next, "trunc" )) d->type = e_trunc;
else if (strmatch(next, "sqrt" )) d->type = e_sqrt; else if (strmatch(next, "sqrt" )) d->type = e_sqrt;
else if (strmatch(next, "not" )) d->type = e_not;
else { else {
for (i=0; p->func1_names && p->func1_names[i]; i++) { for (i=0; p->func1_names && p->func1_names[i]; i++) {
if (strmatch(next, p->func1_names[i])) { if (strmatch(next, p->func1_names[i])) {
...@@ -456,6 +458,7 @@ static int verify_expr(AVExpr *e) ...@@ -456,6 +458,7 @@ static int verify_expr(AVExpr *e)
case e_ceil: case e_ceil:
case e_trunc: case e_trunc:
case e_sqrt: case e_sqrt:
case e_not:
return verify_expr(e->param[0]); return verify_expr(e->param[0]);
default: return verify_expr(e->param[0]) && verify_expr(e->param[1]); default: return verify_expr(e->param[0]) && verify_expr(e->param[1]);
} }
...@@ -637,6 +640,9 @@ int main(void) ...@@ -637,6 +640,9 @@ int main(void)
"ceil(-123.123)", "ceil(-123.123)",
"sqrt(1764)", "sqrt(1764)",
"sqrt(-1)", "sqrt(-1)",
"not(1)",
"not(NAN)",
"not(0)",
NULL NULL
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment