128 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * arch/arm/boot/compressed/string.c | ||
|  |  * | ||
|  |  * Small subset of simple string routines | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <linux/string.h>
 | ||
|  | 
 | ||
|  | void *memcpy(void *__dest, __const void *__src, size_t __n) | ||
|  | { | ||
|  | 	int i = 0; | ||
|  | 	unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src; | ||
|  | 
 | ||
|  | 	for (i = __n >> 3; i > 0; i--) { | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (__n & 1 << 2) { | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (__n & 1 << 1) { | ||
|  | 		*d++ = *s++; | ||
|  | 		*d++ = *s++; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (__n & 1) | ||
|  | 		*d++ = *s++; | ||
|  | 
 | ||
|  | 	return __dest; | ||
|  | } | ||
|  | 
 | ||
|  | void *memmove(void *__dest, __const void *__src, size_t count) | ||
|  | { | ||
|  | 	unsigned char *d = __dest; | ||
|  | 	const unsigned char *s = __src; | ||
|  | 
 | ||
|  | 	if (__dest == __src) | ||
|  | 		return __dest; | ||
|  | 
 | ||
|  | 	if (__dest < __src) | ||
|  | 		return memcpy(__dest, __src, count); | ||
|  | 
 | ||
|  | 	while (count--) | ||
|  | 		d[count] = s[count]; | ||
|  | 	return __dest; | ||
|  | } | ||
|  | 
 | ||
|  | size_t strlen(const char *s) | ||
|  | { | ||
|  | 	const char *sc = s; | ||
|  | 
 | ||
|  | 	while (*sc != '\0') | ||
|  | 		sc++; | ||
|  | 	return sc - s; | ||
|  | } | ||
|  | 
 | ||
|  | int memcmp(const void *cs, const void *ct, size_t count) | ||
|  | { | ||
|  | 	const unsigned char *su1 = cs, *su2 = ct, *end = su1 + count; | ||
|  | 	int res = 0; | ||
|  | 
 | ||
|  | 	while (su1 < end) { | ||
|  | 		res = *su1++ - *su2++; | ||
|  | 		if (res) | ||
|  | 			break; | ||
|  | 	} | ||
|  | 	return res; | ||
|  | } | ||
|  | 
 | ||
|  | int strcmp(const char *cs, const char *ct) | ||
|  | { | ||
|  | 	unsigned char c1, c2; | ||
|  | 	int res = 0; | ||
|  | 
 | ||
|  | 	do { | ||
|  | 		c1 = *cs++; | ||
|  | 		c2 = *ct++; | ||
|  | 		res = c1 - c2; | ||
|  | 		if (res) | ||
|  | 			break; | ||
|  | 	} while (c1); | ||
|  | 	return res; | ||
|  | } | ||
|  | 
 | ||
|  | void *memchr(const void *s, int c, size_t count) | ||
|  | { | ||
|  | 	const unsigned char *p = s; | ||
|  | 
 | ||
|  | 	while (count--) | ||
|  | 		if ((unsigned char)c == *p++) | ||
|  | 			return (void *)(p - 1); | ||
|  | 	return NULL; | ||
|  | } | ||
|  | 
 | ||
|  | char *strchr(const char *s, int c) | ||
|  | { | ||
|  | 	while (*s != (char)c) | ||
|  | 		if (*s++ == '\0') | ||
|  | 			return NULL; | ||
|  | 	return (char *)s; | ||
|  | } | ||
|  | 
 | ||
|  | #undef memset
 | ||
|  | 
 | ||
|  | void *memset(void *s, int c, size_t count) | ||
|  | { | ||
|  | 	char *xs = s; | ||
|  | 	while (count--) | ||
|  | 		*xs++ = c; | ||
|  | 	return s; | ||
|  | } | ||
|  | 
 | ||
|  | void __memzero(void *s, size_t count) | ||
|  | { | ||
|  | 	memset(s, 0, count); | ||
|  | } |