efi_loader: check device path is not installed twice
[oweals/u-boot.git] / lib / strto.c
index 7f6076909ab7401e802eac798671b79c0515a0b7..3d77115d4d813af05713380dafdccbc14aaf1804 100644 (file)
@@ -22,9 +22,25 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
                                *base = 16;
                        else
                                *base = 8;
-               } else
+               } else {
+                       int i = 0;
+                       char var;
+
                        *base = 10;
+
+                       do {
+                               var = tolower(s[i++]);
+                               if (var >= 'a' && var <= 'f') {
+                                       *base = 16;
+                                       break;
+                               }
+
+                               if (!(var >= '0' && var <= '9'))
+                                       break;
+                       } while (var);
+               }
        }
+
        if (*base == 16 && s[0] == '0' && tolower(s[1]) == 'x')
                s += 2;
        return s;
@@ -85,22 +101,20 @@ long simple_strtol(const char *cp, char **endp, unsigned int base)
 unsigned long ustrtoul(const char *cp, char **endp, unsigned int base)
 {
        unsigned long result = simple_strtoul(cp, endp, base);
-       switch (**endp) {
-       case 'G':
+       switch (tolower(**endp)) {
+       case 'g':
                result *= 1024;
                /* fall through */
-       case 'M':
+       case 'm':
                result *= 1024;
                /* fall through */
-       case 'K':
        case 'k':
                result *= 1024;
-               if ((*endp)[1] == 'i') {
-                       if ((*endp)[2] == 'B')
-                               (*endp) += 3;
-                       else
-                               (*endp) += 2;
-               }
+               (*endp)++;
+               if (**endp == 'i')
+                       (*endp)++;
+               if (**endp == 'B')
+                       (*endp)++;
        }
        return result;
 }
@@ -108,22 +122,20 @@ unsigned long ustrtoul(const char *cp, char **endp, unsigned int base)
 unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base)
 {
        unsigned long long result = simple_strtoull(cp, endp, base);
-       switch (**endp) {
-       case 'G':
+       switch (tolower(**endp)) {
+       case 'g':
                result *= 1024;
                /* fall through */
-       case 'M':
+       case 'm':
                result *= 1024;
                /* fall through */
-       case 'K':
        case 'k':
                result *= 1024;
-               if ((*endp)[1] == 'i') {
-                       if ((*endp)[2] == 'B')
-                               (*endp) += 3;
-                       else
-                               (*endp) += 2;
-               }
+               (*endp)++;
+               if (**endp == 'i')
+                       (*endp)++;
+               if (**endp == 'B')
+                       (*endp)++;
        }
        return result;
 }
@@ -167,3 +179,11 @@ long trailing_strtol(const char *str)
 {
        return trailing_strtoln(str, NULL);
 }
+
+void str_to_upper(const char *in, char *out, size_t len)
+{
+       for (; len > 0 && *in; len--)
+               *out++ = toupper(*in++);
+       if (len)
+               *out = '\0';
+}