summaryrefslogtreecommitdiffstats
path: root/m_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'm_config.c')
-rw-r--r--m_config.c116
1 files changed, 49 insertions, 67 deletions
diff --git a/m_config.c b/m_config.c
index 94d7e26b2e..3da7707f14 100644
--- a/m_config.c
+++ b/m_config.c
@@ -36,12 +36,21 @@
#define MAX_PROFILE_DEPTH 20
-static int parse_profile(const struct m_option *opt, struct bstr name,
- struct bstr param, bool ambiguous_param, void *dst)
+static int parse_include(struct m_config *config, struct bstr param, bool set)
+{
+ if (param.len == 0)
+ return M_OPT_MISSING_PARAM;
+ if (!set)
+ return 1;
+ char *filename = bstrdup0(NULL, param);
+ config->includefunc(config, filename);
+ talloc_free(filename);
+ return 1;
+}
+
+static int parse_profile(struct m_config *config, const struct m_option *opt,
+ struct bstr name, struct bstr param, bool set)
{
- struct m_config *config = opt->priv;
- char **list = NULL;
- int i, r;
if (!bstrcmp0(param, "help")) {
struct m_profile *p;
if (!config->profiles) {
@@ -57,40 +66,23 @@ static int parse_profile(const struct m_option *opt, struct bstr name,
return M_OPT_EXIT - 1;
}
- r = m_option_type_string_list.parse(opt, name, param, false, &list);
+ char **list = NULL;
+ int r = m_option_type_string_list.parse(opt, name, param, false, &list);
if (r < 0)
return r;
if (!list || !list[0])
return M_OPT_INVALID;
- for (i = 0; list[i]; i++)
- if (!m_config_get_profile(config, list[i])) {
+ for (int i = 0; list[i]; i++) {
+ struct m_profile *p = m_config_get_profile(config, list[i]);
+ if (!p) {
mp_tmsg(MSGT_CFGPARSER, MSGL_WARN, "Unknown profile '%s'.\n",
list[i]);
r = M_OPT_INVALID;
- }
- if (dst)
- m_option_copy(opt, dst, &list);
- else
- m_option_free(opt, &list);
- return r;
-}
-
-static void set_profile(const struct m_option *opt, void *dst, const void *src)
-{
- struct m_config *config = opt->priv;
- struct m_profile *p;
- char **list = NULL;
- int i;
- if (!src || !*(char ***)src)
- return;
- m_option_copy(opt, &list, src);
- for (i = 0; list[i]; i++) {
- p = m_config_get_profile(config, list[i]);
- if (!p)
- continue;
- m_config_set_profile(config, p);
+ } else if (set)
+ m_config_set_profile(config, p);
}
m_option_free(opt, &list);
+ return r;
}
static int show_profile(struct m_option *opt, char *name, char *param)
@@ -150,18 +142,18 @@ static int list_options(struct m_option *opt, char *name, char *param)
static void m_option_save(const struct m_config *config,
const struct m_option *opt, void *dst)
{
- if (opt->type->save) {
+ if (opt->type->copy) {
const void *src = m_option_get_ptr(opt, config->optstruct);
- opt->type->save(opt, dst, src);
+ opt->type->copy(opt, dst, src);
}
}
static void m_option_set(const struct m_config *config,
const struct m_option *opt, const void *src)
{
- if (opt->type->set) {
+ if (opt->type->copy) {
void *dst = m_option_get_ptr(opt, config->optstruct);
- opt->type->set(opt, dst, src);
+ opt->type->copy(opt, dst, src);
}
}
@@ -172,40 +164,31 @@ static void m_config_add_option(struct m_config *config,
const char *prefix, char *disabled_feature);
struct m_config *m_config_new(void *optstruct,
- int includefunc(struct m_option *conf,
+ int includefunc(struct m_config *conf,
char *filename))
{
struct m_config *config;
- static int initialized = 0;
- static struct m_option_type profile_opt_type;
static const struct m_option ref_opts[] = {
- { "profile", NULL, &profile_opt_type, CONF_NOSAVE, 0, 0, NULL },
+ { "profile", NULL, CONF_TYPE_STRING_LIST, CONF_NOSAVE, 0, 0, NULL },
{ "show-profile", show_profile, CONF_TYPE_PRINT_FUNC, CONF_NOCFG },
{ "list-options", list_options, CONF_TYPE_PRINT_FUNC, CONF_NOCFG },
{ NULL }
};
- int i;
config = talloc_zero(NULL, struct m_config);
config->lvl = 1; // 0 Is the defaults
- if (!initialized) {
- initialized = 1;
- profile_opt_type = m_option_type_string_list;
- profile_opt_type.parse = parse_profile;
- profile_opt_type.set = set_profile;
- }
struct m_option *self_opts = talloc_memdup(config, ref_opts,
sizeof(ref_opts));
- for (i = 0; self_opts[i].name; i++)
+ for (int i = 1; self_opts[i].name; i++)
self_opts[i].priv = config;
m_config_register_options(config, self_opts);
if (includefunc) {
struct m_option *p = talloc_ptrtype(config, p);
*p = (struct m_option){
- "include", includefunc, CONF_TYPE_FUNC_PARAM,
- CONF_NOSAVE, 0, 0, config
+ "include", NULL, CONF_TYPE_STRING, CONF_NOSAVE,
};
m_config_add_option(config, p, NULL, NULL);
+ config->includefunc = includefunc;
}
config->optstruct = optstruct;
@@ -420,18 +403,15 @@ static struct m_config_option *m_config_get_co(const struct m_config *config,
return NULL;
}
-static int m_config_parse_option(const struct m_config *config,
+static int m_config_parse_option(struct m_config *config,
struct bstr name, struct bstr param,
bool ambiguous_param, bool set)
{
- struct m_config_option *co;
- int r = 0;
-
assert(config != NULL);
assert(config->lvl > 0);
assert(name.len != 0);
- co = m_config_get_co(config, name);
+ struct m_config_option *co = m_config_get_co(config, name);
if (!co)
return M_OPT_UNKNOWN;
if (co->disabled_feature) {
@@ -466,23 +446,27 @@ static int m_config_parse_option(const struct m_config *config,
(co->opt->flags & M_OPT_PRE_PARSE) && (co->flags & M_CFG_OPT_SET)))
set = 0;
+ if (config->includefunc && !bstrcmp0(name, "include")) {
+ return parse_include(config, param, set);
+ } else if (!bstrcmp0(name, "profile"))
+ return parse_profile(config, co->opt, name, param, set);
+
// Option with children are a bit different to parse
if (co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) {
char **lst = NULL;
- int i, sr;
// Parse the child options
- r = m_option_parse(co->opt, name, param, false, &lst);
+ int r = m_option_parse(co->opt, name, param, false, &lst);
// Set them now
if (r >= 0)
- for (i = 0; lst && lst[2 * i]; i++) {
+ for (int i = 0; lst && lst[2 * i]; i++) {
int l = strlen(co->name) + 1 + strlen(lst[2 * i]) + 1;
if (r >= 0) {
// Build the full name
char n[l];
sprintf(n, "%s:%s", co->name, lst[2 * i]);
- sr = m_config_parse_option(config, bstr(n),
- bstr(lst[2 * i + 1]), false,
- set);
+ int sr = m_config_parse_option(config, bstr(n),
+ bstr(lst[2 * i + 1]), false,
+ set);
if (sr < 0) {
if (sr == M_OPT_UNKNOWN) {
mp_tmsg(MSGT_CFGPARSER, MSGL_ERR,
@@ -502,18 +486,16 @@ static int m_config_parse_option(const struct m_config *config,
talloc_free(lst[2 * i + 1]);
}
talloc_free(lst);
- } else
- r = m_option_parse(co->opt, name, param, ambiguous_param,
- set ? co->slots->data : NULL);
+ return r;
+ }
+ void *dst = set ? m_option_get_ptr(co->opt, config->optstruct) : NULL;
+ int r = m_option_parse(co->opt, name, param, ambiguous_param, dst);
// Parsing failed ?
if (r < 0)
return r;
- // Set the option
- if (set) {
- m_option_set(config, co->opt, co->slots->data);
+ else if (set)
co->flags |= M_CFG_OPT_SET;
- }
return r;
}
@@ -526,7 +508,7 @@ int m_config_set_option(struct m_config *config, struct bstr name,
return m_config_parse_option(config, name, param, ambiguous_param, 1);
}
-int m_config_check_option(const struct m_config *config, struct bstr name,
+int m_config_check_option(struct m_config *config, struct bstr name,
struct bstr param, bool ambiguous_param)
{
int r;