1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2e8f3010fSArd Biesheuvel /* 3e8f3010fSArd Biesheuvel * Taken from: 4e8f3010fSArd Biesheuvel * linux/lib/string.c 5e8f3010fSArd Biesheuvel * 6e8f3010fSArd Biesheuvel * Copyright (C) 1991, 1992 Linus Torvalds 7e8f3010fSArd Biesheuvel */ 8e8f3010fSArd Biesheuvel 991d150c0SArd Biesheuvel #include <linux/ctype.h> 10aad0f3d6STian Tao #include <linux/kernel.h> 11e8f3010fSArd Biesheuvel #include <linux/types.h> 12e8f3010fSArd Biesheuvel #include <linux/string.h> 13e8f3010fSArd Biesheuvel 14*2e6fa86fSArd Biesheuvel #ifndef EFI_HAVE_STRLEN 15*2e6fa86fSArd Biesheuvel /** 16*2e6fa86fSArd Biesheuvel * strlen - Find the length of a string 17*2e6fa86fSArd Biesheuvel * @s: The string to be sized 18*2e6fa86fSArd Biesheuvel */ 19*2e6fa86fSArd Biesheuvel size_t strlen(const char *s) 20*2e6fa86fSArd Biesheuvel { 21*2e6fa86fSArd Biesheuvel const char *sc; 22*2e6fa86fSArd Biesheuvel 23*2e6fa86fSArd Biesheuvel for (sc = s; *sc != '\0'; ++sc) 24*2e6fa86fSArd Biesheuvel /* nothing */; 25*2e6fa86fSArd Biesheuvel return sc - s; 26*2e6fa86fSArd Biesheuvel } 27*2e6fa86fSArd Biesheuvel #endif 28*2e6fa86fSArd Biesheuvel 29*2e6fa86fSArd Biesheuvel #ifndef EFI_HAVE_STRNLEN 30*2e6fa86fSArd Biesheuvel /** 31*2e6fa86fSArd Biesheuvel * strnlen - Find the length of a length-limited string 32*2e6fa86fSArd Biesheuvel * @s: The string to be sized 33*2e6fa86fSArd Biesheuvel * @count: The maximum number of bytes to search 34*2e6fa86fSArd Biesheuvel */ 35*2e6fa86fSArd Biesheuvel size_t strnlen(const char *s, size_t count) 36*2e6fa86fSArd Biesheuvel { 37*2e6fa86fSArd Biesheuvel const char *sc; 38*2e6fa86fSArd Biesheuvel 39*2e6fa86fSArd Biesheuvel for (sc = s; count-- && *sc != '\0'; ++sc) 40*2e6fa86fSArd Biesheuvel /* nothing */; 41*2e6fa86fSArd Biesheuvel return sc - s; 42*2e6fa86fSArd Biesheuvel } 43*2e6fa86fSArd Biesheuvel #endif 44*2e6fa86fSArd Biesheuvel 45e8f3010fSArd Biesheuvel /** 46e8f3010fSArd Biesheuvel * strstr - Find the first substring in a %NUL terminated string 47e8f3010fSArd Biesheuvel * @s1: The string to be searched 48e8f3010fSArd Biesheuvel * @s2: The string to search for 49e8f3010fSArd Biesheuvel */ 50e8f3010fSArd Biesheuvel char *strstr(const char *s1, const char *s2) 51e8f3010fSArd Biesheuvel { 52e8f3010fSArd Biesheuvel size_t l1, l2; 53e8f3010fSArd Biesheuvel 54e8f3010fSArd Biesheuvel l2 = strlen(s2); 55e8f3010fSArd Biesheuvel if (!l2) 56e8f3010fSArd Biesheuvel return (char *)s1; 57e8f3010fSArd Biesheuvel l1 = strlen(s1); 58e8f3010fSArd Biesheuvel while (l1 >= l2) { 59e8f3010fSArd Biesheuvel l1--; 60e8f3010fSArd Biesheuvel if (!memcmp(s1, s2, l2)) 61e8f3010fSArd Biesheuvel return (char *)s1; 62e8f3010fSArd Biesheuvel s1++; 63e8f3010fSArd Biesheuvel } 64e8f3010fSArd Biesheuvel return NULL; 65e8f3010fSArd Biesheuvel } 66e8f3010fSArd Biesheuvel 67e8f3010fSArd Biesheuvel /** 68e8f3010fSArd Biesheuvel * strncmp - Compare two length-limited strings 69e8f3010fSArd Biesheuvel * @cs: One string 70e8f3010fSArd Biesheuvel * @ct: Another string 71e8f3010fSArd Biesheuvel * @count: The maximum number of bytes to compare 72e8f3010fSArd Biesheuvel */ 73e8f3010fSArd Biesheuvel int strncmp(const char *cs, const char *ct, size_t count) 74e8f3010fSArd Biesheuvel { 75e8f3010fSArd Biesheuvel unsigned char c1, c2; 76e8f3010fSArd Biesheuvel 77e8f3010fSArd Biesheuvel while (count) { 78e8f3010fSArd Biesheuvel c1 = *cs++; 79e8f3010fSArd Biesheuvel c2 = *ct++; 80e8f3010fSArd Biesheuvel if (c1 != c2) 81e8f3010fSArd Biesheuvel return c1 < c2 ? -1 : 1; 82e8f3010fSArd Biesheuvel if (!c1) 83e8f3010fSArd Biesheuvel break; 84e8f3010fSArd Biesheuvel count--; 85e8f3010fSArd Biesheuvel } 86e8f3010fSArd Biesheuvel return 0; 87e8f3010fSArd Biesheuvel } 8891d150c0SArd Biesheuvel 8991d150c0SArd Biesheuvel /* Works only for digits and letters, but small and fast */ 9091d150c0SArd Biesheuvel #define TOLOWER(x) ((x) | 0x20) 9191d150c0SArd Biesheuvel 9291d150c0SArd Biesheuvel static unsigned int simple_guess_base(const char *cp) 9391d150c0SArd Biesheuvel { 9491d150c0SArd Biesheuvel if (cp[0] == '0') { 9591d150c0SArd Biesheuvel if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2])) 9691d150c0SArd Biesheuvel return 16; 9791d150c0SArd Biesheuvel else 9891d150c0SArd Biesheuvel return 8; 9991d150c0SArd Biesheuvel } else { 10091d150c0SArd Biesheuvel return 10; 10191d150c0SArd Biesheuvel } 10291d150c0SArd Biesheuvel } 10391d150c0SArd Biesheuvel 10491d150c0SArd Biesheuvel /** 10591d150c0SArd Biesheuvel * simple_strtoull - convert a string to an unsigned long long 10691d150c0SArd Biesheuvel * @cp: The start of the string 10791d150c0SArd Biesheuvel * @endp: A pointer to the end of the parsed string will be placed here 10891d150c0SArd Biesheuvel * @base: The number base to use 10991d150c0SArd Biesheuvel */ 11091d150c0SArd Biesheuvel 11191d150c0SArd Biesheuvel unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) 11291d150c0SArd Biesheuvel { 11391d150c0SArd Biesheuvel unsigned long long result = 0; 11491d150c0SArd Biesheuvel 11591d150c0SArd Biesheuvel if (!base) 11691d150c0SArd Biesheuvel base = simple_guess_base(cp); 11791d150c0SArd Biesheuvel 11891d150c0SArd Biesheuvel if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x') 11991d150c0SArd Biesheuvel cp += 2; 12091d150c0SArd Biesheuvel 12191d150c0SArd Biesheuvel while (isxdigit(*cp)) { 12291d150c0SArd Biesheuvel unsigned int value; 12391d150c0SArd Biesheuvel 12491d150c0SArd Biesheuvel value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10; 12591d150c0SArd Biesheuvel if (value >= base) 12691d150c0SArd Biesheuvel break; 12791d150c0SArd Biesheuvel result = result * base + value; 12891d150c0SArd Biesheuvel cp++; 12991d150c0SArd Biesheuvel } 13091d150c0SArd Biesheuvel if (endp) 13191d150c0SArd Biesheuvel *endp = (char *)cp; 13291d150c0SArd Biesheuvel 13391d150c0SArd Biesheuvel return result; 13491d150c0SArd Biesheuvel } 13591d150c0SArd Biesheuvel 13691d150c0SArd Biesheuvel long simple_strtol(const char *cp, char **endp, unsigned int base) 13791d150c0SArd Biesheuvel { 13891d150c0SArd Biesheuvel if (*cp == '-') 13991d150c0SArd Biesheuvel return -simple_strtoull(cp + 1, endp, base); 14091d150c0SArd Biesheuvel 14191d150c0SArd Biesheuvel return simple_strtoull(cp, endp, base); 14291d150c0SArd Biesheuvel } 143