summaryrefslogtreecommitdiffstats
path: root/options
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-03-26 13:13:34 +0200
committerwm4 <wm4@nowhere>2017-03-26 13:13:34 +0200
commita94013f5857e4a335cc1da4cf3926a613f422b5c (patch)
tree9664622d61c814c175dfc57554c65591bd1fd1a1 /options
parent439e2b43c33f48fe380d8c43c39836ec9a96064b (diff)
downloadmpv-a94013f5857e4a335cc1da4cf3926a613f422b5c.tar.bz2
mpv-a94013f5857e4a335cc1da4cf3926a613f422b5c.tar.xz
command: change and simplify filter toggle syntax
"@name:!" becomes simply "@name". This is actually slightly more complex to parse, but makes for a much simpler syntax and will be less weird to the user. Suggested by haasn. The old syntax is now rejected with an error. Also add some more explicit error checks, instead of e.g. allowing empty filter names and erroring only when it's not found.
Diffstat (limited to 'options')
-rw-r--r--options/m_option.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/options/m_option.c b/options/m_option.c
index 796677696a..a30f89d18d 100644
--- a/options/m_option.c
+++ b/options/m_option.c
@@ -2762,15 +2762,31 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt, int op,
int r;
char **plist = NULL;
struct m_obj_desc desc;
+ bstr str = {0};
bstr label = {0};
bool nopos = list->disallow_positional_parameters;
bool enabled = true;
if (bstr_eatstart0(pstr, "@")) {
- if (!bstr_split_tok(*pstr, ":", &label, pstr)) {
+ bstr rest;
+ if (!bstr_split_tok(*pstr, ":", &label, &rest)) {
+ // "@labelname" is the special enable/disable toggle syntax
+ if (op == OP_TOGGLE) {
+ int idx = bstrspn(*pstr, NAMECH);
+ label = bstr_splice(*pstr, 0, idx);
+ if (label.len) {
+ *pstr = bstr_cut(*pstr, idx);
+ goto done;
+ }
+ }
mp_err(log, "Option %.*s: ':' expected after label.\n", BSTR_P(opt));
return M_OPT_INVALID;
}
+ *pstr = rest;
+ if (label.len == 0) {
+ mp_err(log, "Option %.*s: label name expected.\n", BSTR_P(opt));
+ return M_OPT_INVALID;
+ }
}
if (list->allow_disable_entries && bstr_eatstart0(pstr, "!"))
@@ -2778,9 +2794,11 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt, int op,
bool has_param = false;
int idx = bstrspn(*pstr, NAMECH);
- bstr str = bstr_splice(*pstr, 0, idx);
- if (str.len == 0 && !enabled && label.len && op == OP_TOGGLE)
- goto done; // "@labelname:!" is the special enable/disable toggle syntax
+ str = bstr_splice(*pstr, 0, idx);
+ if (!str.len) {
+ mp_err(log, "Option %.*s: filter name expected.\n", BSTR_P(opt));
+ return M_OPT_INVALID;
+ }
*pstr = bstr_cut(*pstr, idx);
// video filters use "=", VOs use ":"
if (bstr_eatstart0(pstr, "=") || bstr_eatstart0(pstr, ":"))
@@ -3026,7 +3044,7 @@ static int parse_obj_settings_list(struct mp_log *log, const m_option_t *opt,
talloc_free(res);
} else if (op == OP_TOGGLE) {
for (int n = 0; res && res[n].name; n++) {
- if (!res[n].enabled && !res[n].name[0]) {
+ if (res[n].label && !res[n].name[0]) {
// Toggle enable/disable special case.
int found =
obj_settings_list_find_by_label0(list, res[n].label);