summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-10-24 20:18:09 +0200
committerwm4 <wm4@nowhere>2013-10-24 22:50:13 +0200
commit7204dee3c7cc86bddb513344912c3aa991a10684 (patch)
tree172ccbc1fd46703f14bacdadca7d0d1dc55b91e1
parentb707589e7e9dffed7176641d43521aae9144d669 (diff)
downloadmpv-7204dee3c7cc86bddb513344912c3aa991a10684.tar.bz2
mpv-7204dee3c7cc86bddb513344912c3aa991a10684.tar.xz
m_config: don't require dragging along parent in initialization
Instead, track the opstruct explicitly. It turns out we don't need the parent at all. Also, add something rudimentary to track the default values.
-rw-r--r--mpvcore/m_config.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/mpvcore/m_config.c b/mpvcore/m_config.c
index 17e886bbe0..be583f8f42 100644
--- a/mpvcore/m_config.c
+++ b/mpvcore/m_config.c
@@ -172,8 +172,9 @@ static void substruct_write_ptr(void *ptr, void *val)
}
static void add_options(struct m_config *config,
- struct m_config_option *parent,
const char *parent_name,
+ void *optstruct,
+ const void *optstruct_def,
const struct m_option *defs);
static void config_destroy(void *p)
@@ -202,7 +203,7 @@ struct m_config *m_config_new(void *talloc_parent, size_t size,
if (defaults)
memcpy(config->optstruct, defaults, size);
if (options)
- add_options(config, NULL, "", options);
+ add_options(config, "", config->optstruct, defaults, options);
}
if (suboptinit) {
bstr s = bstr0(suboptinit);
@@ -348,22 +349,25 @@ static void add_negation_option(struct m_config *config,
}
static void m_config_add_option(struct m_config *config,
- struct m_config_option *parent,
const char *parent_name,
+ void *optstruct,
+ const void *optstruct_def,
const struct m_option *arg);
static void add_options(struct m_config *config,
- struct m_config_option *parent,
const char *parent_name,
+ void *optstruct,
+ const void *optstruct_def,
const struct m_option *defs)
{
for (int i = 0; defs && defs[i].name; i++)
- m_config_add_option(config, parent, parent_name, &defs[i]);
+ m_config_add_option(config, parent_name, optstruct, optstruct_def, &defs[i]);
}
static void m_config_add_option(struct m_config *config,
- struct m_config_option *parent,
const char *parent_name,
+ void *optstruct,
+ const void *optstruct_def,
const struct m_option *arg)
{
assert(config != NULL);
@@ -380,9 +384,6 @@ static void m_config_add_option(struct m_config *config,
.name = (char *)arg->name,
};
- void *optstruct = config->optstruct;
- if (parent && (parent->opt->type->flags & M_OPT_TYPE_USE_SUBSTRUCT))
- optstruct = substruct_read_ptr(parent->data);
co.data = arg->is_new_option ? (char *)optstruct + arg->offset : arg->p;
// Fill in the full name
@@ -396,14 +397,18 @@ static void m_config_add_option(struct m_config *config,
if (arg->type->flags & M_OPT_TYPE_USE_SUBSTRUCT) {
const struct m_sub_options *subopts = arg->priv;
- if (!substruct_read_ptr(co.data)) {
- void *subdata = m_config_alloc_struct(config, subopts);
- substruct_write_ptr(co.data, subdata);
+ void *new_optstruct = substruct_read_ptr(co.data);
+ if (!new_optstruct) {
+ new_optstruct = m_config_alloc_struct(config, subopts);
+ substruct_write_ptr(co.data, new_optstruct);
}
- add_options(config, &co, new_parent_name, subopts->opts);
+ const void *new_optstruct_def = subopts->defaults;
+
+ add_options(config, new_parent_name, new_optstruct,
+ new_optstruct_def, subopts->opts);
} else {
const struct m_option *sub = arg->p;
- add_options(config, &co, new_parent_name, sub);
+ add_options(config, new_parent_name, optstruct, optstruct_def, sub);
}
} else {
// Initialize options