1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2df4879faSNicolas Pitre /* 3df4879faSNicolas Pitre * arch/arm/boot/compressed/string.c 4df4879faSNicolas Pitre * 5df4879faSNicolas Pitre * Small subset of simple string routines 6df4879faSNicolas Pitre */ 7df4879faSNicolas Pitre 8df4879faSNicolas Pitre #include <linux/string.h> 9df4879faSNicolas Pitre 10df4879faSNicolas Pitre void *memcpy(void *__dest, __const void *__src, size_t __n) 11df4879faSNicolas Pitre { 12df4879faSNicolas Pitre int i = 0; 13df4879faSNicolas Pitre unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src; 14df4879faSNicolas Pitre 15df4879faSNicolas Pitre for (i = __n >> 3; i > 0; i--) { 16df4879faSNicolas Pitre *d++ = *s++; 17df4879faSNicolas Pitre *d++ = *s++; 18df4879faSNicolas Pitre *d++ = *s++; 19df4879faSNicolas Pitre *d++ = *s++; 20df4879faSNicolas Pitre *d++ = *s++; 21df4879faSNicolas Pitre *d++ = *s++; 22df4879faSNicolas Pitre *d++ = *s++; 23df4879faSNicolas Pitre *d++ = *s++; 24df4879faSNicolas Pitre } 25df4879faSNicolas Pitre 26df4879faSNicolas Pitre if (__n & 1 << 2) { 27df4879faSNicolas Pitre *d++ = *s++; 28df4879faSNicolas Pitre *d++ = *s++; 29df4879faSNicolas Pitre *d++ = *s++; 30df4879faSNicolas Pitre *d++ = *s++; 31df4879faSNicolas Pitre } 32df4879faSNicolas Pitre 33df4879faSNicolas Pitre if (__n & 1 << 1) { 34df4879faSNicolas Pitre *d++ = *s++; 35df4879faSNicolas Pitre *d++ = *s++; 36df4879faSNicolas Pitre } 37df4879faSNicolas Pitre 38df4879faSNicolas Pitre if (__n & 1) 39df4879faSNicolas Pitre *d++ = *s++; 40df4879faSNicolas Pitre 41df4879faSNicolas Pitre return __dest; 42df4879faSNicolas Pitre } 43df4879faSNicolas Pitre 44df4879faSNicolas Pitre void *memmove(void *__dest, __const void *__src, size_t count) 45df4879faSNicolas Pitre { 46df4879faSNicolas Pitre unsigned char *d = __dest; 47df4879faSNicolas Pitre const unsigned char *s = __src; 48df4879faSNicolas Pitre 49df4879faSNicolas Pitre if (__dest == __src) 50df4879faSNicolas Pitre return __dest; 51df4879faSNicolas Pitre 52df4879faSNicolas Pitre if (__dest < __src) 53df4879faSNicolas Pitre return memcpy(__dest, __src, count); 54df4879faSNicolas Pitre 55df4879faSNicolas Pitre while (count--) 56df4879faSNicolas Pitre d[count] = s[count]; 57df4879faSNicolas Pitre return __dest; 58df4879faSNicolas Pitre } 59df4879faSNicolas Pitre 60df4879faSNicolas Pitre size_t strlen(const char *s) 61df4879faSNicolas Pitre { 62df4879faSNicolas Pitre const char *sc = s; 63df4879faSNicolas Pitre 64df4879faSNicolas Pitre while (*sc != '\0') 65df4879faSNicolas Pitre sc++; 66df4879faSNicolas Pitre return sc - s; 67df4879faSNicolas Pitre } 68df4879faSNicolas Pitre 6976df6980SRob Herring size_t strnlen(const char *s, size_t count) 7076df6980SRob Herring { 7176df6980SRob Herring const char *sc; 7276df6980SRob Herring 7376df6980SRob Herring for (sc = s; count-- && *sc != '\0'; ++sc) 7476df6980SRob Herring /* nothing */; 7576df6980SRob Herring return sc - s; 7676df6980SRob Herring } 7776df6980SRob Herring 78df4879faSNicolas Pitre int memcmp(const void *cs, const void *ct, size_t count) 79df4879faSNicolas Pitre { 80df4879faSNicolas Pitre const unsigned char *su1 = cs, *su2 = ct, *end = su1 + count; 81df4879faSNicolas Pitre int res = 0; 82df4879faSNicolas Pitre 83df4879faSNicolas Pitre while (su1 < end) { 84df4879faSNicolas Pitre res = *su1++ - *su2++; 85df4879faSNicolas Pitre if (res) 86df4879faSNicolas Pitre break; 87df4879faSNicolas Pitre } 88df4879faSNicolas Pitre return res; 89df4879faSNicolas Pitre } 90df4879faSNicolas Pitre 91df4879faSNicolas Pitre int strcmp(const char *cs, const char *ct) 92df4879faSNicolas Pitre { 93df4879faSNicolas Pitre unsigned char c1, c2; 94df4879faSNicolas Pitre int res = 0; 95df4879faSNicolas Pitre 96df4879faSNicolas Pitre do { 97df4879faSNicolas Pitre c1 = *cs++; 98df4879faSNicolas Pitre c2 = *ct++; 99df4879faSNicolas Pitre res = c1 - c2; 100df4879faSNicolas Pitre if (res) 101df4879faSNicolas Pitre break; 102df4879faSNicolas Pitre } while (c1); 103df4879faSNicolas Pitre return res; 104df4879faSNicolas Pitre } 105df4879faSNicolas Pitre 106df4879faSNicolas Pitre void *memchr(const void *s, int c, size_t count) 107df4879faSNicolas Pitre { 108df4879faSNicolas Pitre const unsigned char *p = s; 109df4879faSNicolas Pitre 110df4879faSNicolas Pitre while (count--) 111df4879faSNicolas Pitre if ((unsigned char)c == *p++) 112df4879faSNicolas Pitre return (void *)(p - 1); 113df4879faSNicolas Pitre return NULL; 114df4879faSNicolas Pitre } 115df4879faSNicolas Pitre 116df4879faSNicolas Pitre char *strchr(const char *s, int c) 117df4879faSNicolas Pitre { 118df4879faSNicolas Pitre while (*s != (char)c) 119df4879faSNicolas Pitre if (*s++ == '\0') 120df4879faSNicolas Pitre return NULL; 121df4879faSNicolas Pitre return (char *)s; 122df4879faSNicolas Pitre } 123df4879faSNicolas Pitre 124df4879faSNicolas Pitre #undef memset 125df4879faSNicolas Pitre 126df4879faSNicolas Pitre void *memset(void *s, int c, size_t count) 127df4879faSNicolas Pitre { 128df4879faSNicolas Pitre char *xs = s; 129df4879faSNicolas Pitre while (count--) 130df4879faSNicolas Pitre *xs++ = c; 131df4879faSNicolas Pitre return s; 132df4879faSNicolas Pitre } 133df4879faSNicolas Pitre 134df4879faSNicolas Pitre void __memzero(void *s, size_t count) 135df4879faSNicolas Pitre { 136df4879faSNicolas Pitre memset(s, 0, count); 137df4879faSNicolas Pitre } 138