|  | /* | 
|  | * 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); | 
|  | } |