| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * 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); | |
| } |