|
@@ -13,25 +13,30 @@
|
|
|
#include <errno.h>
|
|
|
#include <linux/ctype.h>
|
|
|
|
|
|
+/* 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) {
|