X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=lib%2Fstrto.c;h=7f6076909ab7401e802eac798671b79c0515a0b7;hb=9c2369a554437f072733c53ba0f5f5384f35b6d3;hp=a6c01574dac3f6994cc3121f5d15082ad44e5155;hpb=e6ac28b60be2d670948332197862e314b7977177;p=u-boot diff --git a/lib/strto.c b/lib/strto.c index a6c01574da..7f6076909a 100644 --- a/lib/strto.c +++ b/lib/strto.c @@ -13,25 +13,30 @@ #include #include +/* from lib/kstrtox.c */ +static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base) +{ + if (*base == 0) { + if (s[0] == '0') { + if (tolower(s[1]) == 'x' && isxdigit(s[2])) + *base = 16; + else + *base = 8; + } else + *base = 10; + } + if (*base == 16 && s[0] == '0' && tolower(s[1]) == 'x') + s += 2; + return s; +} + unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base) { unsigned long result = 0; unsigned long value; - if (*cp == '0') { - cp++; - if ((*cp == 'x') && isxdigit(cp[1])) { - base = 16; - cp++; - } - - if (!base) - base = 8; - } - - if (!base) - base = 10; + cp = _parse_integer_fixup_radix(cp, &base); while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp) ? toupper(*cp) : *cp)-'A'+10) < base) { @@ -128,19 +133,7 @@ unsigned long long simple_strtoull(const char *cp, char **endp, { unsigned long long result = 0, value; - if (*cp == '0') { - cp++; - if ((*cp == 'x') && isxdigit(cp[1])) { - base = 16; - cp++; - } - - if (!base) - base = 8; - } - - if (!base) - base = 10; + cp = _parse_integer_fixup_radix(cp, &base); while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp - '0' : (islower(*cp) ? toupper(*cp) : *cp) - 'A' + 10) < base) { @@ -160,9 +153,11 @@ long trailing_strtoln(const char *str, const char *end) if (!end) end = str + strlen(str); - for (p = end - 1; p > str; p--) { - if (!isdigit(*p)) - return simple_strtoul(p + 1, NULL, 10); + if (isdigit(end[-1])) { + for (p = end - 1; p > str; p--) { + if (!isdigit(*p)) + return simple_strtoul(p + 1, NULL, 10); + } } return -1;