From f988c6300344492c4a8d8db11c47a4ebed4e858b Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 20 Sep 2013 22:53:06 +0200 Subject: m_property: add a way to switch on property values in property expansion Allows for example: --status-msg='${?pause==yes:(Paused) } ...' to emulate the normal terminal status line. It's useful in other situations too. I'm a bit worried about extending this mini-DSL, and sure hope nobody will implement a generic formula evaluator at some point in the future. But for now we're probably safe. --- DOCS/man/en/input.rst | 18 +++++++++++++++--- mpvcore/m_property.c | 12 +++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/DOCS/man/en/input.rst b/DOCS/man/en/input.rst index e40457e099..362e8a4cf8 100644 --- a/DOCS/man/en/input.rst +++ b/DOCS/man/en/input.rst @@ -509,15 +509,27 @@ The following expansions are supported: fails, expand to an error string. (Use ``${NAME:}`` with a trailing ``:`` to expand to an empty string instead.) If ``NAME`` is prefixed with ``=``, expand to the raw value of the property - (see below). + (see section below). ``${NAME:STR}`` Expands to the value of the property ``NAME``, or ``STR`` if the property cannot be retrieved. ``STR`` is expanded recursively. +``${?NAME:STR}`` + Expands to ``STR`` (recursively) if the property ``NAME`` is available. ``${!NAME:STR}`` Expands to ``STR`` (recursively) if the property ``NAME`` cannot be retrieved. -``${?NAME:STR}`` - Expands to ``STR`` (recursively) if the property ``NAME`` is available. +``${?NAME==VALUE:STR}`` + Expands to ``STR`` (recursively) if the property ``NAME`` expands to a + string equal to ``VALUE``. You can prefix ``NAME`` with ``=`` in order to + compare the raw value of a property (see section below). If the property + is unavailable, or other errors happen when retrieving it, the value is + never considered equal. + Note that ``VALUE`` can't contain any of the characters ``:`` or ``}``. + Also, it is possible that escaping with ``"`` or ``%`` might be added in + the future, should the need arise. +``${!NAME==VALUE:STR}`` + Same as with the ``?`` variant, but ``STR`` is expanded if the value is + not equal. (Using the same semantics as with ``?``.) ``$$`` Expands to ``$``. ``$}`` diff --git a/mpvcore/m_property.c b/mpvcore/m_property.c index 83c6ea1018..6e25bf4e43 100644 --- a/mpvcore/m_property.c +++ b/mpvcore/m_property.c @@ -219,14 +219,20 @@ static int expand_property(const m_option_t *prop_list, char **ret, int *ret_len { bool cond_yes = bstr_eatstart0(&prop, "?"); bool cond_no = !cond_yes && bstr_eatstart0(&prop, "!"); + bool test = cond_yes || cond_no; bool raw = bstr_eatstart0(&prop, "="); - int method = - (raw || cond_yes || cond_no) ? M_PROPERTY_GET_STRING : M_PROPERTY_PRINT; + bstr comp_with = {0}; + bool comp = test && bstr_split_tok(prop, "==", &prop, &comp_with); + if (test && !comp) + raw = true; + int method = raw ? M_PROPERTY_GET_STRING : M_PROPERTY_PRINT; char *s = NULL; int r = m_property_do_bstr(prop_list, prop, method, &s, ctx); bool skip; - if (cond_yes || cond_no) { + if (comp) { + skip = ((s && bstr_equals0(comp_with, s)) != cond_yes); + } else if (test) { skip = (!!s != cond_yes); } else { skip = !!s; -- cgit v1.2.3