summaryrefslogtreecommitdiffstats
path: root/m_property.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-09-18 16:08:17 +0200
committerwm4 <wm4@nowhere>2012-10-12 10:10:31 +0200
commit426640204b409d1034a1c32ad01b9bc547e93684 (patch)
tree8dda3035239acb0b7cfea30dd8f05813bd444bce /m_property.c
parent1a5a7a49293c2c70a5caf9d51dad7bd5aa938471 (diff)
downloadmpv-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.c41
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);