summaryrefslogtreecommitdiffstats
path: root/m_option.c
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-07-28 17:07:49 +0200
committerwm4 <wm4@mplayer2.org>2012-07-28 17:24:05 +0200
commit51e198c2a1e43b74ad35ef358628dcd8791158d9 (patch)
tree60f6c2255ed912a7a4866b71728104a2cb2442f1 /m_option.c
parent2793e7eb70a342b346788f83e1ed660c8e0d491e (diff)
parent7dfaaa95104a8e6dc024fddaf1b49c71768f1be7 (diff)
downloadmpv-51e198c2a1e43b74ad35ef358628dcd8791158d9.tar.bz2
mpv-51e198c2a1e43b74ad35ef358628dcd8791158d9.tar.xz
Merge remote-tracking branch 'origin/master'
Conflicts: .gitignore bstr.c cfg-mplayer.h defaultopts.c libvo/video_out.c The conflict in bstr.c is due to uau adding a bstr_getline function in commit 2ba8b91a97e7e8. This function already existed in this branch. While uau's function is obviously derived from mine, it's incompatible. His function preserves line breaks, while mine strips them. Add a bstr_strip_linebreaks function, fix all other uses of bstr_getline, and pick uau's implementation. In .gitignore, change vo_gl3_shaders.h to use an absolute path additional to resolving the merge conflict.
Diffstat (limited to 'm_option.c')
-rw-r--r--m_option.c114
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;