diff options
author | wm4 <wm4@nowhere> | 2012-09-18 16:08:17 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-10-12 10:10:31 +0200 |
commit | 426640204b409d1034a1c32ad01b9bc547e93684 (patch) | |
tree | 8dda3035239acb0b7cfea30dd8f05813bd444bce /m_property.c | |
parent | 1a5a7a49293c2c70a5caf9d51dad7bd5aa938471 (diff) | |
download | mpv-426640204b409d1034a1c32ad01b9bc547e93684.tar.bz2 mpv-426640204b409d1034a1c32ad01b9bc547e93684.tar.xz |
options: simplify somewhat by introducing a union for option values
The m_option_value union is supposed to contain a field for each
possible option type (as long as it actually stores data). This helps
avoiding silly temporary memory alocations. Using a pointer to an union
and to a field of the union interchangeably should be allowed by
standard C.
Diffstat (limited to 'm_property.c')
-rw-r--r-- | m_property.c | 41 |
1 files changed, 13 insertions, 28 deletions
diff --git a/m_property.c b/m_property.c index d7ae0c93fc..cb19ff08cb 100644 --- a/m_property.c +++ b/m_property.c @@ -67,7 +67,7 @@ int m_property_do(const m_option_t *prop_list, const char *name, int action, void *arg, void *ctx) { const m_option_t *opt; - void *val; + union m_option_value val = {0}; int r; char *str; @@ -78,13 +78,10 @@ int m_property_do(const m_option_t *prop_list, const char *name, if ((r = do_action(prop_list, name, M_PROPERTY_GET_TYPE, &opt, ctx)) <= 0) return r; - val = calloc(1, opt->type->size); - if ((r = do_action(prop_list, name, M_PROPERTY_GET, val, ctx)) <= 0) { - free(val); + // Fallback to m_option + if ((r = do_action(prop_list, name, M_PROPERTY_GET, &val, ctx)) <= 0) return r; - } - str = m_option_pretty_print(opt, val); - free(val); + str = m_option_pretty_print(opt, &val); *(char **)arg = str; return str != NULL; case M_PROPERTY_TO_STRING: @@ -95,13 +92,9 @@ int m_property_do(const m_option_t *prop_list, const char *name, if ((r = do_action(prop_list, name, M_PROPERTY_GET_TYPE, &opt, ctx)) <= 0) return r; - val = calloc(1, opt->type->size); - if ((r = do_action(prop_list, name, M_PROPERTY_GET, val, ctx)) <= 0) { - free(val); + if ((r = do_action(prop_list, name, M_PROPERTY_GET, &val, ctx)) <= 0) return r; - } - str = m_option_print(opt, val); - free(val); + str = m_option_print(opt, &val); *(char **)arg = str; return str != NULL; case M_PROPERTY_PARSE: @@ -113,14 +106,10 @@ int m_property_do(const m_option_t *prop_list, const char *name, if ((r = do_action(prop_list, name, M_PROPERTY_GET_TYPE, &opt, ctx)) <= 0) return r; - val = calloc(1, opt->type->size); - if ((r = m_option_parse(opt, bstr0(opt->name), bstr0(arg), val)) <= 0) { - free(val); + if ((r = m_option_parse(opt, bstr0(opt->name), bstr0(arg), &val)) <= 0) return r; - } - r = do_action(prop_list, name, M_PROPERTY_SET, val, ctx); - m_option_free(opt, val); - free(val); + r = do_action(prop_list, name, M_PROPERTY_SET, &val, ctx); + m_option_free(opt, &val); return r; case M_PROPERTY_SWITCH: if ((r = do_action(prop_list, name, M_PROPERTY_SWITCH, arg, ctx)) != @@ -132,17 +121,13 @@ int m_property_do(const m_option_t *prop_list, const char *name, // Fallback to m_option if (!opt->type->add) return M_PROPERTY_NOT_IMPLEMENTED; - val = calloc(1, opt->type->size); - if ((r = do_action(prop_list, name, M_PROPERTY_GET, val, ctx)) <= 0) { - free(val); + if ((r = do_action(prop_list, name, M_PROPERTY_GET, &val, ctx)) <= 0) return r; - } bool wrap = opt->type == &m_option_type_choice || opt->type == &m_option_type_flag; - opt->type->add(opt, val, *(double*)arg, wrap); - r = do_action(prop_list, name, M_PROPERTY_SET, val, ctx); - m_option_free(opt, val); - free(val); + opt->type->add(opt, &val, *(double*)arg, wrap); + r = do_action(prop_list, name, M_PROPERTY_SET, &val, ctx); + m_option_free(opt, &val); return r; } return do_action(prop_list, name, action, arg, ctx); |