]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
lib: Move common digit-parsing code into a function
authorSimon Glass <sjg@chromium.org>
Sat, 24 Jul 2021 15:03:35 +0000 (09:03 -0600)
committerTom Rini <trini@konsulko.com>
Mon, 2 Aug 2021 17:32:14 +0000 (13:32 -0400)
The code to convert a character into a digit is repeated twice in this
file. Factor it out into a separate function. This also makes the code a
little easier to read.

Signed-off-by: Simon Glass <sjg@chromium.org>
lib/strto.c

index 53886722138aa884537f4ee76a70dbec7f25413c..b056b205c856321c965249adfa86a5399c3b5709 100644 (file)
@@ -30,16 +30,33 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
        return s;
 }
 
+/**
+ * decode_digit() - Decode a single character into its numeric digit value
+ *
+ * This ignore case
+ *
+ * @ch: Character to convert (expects '0'..'9', 'a'..'f' or 'A'..'F')
+ * @return value of digit (0..0xf) or 255 if the character is invalid
+ */
+static uint decode_digit(int ch)
+{
+       if (!isxdigit(ch))
+               return 256;
+
+       ch = tolower(ch);
+
+       return ch <= '9' ? ch - '0' : ch - 'a' + 0xa;
+}
+
 ulong simple_strtoul(const char *cp, char **endp, uint base)
 {
        ulong result = 0;
-       ulong value;
+       uint value;
 
        cp = _parse_integer_fixup_radix(cp, &base);
 
-       while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
-           ? toupper(*cp) : *cp)-'A'+10) < base) {
-               result = result*base + value;
+       while (value = decode_digit(*cp), value < base) {
+               result = result * base + value;
                cp++;
        }
 
@@ -136,12 +153,12 @@ unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base)
 unsigned long long simple_strtoull(const char *cp, char **endp,
                                        unsigned int base)
 {
-       unsigned long long result = 0, value;
+       unsigned long long result = 0;
+       uint value;
 
        cp = _parse_integer_fixup_radix(cp, &base);
 
-       while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp - '0'
-               : (islower(*cp) ? toupper(*cp) : *cp) - 'A' + 10) < base) {
+       while (value = decode_digit(*cp), value < base) {
                result = result * base + value;
                cp++;
        }