forked from mirrors/linux
		
	 7e0d92f002
			
		
	
	
		7e0d92f002
		
	
	
	
	
		
			
			Avoid using arch specific implementations of string/memory functions with KASAN since gcc cannot instrument asm code memory accesses and many bugs could be missed. Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
		
			
				
	
	
		
			139 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| #include <linux/ctype.h>
 | |
| #include <linux/kernel.h>
 | |
| #include <linux/errno.h>
 | |
| #undef CONFIG_KASAN
 | |
| #include "../lib/string.c"
 | |
| 
 | |
| int strncmp(const char *cs, const char *ct, size_t count)
 | |
| {
 | |
| 	unsigned char c1, c2;
 | |
| 
 | |
| 	while (count) {
 | |
| 		c1 = *cs++;
 | |
| 		c2 = *ct++;
 | |
| 		if (c1 != c2)
 | |
| 			return c1 < c2 ? -1 : 1;
 | |
| 		if (!c1)
 | |
| 			break;
 | |
| 		count--;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| char *skip_spaces(const char *str)
 | |
| {
 | |
| 	while (isspace(*str))
 | |
| 		++str;
 | |
| 	return (char *)str;
 | |
| }
 | |
| 
 | |
| char *strim(char *s)
 | |
| {
 | |
| 	size_t size;
 | |
| 	char *end;
 | |
| 
 | |
| 	size = strlen(s);
 | |
| 	if (!size)
 | |
| 		return s;
 | |
| 
 | |
| 	end = s + size - 1;
 | |
| 	while (end >= s && isspace(*end))
 | |
| 		end--;
 | |
| 	*(end + 1) = '\0';
 | |
| 
 | |
| 	return skip_spaces(s);
 | |
| }
 | |
| 
 | |
| /* Works only for digits and letters, but small and fast */
 | |
| #define TOLOWER(x) ((x) | 0x20)
 | |
| 
 | |
| static unsigned int simple_guess_base(const char *cp)
 | |
| {
 | |
| 	if (cp[0] == '0') {
 | |
| 		if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
 | |
| 			return 16;
 | |
| 		else
 | |
| 			return 8;
 | |
| 	} else {
 | |
| 		return 10;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 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)
 | |
| {
 | |
| 	unsigned long long result = 0;
 | |
| 
 | |
| 	if (!base)
 | |
| 		base = simple_guess_base(cp);
 | |
| 
 | |
| 	if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
 | |
| 		cp += 2;
 | |
| 
 | |
| 	while (isxdigit(*cp)) {
 | |
| 		unsigned int value;
 | |
| 
 | |
| 		value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
 | |
| 		if (value >= base)
 | |
| 			break;
 | |
| 		result = result * base + value;
 | |
| 		cp++;
 | |
| 	}
 | |
| 	if (endp)
 | |
| 		*endp = (char *)cp;
 | |
| 
 | |
| 	return result;
 | |
| }
 | |
| 
 | |
| long simple_strtol(const char *cp, char **endp, unsigned int base)
 | |
| {
 | |
| 	if (*cp == '-')
 | |
| 		return -simple_strtoull(cp + 1, endp, base);
 | |
| 
 | |
| 	return simple_strtoull(cp, endp, base);
 | |
| }
 | |
| 
 | |
| int kstrtobool(const char *s, bool *res)
 | |
| {
 | |
| 	if (!s)
 | |
| 		return -EINVAL;
 | |
| 
 | |
| 	switch (s[0]) {
 | |
| 	case 'y':
 | |
| 	case 'Y':
 | |
| 	case '1':
 | |
| 		*res = true;
 | |
| 		return 0;
 | |
| 	case 'n':
 | |
| 	case 'N':
 | |
| 	case '0':
 | |
| 		*res = false;
 | |
| 		return 0;
 | |
| 	case 'o':
 | |
| 	case 'O':
 | |
| 		switch (s[1]) {
 | |
| 		case 'n':
 | |
| 		case 'N':
 | |
| 			*res = true;
 | |
| 			return 0;
 | |
| 		case 'f':
 | |
| 		case 'F':
 | |
| 			*res = false;
 | |
| 			return 0;
 | |
| 		default:
 | |
| 			break;
 | |
| 		}
 | |
| 	default:
 | |
| 		break;
 | |
| 	}
 | |
| 
 | |
| 	return -EINVAL;
 | |
| }
 |