1210284Sjmallett// SPDX-License-Identifier: GPL-2.0 2232812Sjmallett#include <linux/ctype.h> 3215990Sjmallett#include <linux/kernel.h> 4210284Sjmallett#include <linux/errno.h> 5210284Sjmallett#undef CONFIG_KASAN 6215990Sjmallett#undef CONFIG_KASAN_GENERIC 7215990Sjmallett#include "../lib/string.c" 8215990Sjmallett 9210284Sjmallettint strncmp(const char *cs, const char *ct, size_t count) 10215990Sjmallett{ 11215990Sjmallett unsigned char c1, c2; 12210284Sjmallett 13215990Sjmallett while (count) { 14215990Sjmallett c1 = *cs++; 15215990Sjmallett c2 = *ct++; 16215990Sjmallett if (c1 != c2) 17210284Sjmallett return c1 < c2 ? -1 : 1; 18232812Sjmallett if (!c1) 19215990Sjmallett break; 20215990Sjmallett count--; 21215990Sjmallett } 22210284Sjmallett return 0; 23215990Sjmallett} 24215990Sjmallett 25215990Sjmallettchar *skip_spaces(const char *str) 26215990Sjmallett{ 27210284Sjmallett while (isspace(*str)) 28215990Sjmallett ++str; 29232812Sjmallett return (char *)str; 30215990Sjmallett} 31215990Sjmallett 32215990Sjmallettchar *strim(char *s) 33215990Sjmallett{ 34215990Sjmallett size_t size; 35215990Sjmallett char *end; 36215990Sjmallett 37215990Sjmallett size = strlen(s); 38215990Sjmallett if (!size) 39210284Sjmallett return s; 40210284Sjmallett 41210284Sjmallett end = s + size - 1; 42210284Sjmallett while (end >= s && isspace(*end)) 43210284Sjmallett end--; 44210284Sjmallett *(end + 1) = '\0'; 45210284Sjmallett 46232812Sjmallett return skip_spaces(s); 47210284Sjmallett} 48210284Sjmallett 49210284Sjmallett/* Works only for digits and letters, but small and fast */ 50210284Sjmallett#define TOLOWER(x) ((x) | 0x20) 51210284Sjmallett 52210284Sjmallettstatic unsigned int simple_guess_base(const char *cp) 53210284Sjmallett{ 54210284Sjmallett if (cp[0] == '0') { 55215990Sjmallett if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2])) 56215990Sjmallett return 16; 57215990Sjmallett else 58210284Sjmallett return 8; 59210284Sjmallett } else { 60210284Sjmallett return 10; 61215990Sjmallett } 62210284Sjmallett} 63232812Sjmallett 64232812Sjmallett/** 65215990Sjmallett * simple_strtoull - convert a string to an unsigned long long 66232812Sjmallett * @cp: The start of the string 67210284Sjmallett * @endp: A pointer to the end of the parsed string will be placed here 68210284Sjmallett * @base: The number base to use 69210284Sjmallett */ 70210284Sjmallett 71232812Sjmallettunsigned long long simple_strtoull(const char *cp, char **endp, 72210284Sjmallett unsigned int base) 73215990Sjmallett{ 74215990Sjmallett unsigned long long result = 0; 75215990Sjmallett 76210284Sjmallett if (!base) 77210284Sjmallett base = simple_guess_base(cp); 78210284Sjmallett 79215990Sjmallett if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x') 80210284Sjmallett cp += 2; 81215990Sjmallett 82210284Sjmallett while (isxdigit(*cp)) { 83215990Sjmallett unsigned int value; 84210284Sjmallett 85215990Sjmallett value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10; 86210284Sjmallett if (value >= base) 87215990Sjmallett break; 88210284Sjmallett result = result * base + value; 89215990Sjmallett cp++; 90210284Sjmallett } 91215990Sjmallett if (endp) 92210284Sjmallett *endp = (char *)cp; 93215990Sjmallett 94210284Sjmallett return result; 95215990Sjmallett} 96210284Sjmallett 97215990Sjmallettlong simple_strtol(const char *cp, char **endp, unsigned int base) 98210284Sjmallett{ 99210284Sjmallett if (*cp == '-') 100210284Sjmallett return -simple_strtoull(cp + 1, endp, base); 101210284Sjmallett 102210284Sjmallett return simple_strtoull(cp, endp, base); 103210284Sjmallett} 104210284Sjmallett 105215990Sjmallettint kstrtobool(const char *s, bool *res) 106210284Sjmallett{ 107215990Sjmallett if (!s) 108210284Sjmallett return -EINVAL; 109215990Sjmallett 110210284Sjmallett switch (s[0]) { 111215990Sjmallett case 'y': 112210284Sjmallett case 'Y': 113215990Sjmallett case '1': 114210284Sjmallett *res = true; 115215990Sjmallett return 0; 116210284Sjmallett case 'n': 117210284Sjmallett case 'N': 118210284Sjmallett case '0': 119210284Sjmallett *res = false; 120210284Sjmallett return 0; 121210284Sjmallett case 'o': 122210284Sjmallett case 'O': 123210284Sjmallett switch (s[1]) { 124210284Sjmallett case 'n': 125210284Sjmallett case 'N': 126210284Sjmallett *res = true; 127210284Sjmallett return 0; 128210284Sjmallett case 'f': 129210284Sjmallett case 'F': 130210284Sjmallett *res = false; 131210284Sjmallett return 0; 132210284Sjmallett default: 133210284Sjmallett break; 134215990Sjmallett } 135215990Sjmallett default: 136215990Sjmallett break; 137215990Sjmallett } 138215990Sjmallett 139215990Sjmallett return -EINVAL; 140215990Sjmallett} 141215990Sjmallett