diff --git a/doc/eval.texi b/doc/eval.texi index b41f31ec26ea113e249a12da738b693b91ce85cb..18d848749a0fb8db244ea6208a3fc200486667f9 100644 --- a/doc/eval.texi +++ b/doc/eval.texi @@ -99,6 +99,16 @@ Return the greatest common divisor of @var{x} and @var{y}. If both @var{x} and @var{y} are 0 or either or both are less than zero then behavior is undefined. @end table +The following constants are available: +@table @option +@item PI +area of the unit disc, approximatively 3.14 +@item E +exp(1) (Euler's number), approximatively 2.718 +@item PHI +golden ratio (1+sqrt(5))/2, approximatively 1.618 +@end table + Note that: @code{*} works like AND diff --git a/libavutil/eval.c b/libavutil/eval.c index 0c61ad072bb3258f2b2aa264183e44b13f20cf1d..3a8b60d5052d4fe0926c7ffafe89de02670bb68d 100644 --- a/libavutil/eval.c +++ b/libavutil/eval.c @@ -72,6 +72,15 @@ static const int8_t si_prefixes['z' - 'E' + 1] = { ['Y'-'E']= 24, }; +static const struct { + const char *name; + double value; +} constants[] = { + { "E", M_E }, + { "PI", M_PI }, + { "PHI", M_PHI }, +}; + double av_strtod(const char *numstr, char **tail) { double d; @@ -233,6 +242,15 @@ static int parse_primary(AVExpr **e, Parser *p) return 0; } } + for (i = 0; i < FF_ARRAY_ELEMS(constants); i++) { + if (strmatch(p->s, constants[i].name)) { + p->s += strlen(constants[i].name); + d->type = e_value; + d->value = constants[i].value; + *e = d; + return 0; + } + } p->s= strchr(p->s, '('); if (p->s==NULL) {