| /* | 
 |  * 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; | 
 | } | 
 |  | 
 | size_t strnlen(const char *s, size_t count) | 
 | { | 
 | 	const char *sc; | 
 |  | 
 | 	for (sc = s; count-- && *sc != '\0'; ++sc) | 
 | 		/* nothing */; | 
 | 	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); | 
 | } |