From 49a1617f3092121cad6cc317c5b0d052b0e7679d Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Fri, 23 Sep 2011 17:53:44 +0300 Subject: [PATCH] kvm tools: don't use custom strtoul for hex numbers Cc: kvm@vger.kernel.org Signed-off-by: Andy Shevchenko Signed-off-by: Pekka Enberg --- tools/kvm/util/parse-options.c | 86 +++++++--------------------------- 1 file changed, 16 insertions(+), 70 deletions(-) diff --git a/tools/kvm/util/parse-options.c b/tools/kvm/util/parse-options.c index c2803796ac27..2665be5b64d3 100644 --- a/tools/kvm/util/parse-options.c +++ b/tools/kvm/util/parse-options.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -39,82 +40,27 @@ static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt, return 0; } -#define numvalue(c) \ - ((c) >= 'a' ? (c) - 'a' + 10 : \ - (c) >= 'A' ? (c) - 'A' + 10 : (c) - '0') - -static u64 readhex(const char *str, bool *error) -{ - char *pos = strchr(str, 'x') + 1; - u64 res = 0; - - while (*pos) { - unsigned int v = numvalue(*pos); - if (v > 16) { - *error = true; - return 0; - } - - res = (res * 16) + v; - pos++; - } - - *error = false; - return res; -} - static int readnum(const struct option *opt, int flags, const char *str, char **end) { - if (strchr(str, 'x')) { - bool error; - u64 value; - - value = readhex(str, &error); - if (error) - goto enotnum; - - switch (opt->type) { - case OPTION_INTEGER: - *(int *)opt->value = value; - break; - case OPTION_UINTEGER: - *(unsigned int *)opt->value = value; - break; - case OPTION_LONG: - *(long *)opt->value = value; - break; - case OPTION_U64: - *(u64 *)opt->value = value; - break; - default: - goto invcall; - } - } else { - switch (opt->type) { - case OPTION_INTEGER: - *(int *)opt->value = strtol(str, end, 10); - break; - case OPTION_UINTEGER: - *(unsigned int *)opt->value = strtol(str, end, 10); - break; - case OPTION_LONG: - *(long *)opt->value = strtol(str, end, 10); - break; - case OPTION_U64: - *(u64 *)opt->value = strtoull(str, end, 10); - break; - default: - goto invcall; - } + switch (opt->type) { + case OPTION_INTEGER: + *(int *)opt->value = strtol(str, end, 0); + break; + case OPTION_UINTEGER: + *(unsigned int *)opt->value = strtol(str, end, 0); + break; + case OPTION_LONG: + *(long *)opt->value = strtol(str, end, 0); + break; + case OPTION_U64: + *(u64 *)opt->value = strtoull(str, end, 0); + break; + default: + return opterror(opt, "invalid numeric conversion", flags); } return 0; - -enotnum: - return opterror(opt, "expects a numerical value", flags); -invcall: - return opterror(opt, "invalid numeric conversion", flags); } static int get_value(struct parse_opt_ctx_t *p, -- 2.39.5