diff options
author | wm4 <wm4@nowhere> | 2015-04-19 15:31:17 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-04-19 15:31:17 +0200 |
commit | 8e0cf9d878cd25977d0de312c5746117fe33c6a9 (patch) | |
tree | 0428c1d3b72be064932a9db00df16dcdec2f1d69 | |
parent | c96404d8243ffaea958b6d1ab16e73dd0aaf9276 (diff) |
options: change [...] to balanced quotes
Useful for dealing with libavfilter's terrible graph syntax.
Not strictly backwards compatible (for example "[a[b]" fails now - the
"[" within the quote is interpreted now). But hopefully it's obscure
enough not to warrant any kind of compatibility hacks.
-rw-r--r-- | DOCS/man/mpv.rst | 4 | ||||
-rw-r--r-- | options/m_option.c | 13 |
2 files changed, 15 insertions, 2 deletions
diff --git a/DOCS/man/mpv.rst b/DOCS/man/mpv.rst index a2e47a1a6e..ec25d720ff 100644 --- a/DOCS/man/mpv.rst +++ b/DOCS/man/mpv.rst @@ -278,7 +278,9 @@ quotes. The ``[...]`` from of quotes wraps everything between ``[`` and ``]``. It's useful with shells that don't interpret these characters in the middle of -an argument (like bash). +an argument (like bash). These quotes are balanced (since mpv 0.9.0): the ``[`` +and ``]`` nest, and the quote terminates on the last ``]`` that has no matching +``[`` within the string. (For example, ``[a[b]c]`` results in ``a[b]c``.) The fixed-length quoting syntax is intended for use with external scripts and programs. diff --git a/options/m_option.c b/options/m_option.c index b5c865b8b4..bd8e3357b9 100644 --- a/options/m_option.c +++ b/options/m_option.c @@ -1736,11 +1736,22 @@ static int read_subparam(struct mp_log *log, bstr optname, } p = bstr_cut(p, 1); } else if (bstr_eatstart0(&p, "[")) { - if (!bstr_split_tok(p, "]", &subparam, &p)) { + bstr s = p; + int balance = 1; + while (p.len && balance > 0) { + if (p.start[0] == '[') { + balance++; + } else if (p.start[0] == ']') { + balance--; + } + p = bstr_cut(p, 1); + } + if (balance != 0) { mp_err(log, "Terminating ']' missing for '%.*s'\n", BSTR_P(optname)); return M_OPT_INVALID; } + subparam = bstr_splice(s, 0, s.len - p.len - 1); } else if (bstr_eatstart0(&p, "%")) { int optlen = bstrtoll(p, &p, 0); if (!bstr_startswith0(p, "%") || (optlen > p.len - 1)) { |