From d331765d9d14594016820253991c9efba0082bdf Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 20 Feb 2013 12:34:49 +0100 Subject: [PATCH] argument parsing: set structure field even if setter is available If a setter is available for an option, we would only call the setter and not make any changes to the structure field itself. It turns out that the first thing each of the setters does is to set the structure field to the given value, so we might as well do that directly. We set the value before calling the setter such that the setter can still override the value. Signed-off-by: Sven Verdoolaege --- isl_arg.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/isl_arg.c b/isl_arg.c index 78f12b46..873ab02e 100644 --- a/isl_arg.c +++ b/isl_arg.c @@ -714,10 +714,9 @@ static int parse_choice_option(struct isl_arg *decl, char **arg, if (!has_argument && (!arg[1] || arg[1][0] == '-')) { unsigned u = decl->u.choice.default_selected; + *(unsigned *)(((char *)opt) + decl->offset) = u; if (decl->u.choice.set) decl->u.choice.set(opt, u); - else - *(unsigned *)(((char *)opt) + decl->offset) = u; return 1; } @@ -732,10 +731,9 @@ static int parse_choice_option(struct isl_arg *decl, char **arg, continue; u = decl->u.choice.choice[i].value; + *(unsigned *)(((char *)opt) + decl->offset) = u; if (decl->u.choice.set) decl->u.choice.set(opt, u); - else - *(unsigned *)(((char *)opt) + decl->offset) = u; return has_argument ? 1 : 2; } @@ -805,17 +803,17 @@ static int parse_bool_option(struct isl_arg *decl, char **arg, char *endptr; int val = strtol(arg[1], &endptr, 0); if (*endptr == '\0' && (val == 0 || val == 1)) { + if (decl->offset != (size_t) -1) + *p = val; if (decl->u.b.set) decl->u.b.set(opt, val); - else if (decl->offset != (size_t) -1) - *p = val; return 2; } } + if (decl->offset != (size_t) -1) + *p = 1; if (decl->u.b.set) decl->u.b.set(opt, 1); - else if (decl->offset != (size_t) -1) - *p = 1; return 1; } @@ -848,10 +846,10 @@ static int parse_bool_option(struct isl_arg *decl, char **arg, } if (match_long_name(decl, name, name + strlen(name))) { + if (decl->offset != (size_t) -1) + *p = 0; if (decl->u.b.set) decl->u.b.set(opt, 0); - else if (decl->offset != (size_t) -1) - *p = 0; return 1; } @@ -965,29 +963,26 @@ static int parse_long_option(struct isl_arg *decl, char **arg, if (has_argument) { long l = strtol(val, NULL, 0); + *p = l; if (decl->u.l.set) decl->u.l.set(opt, l); - else - *p = l; return 1; } if (arg[1]) { long l = strtol(arg[1], &endptr, 0); if (*endptr == '\0') { + *p = l; if (decl->u.l.set) decl->u.l.set(opt, l); - else - *p = l; return 2; } } if (decl->u.l.default_value != decl->u.l.default_selected) { + *p = decl->u.l.default_selected; if (decl->u.l.set) decl->u.l.set(opt, decl->u.l.default_selected); - else - *p = decl->u.l.default_selected; return 1; } -- 2.11.4.GIT