// SPDX-License-Identifier: GPL-2.0-only /* -*- linux-c -*- ------------------------------------------------------- * * * Copyright (C) 1991, 1992 Linus Torvalds * Copyright 2007 rPath, Inc. - All Rights Reserved * * ----------------------------------------------------------------------- */ /* * Very basic string functions */ #include <linux/types.h> #include <linux/compiler.h> #include <linux/errno.h> #include <linux/limits.h> #include <asm/asm.h> #include "ctype.h" #include "string.h" #define KSTRTOX_OVERFLOW … /* * Undef these macros so that the functions that we provide * here will have the correct names regardless of how string.h * may have chosen to #define them. */ #undef memcpy #undef memset #undef memcmp int memcmp(const void *s1, const void *s2, size_t len) { … } /* * Clang may lower `memcmp == 0` to `bcmp == 0`. */ int bcmp(const void *s1, const void *s2, size_t len) { … } int strcmp(const char *str1, const char *str2) { … } int strncmp(const char *cs, const char *ct, size_t count) { … } size_t strnlen(const char *s, size_t maxlen) { … } unsigned int atou(const char *s) { … } /* Works only for digits and letters, but small and fast */ #define TOLOWER(x) … static unsigned int simple_guess_base(const char *cp) { … } /** * simple_strtoull - convert a string to an unsigned long long * @cp: The start of the string * @endp: A pointer to the end of the parsed string will be placed here * @base: The number base to use */ unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) { … } long simple_strtol(const char *cp, char **endp, unsigned int base) { … } /** * strlen - Find the length of a string * @s: The string to be sized */ size_t strlen(const char *s) { … } /** * strstr - Find the first substring in a %NUL terminated string * @s1: The string to be searched * @s2: The string to search for */ char *strstr(const char *s1, const char *s2) { … } /** * strchr - Find the first occurrence of the character c in the string s. * @s: the string to be searched * @c: the character to search for */ char *strchr(const char *s, int c) { … } static inline u64 __div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) { … } static inline u64 __div_u64(u64 dividend, u32 divisor) { … } static inline char _tolower(const char c) { … } static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base) { … } /* * Convert non-negative integer string representation in explicitly given radix * to an integer. * Return number of characters consumed maybe or-ed with overflow bit. * If overflow occurs, result integer (incorrect) is still returned. * * Don't you dare use this function. */ static unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p) { … } static int _kstrtoull(const char *s, unsigned int base, unsigned long long *res) { … } /** * kstrtoull - convert a string to an unsigned long long * @s: The start of the string. The string must be null-terminated, and may also * include a single newline before its terminating null. The first character * may also be a plus sign, but not a minus sign. * @base: The number base to use. The maximum supported base is 16. If base is * given as 0, then the base of the string is automatically detected with the * conventional semantics - If it begins with 0x the number will be parsed as a * hexadecimal (case insensitive), if it otherwise begins with 0, it will be * parsed as an octal number. Otherwise it will be parsed as a decimal. * @res: Where to write the result of the conversion on success. * * Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. * Used as a replacement for the obsolete simple_strtoull. Return code must * be checked. */ int kstrtoull(const char *s, unsigned int base, unsigned long long *res) { … } static int _kstrtoul(const char *s, unsigned int base, unsigned long *res) { … } /** * boot_kstrtoul - convert a string to an unsigned long * @s: The start of the string. The string must be null-terminated, and may also * include a single newline before its terminating null. The first character * may also be a plus sign, but not a minus sign. * @base: The number base to use. The maximum supported base is 16. If base is * given as 0, then the base of the string is automatically detected with the * conventional semantics - If it begins with 0x the number will be parsed as a * hexadecimal (case insensitive), if it otherwise begins with 0, it will be * parsed as an octal number. Otherwise it will be parsed as a decimal. * @res: Where to write the result of the conversion on success. * * Returns 0 on success, -ERANGE on overflow and -EINVAL on parsing error. * Used as a replacement for the simple_strtoull. */ int boot_kstrtoul(const char *s, unsigned int base, unsigned long *res) { … }