summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-06-27 11:25:02 +0200
committerwm4 <wm4@nowhere>2017-06-27 11:25:02 +0200
commit1328005937535952ac3bfee07885f2e36edb6255 (patch)
tree38f26026ff99481fc46de1df5b92b6a352eb2db5
parentc8930d0be283abef7701efb176a2225070392b2f (diff)
downloadmpv-1328005937535952ac3bfee07885f2e36edb6255.tar.bz2
mpv-1328005937535952ac3bfee07885f2e36edb6255.tar.xz
options: expose string list actions for --sub-file option
This means you can use --sub-file-set=a,b,c to set a string list separated by ',', while --sub-file=filename,with,commas.srt still works (the original motivation for changing the --sub-file option this way). You can also use it to append strings to string list options without the need for escale, e.g.: --opengl-shaders-add-str=unescapesdfilename.glsl (The normal -add for some reason expects a ',' separated list as argument.)
-rw-r--r--options/m_option.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/options/m_option.c b/options/m_option.c
index 333417e438..6b9179aec4 100644
--- a/options/m_option.c
+++ b/options/m_option.c
@@ -1090,6 +1090,7 @@ const m_option_type_t m_option_type_string = {
#define OP_DEL 3
#define OP_CLR 4
#define OP_TOGGLE 5
+#define OP_ADD_STR 6
static void free_str_list(void *dst)
{
@@ -1206,14 +1207,17 @@ static struct bstr get_nextsep(struct bstr *ptr, char sep, bool modify)
return bstr_splice(orig, 0, str.start - orig.start);
}
-static int parse_str_list(struct mp_log *log, const m_option_t *opt,
- struct bstr name, struct bstr param, void *dst)
+static int parse_str_list_impl(struct mp_log *log, const m_option_t *opt,
+ struct bstr name, struct bstr param, void *dst,
+ int default_op)
{
char **res;
- int op = OP_NONE;
+ int op = default_op;
if (bstr_endswith0(name, "-add")) {
op = OP_ADD;
+ } else if (bstr_endswith0(name, "-add-str")) {
+ op = OP_ADD_STR;
} else if (bstr_endswith0(name, "-pre")) {
op = OP_PRE;
} else if (bstr_endswith0(name, "-del")) {
@@ -1235,6 +1239,19 @@ static int parse_str_list(struct mp_log *log, const m_option_t *opt,
if (param.len == 0 && op != OP_NONE)
return M_OPT_MISSING_PARAM;
+ if (op == OP_ADD_STR) {
+ if (dst) {
+ char **list= VAL(dst);
+ int len = 0;
+ while (list && list[len])
+ len++;
+ MP_TARRAY_APPEND(NULL, list, len, bstrto0(NULL, param));
+ MP_TARRAY_APPEND(NULL, list, len, NULL);
+ VAL(dst) = list;
+ }
+ return 1;
+ }
+
// custom type for "profile" calls this but uses ->priv for something else
char separator = opt->type == &m_option_type_string_list && opt->priv ?
*(char *)opt->priv : OPTION_LIST_SEPARATOR;
@@ -1366,6 +1383,12 @@ static int str_list_get(const m_option_t *opt, void *ta_parent,
return 1;
}
+static int parse_str_list(struct mp_log *log, const m_option_t *opt,
+ struct bstr name, struct bstr param, void *dst)
+{
+ return parse_str_list_impl(log, opt, name, param, dst, OP_NONE);
+}
+
const m_option_type_t m_option_type_string_list = {
.name = "String list",
.size = sizeof(char **),
@@ -1376,6 +1399,7 @@ const m_option_type_t m_option_type_string_list = {
.get = str_list_get,
.set = str_list_set,
.actions = (const struct m_option_action[]){
+ {"add-str"},
{"set"},
{"add"},
{"pre"},
@@ -1385,32 +1409,14 @@ const m_option_type_t m_option_type_string_list = {
},
};
-static void str_list_append(void *dst, bstr s)
-{
- if (!dst)
- return;
- char **list= VAL(dst);
- int len = 0;
- while (list && list[len])
- len++;
- MP_TARRAY_APPEND(NULL, list, len, bstrto0(NULL, s));
- MP_TARRAY_APPEND(NULL, list, len, NULL);
- VAL(dst) = list;
-}
-
static int parse_str_append_list(struct mp_log *log, const m_option_t *opt,
struct bstr name, struct bstr param, void *dst)
{
- if (param.len == 0)
- return M_OPT_MISSING_PARAM;
-
- str_list_append(dst, param);
-
- return 1;
+ return parse_str_list_impl(log, opt, name, param, dst, OP_ADD_STR);
}
const m_option_type_t m_option_type_string_append_list = {
- .name = "String list",
+ .name = "String list (append by default)",
.size = sizeof(char **),
.parse = parse_str_append_list,
.print = print_str_list,
@@ -1418,6 +1424,15 @@ const m_option_type_t m_option_type_string_append_list = {
.free = free_str_list,
.get = str_list_get,
.set = str_list_set,
+ .actions = (const struct m_option_action[]){
+ {"add-str"},
+ {"set"},
+ {"add"},
+ {"pre"},
+ {"del"},
+ {"clr", M_OPT_TYPE_OPTIONAL_PARAM},
+ {0}
+ },
};
static int read_subparam(struct mp_log *log, bstr optname, char *termset,