diff options
Diffstat (limited to 'm_option.c')
-rw-r--r-- | m_option.c | 114 |
1 files changed, 62 insertions, 52 deletions
diff --git a/m_option.c b/m_option.c index 0ca3ed9f29..086f2c8842 100644 --- a/m_option.c +++ b/m_option.c @@ -77,7 +77,8 @@ const m_option_t *m_option_list_find(const m_option_t *list, const char *name) // Default function that just does a memcpy -static void copy_opt(const m_option_t *opt, void *dst, const void *src) +static void copy_opt(const m_option_t *opt, void *dst, const void *src, + void *talloc_ctx) { if (dst && src) memcpy(dst, src, opt->type->size); @@ -88,7 +89,8 @@ static void copy_opt(const m_option_t *opt, void *dst, const void *src) #define VAL(x) (*(int *)(x)) static int parse_flag(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { if (param.len && !ambiguous_param) { char * const enable[] = { "yes", "on", "ja", "si", "igen", "y", "j", @@ -177,7 +179,8 @@ static int parse_longlong(const m_option_t *opt, struct bstr name, } static int parse_int(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { long long tmp; int r = parse_longlong(opt, name, param, false, &tmp); @@ -187,7 +190,8 @@ static int parse_int(const m_option_t *opt, struct bstr name, } static int parse_int64(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { long long tmp; int r = parse_longlong(opt, name, param, false, &tmp); @@ -221,7 +225,8 @@ const m_option_type_t m_option_type_int64 = { }; static int parse_intpair(const struct m_option *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { if (param.len == 0) return M_OPT_MISSING_PARAM; @@ -264,7 +269,8 @@ const struct m_option_type m_option_type_intpair = { }; static int parse_choice(const struct m_option *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { bool allow_empty = opt->flags & M_OPT_IMPLICIT_DEFAULT; int ret; @@ -320,7 +326,8 @@ const struct m_option_type m_option_type_choice = { #define VAL(x) (*(double *)(x)) static int parse_double(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { if (param.len == 0) return M_OPT_MISSING_PARAM; @@ -394,10 +401,11 @@ const m_option_type_t m_option_type_double = { #define VAL(x) (*(float *)(x)) static int parse_float(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { double tmp; - int r = parse_double(opt, name, param, false, &tmp); + int r = parse_double(opt, name, param, false, &tmp, NULL); if (r == 1 && dst) VAL(dst) = tmp; return r; @@ -423,7 +431,8 @@ const m_option_type_t m_option_type_float = { #define VAL(x) (*(off_t *)(x)) static int parse_position(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { long long tmp; int r = parse_longlong(opt, name, param, false, &tmp); @@ -453,8 +462,12 @@ const m_option_type_t m_option_type_position = { #define VAL(x) (*(char **)(x)) static int parse_str(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { + if (param.start == NULL) + return M_OPT_MISSING_PARAM; + if ((opt->flags & M_OPT_MIN) && (param.len < opt->min)) { mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Parameter must be >= %d chars: %.*s\n", @@ -471,7 +484,7 @@ static int parse_str(const m_option_t *opt, struct bstr name, if (dst) { talloc_free(VAL(dst)); - VAL(dst) = bstrdup0(NULL, param); + VAL(dst) = bstrdup0(talloc_ctx, param); } return 1; @@ -483,11 +496,12 @@ static char *print_str(const m_option_t *opt, const void *val) return (val && VAL(val)) ? talloc_strdup(NULL, VAL(val)) : NULL; } -static void copy_str(const m_option_t *opt, void *dst, const void *src) +static void copy_str(const m_option_t *opt, void *dst, const void *src, + void *talloc_ctx) { if (dst && src) { talloc_free(VAL(dst)); - VAL(dst) = talloc_strdup(NULL, VAL(src)); + VAL(dst) = talloc_strdup(talloc_ctx, VAL(src)); } } @@ -535,7 +549,7 @@ static void free_str_list(void *dst) VAL(dst) = NULL; } -static int str_list_add(char **add, int n, void *dst, int pre) +static int str_list_add(char **add, int n, void *dst, int pre, void *talloc_ctx) { char **lst = VAL(dst); int ln; @@ -639,7 +653,8 @@ static struct bstr get_nextsep(struct bstr *ptr, char sep, bool modify) } static int parse_str_list(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { char **res; int op = OP_NONE; @@ -688,14 +703,14 @@ static int parse_str_list(const m_option_t *opt, struct bstr name, if (!dst) return 1; - res = talloc_array(NULL, char *, n + 2); + res = talloc_array(talloc_ctx, char *, n + 2); str = bstrdup(NULL, param); char *ptr = str.start; n = 0; while (1) { struct bstr el = get_nextsep(&str, separator, 1); - res[n] = bstrdup0(NULL, el); + res[n] = bstrdup0(talloc_ctx, el); n++; if (!str.len) break; @@ -706,9 +721,9 @@ static int parse_str_list(const m_option_t *opt, struct bstr name, switch (op) { case OP_ADD: - return str_list_add(res, n, dst, 0); + return str_list_add(res, n, dst, 0, talloc_ctx); case OP_PRE: - return str_list_add(res, n, dst, 1); + return str_list_add(res, n, dst, 1, talloc_ctx); case OP_DEL: return str_list_del(res, n, dst); } @@ -720,7 +735,8 @@ static int parse_str_list(const m_option_t *opt, struct bstr name, return 1; } -static void copy_str_list(const m_option_t *opt, void *dst, const void *src) +static void copy_str_list(const m_option_t *opt, void *dst, const void *src, + void *talloc_ctx) { int n; char **d, **s; @@ -739,9 +755,9 @@ static void copy_str_list(const m_option_t *opt, void *dst, const void *src) for (n = 0; s[n] != NULL; n++) /* NOTHING */; - d = talloc_array(NULL, char *, n + 1); + d = talloc_array(talloc_ctx, char *, n + 1); for (; n >= 0; n--) - d[n] = talloc_strdup(NULL, s[n]); + d[n] = talloc_strdup(talloc_ctx, s[n]); VAL(dst) = d; } @@ -785,7 +801,8 @@ const m_option_type_t m_option_type_string_list = { /////////////////// Print static int parse_print(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { if (opt->type == CONF_TYPE_PRINT_INDIRECT) mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", *(char **) opt->p); @@ -826,16 +843,16 @@ const m_option_type_t m_option_type_print_func = { #define VAL(x) (*(char ***)(x)) static int parse_subconf(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { - int nr = 0, i; + int nr = 0; char **lst = NULL; if (param.len == 0) return M_OPT_MISSING_PARAM; struct bstr p = param; - const struct m_option *subopts = opt->p; while (p.len) { int optlen = bstrcspn(p, ":="); @@ -881,23 +898,10 @@ static int parse_subconf(const m_option_t *opt, struct bstr name, return M_OPT_INVALID; } - for (i = 0; subopts[i].name; i++) - if (!bstrcmp0(subopt, subopts[i].name)) - break; - if (!subopts[i].name) { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, - "Option %.*s: Unknown suboption %.*s\n", - BSTR_P(name), BSTR_P(subopt)); - return M_OPT_UNKNOWN; - } - int r = m_option_parse(&subopts[i], subopt, subparam, false, NULL); - if (r < 0) - return r; if (dst) { lst = talloc_realloc(NULL, lst, char *, 2 * (nr + 2)); - lst[2 * nr] = bstrdup0(NULL, subopt); - lst[2 * nr + 1] = subparam.len == 0 ? NULL : - bstrdup0(NULL, subparam); + lst[2 * nr] = bstrdup0(lst, subopt); + lst[2 * nr + 1] = bstrdup0(lst, subparam); memset(&lst[2 * (nr + 1)], 0, 2 * sizeof(char *)); nr++; } @@ -998,7 +1002,8 @@ static struct { }; static int parse_imgfmt(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { uint32_t fmt = 0; int i; @@ -1088,7 +1093,8 @@ static struct { }; static int parse_afmt(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { uint32_t fmt = 0; int i; @@ -1156,7 +1162,8 @@ static int parse_timestring(struct bstr str, double *time, char endchar) static int parse_time(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { double time; @@ -1186,7 +1193,8 @@ const m_option_type_t m_option_type_time = { // Time or size (-endpos) static int parse_time_size(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { m_time_size_t ts; char unit[4]; @@ -1418,7 +1426,8 @@ static int get_obj_params(struct bstr opt_name, struct bstr name, } static int parse_obj_params(const m_option_t *opt, struct bstr name, - struct bstr param, bool ambiguous_param, void *dst) + struct bstr param, bool ambiguous_param, void *dst, + void *talloc_ctx) { char **opts; int r; @@ -1616,7 +1625,7 @@ static void free_obj_settings_list(void *dst) static int parse_obj_settings_list(const m_option_t *opt, struct bstr name, struct bstr param, bool ambiguous_param, - void *dst) + void *dst, void *talloc_ctx) { int len = strlen(opt->name); m_obj_settings_t *res = NULL, *queue = NULL, *head = NULL; @@ -1747,7 +1756,7 @@ static int parse_obj_settings_list(const m_option_t *opt, struct bstr name, } static void copy_obj_settings_list(const m_option_t *opt, void *dst, - const void *src) + const void *src, void *talloc_ctx) { m_obj_settings_t *d, *s; int n; @@ -1770,7 +1779,7 @@ static void copy_obj_settings_list(const m_option_t *opt, void *dst, for (n = 0; s[n].name; n++) { d[n].name = talloc_strdup(NULL, s[n].name); d[n].attribs = NULL; - copy_str_list(NULL, &(d[n].attribs), &(s[n].attribs)); + copy_str_list(NULL, &(d[n].attribs), &(s[n].attribs), NULL); } d[n].name = NULL; d[n].attribs = NULL; @@ -1790,7 +1799,7 @@ const m_option_type_t m_option_type_obj_settings_list = { static int parse_obj_presets(const m_option_t *opt, struct bstr name, struct bstr param, bool ambiguous_param, - void *dst) + void *dst, void *talloc_ctx) { m_obj_presets_t *obj_p = (m_obj_presets_t *)opt->priv; const m_struct_t *in_desc; @@ -1865,7 +1874,8 @@ const m_option_type_t m_option_type_obj_presets = { }; static int parse_custom_url(const m_option_t *opt, struct bstr name, - struct bstr url, bool ambiguous_param, void *dst) + struct bstr url, bool ambiguous_param, void *dst, + void *talloc_ctx) { int r; m_struct_t *desc = opt->priv; |