summaryrefslogtreecommitdiffstats
path: root/m_option.h
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-08-06 17:45:17 +0200
committerwm4 <wm4@nowhere>2012-08-06 17:45:17 +0200
commit7aae399239d02e48de9060dded1d0232310d2141 (patch)
treec4ede71396dccdc0a661d28fb4089af4c279aa05 /m_option.h
parent0c1dd8a8f54a152755faef3d323ce6fdc7d63f73 (diff)
downloadmpv-7aae399239d02e48de9060dded1d0232310d2141.tar.bz2
mpv-7aae399239d02e48de9060dded1d0232310d2141.tar.xz
m_config: support auto-allocated sub-structs
Given your option struct has a field that is a pointer to another struct, this commit allows you to declare options that write into that other struct. The code in m_config will dereference the pointer field on its own if such an option is accessed. If the field is NULL on initialization of the containing m_config, the struct is automatically allocated. OPT_SUBSTRUCT() can be used to declare such a field. struct m_sub_options is used to describe the pointed-to struct, and includes size and defaults if the struct has to be allocated by m_config.
Diffstat (limited to 'm_option.h')
-rw-r--r--m_option.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/m_option.h b/m_option.h
index e0321d1de1..ab83027a85 100644
--- a/m_option.h
+++ b/m_option.h
@@ -52,6 +52,7 @@ extern const m_option_type_t m_option_type_print;
extern const m_option_type_t m_option_type_print_func;
extern const m_option_type_t m_option_type_print_func_param;
extern const m_option_type_t m_option_type_subconfig;
+extern const m_option_type_t m_option_type_subconfig_struct;
extern const m_option_type_t m_option_type_imgfmt;
extern const m_option_type_t m_option_type_afmt;
@@ -148,6 +149,12 @@ struct m_opt_choice_alternatives {
int value;
};
+// m_option.priv points to this if M_OPT_TYPE_USE_SUBSTRUCT is used
+struct m_sub_options {
+ const struct m_option *opts;
+ size_t size;
+ const void *defaults;
+};
// FIXME: backward compatibility
#define CONF_TYPE_FLAG (&m_option_type_flag)
@@ -338,6 +345,10 @@ struct m_option {
// takes no parameter.
#define M_OPT_TYPE_OLD_SYNTAX_NO_PARAM (1 << 3)
+// modify M_OPT_TYPE_HAS_CHILD so that m_option::p points to
+// struct m_sub_options, instead of a direct m_option array.
+#define M_OPT_TYPE_USE_SUBSTRUCT (1 << 4)
+
///////////////////////////// Parser flags /////////////////////////////////
// On success parsers return the number of arguments consumed: 0 or 1.
@@ -461,6 +472,12 @@ static inline void m_option_free(const m_option_t *opt, void *dst)
#define OPT_CHOICE_(optname, varname, flags, choices, ...) OPT_GENERAL(optname, varname, flags, .priv = (void *)&(const struct m_opt_choice_alternatives[]){OPT_HELPER_REMOVEPAREN choices, {NULL}}, __VA_ARGS__)
#define OPT_TIME(...) OPT_GENERAL(__VA_ARGS__, .type = &m_option_type_time)
+// subconf must have the type struct m_sub_options.
+// flagv should be M_OPT_MERGE or M_OPT_FLATTEN.
+// varname refers to the field, that must be a pointer to a field described by
+// the subconf struct.
+#define OPT_SUBSTRUCT(varname, subconf, flagv) OPT_GENERAL("-", varname, flagv, .type = &m_option_type_subconfig_struct, .priv = (void*)&subconf)
+
#define OPT_BASE_STRUCT struct MPOpts
#endif /* MPLAYER_M_OPTION_H */