xref: /openbmc/linux/arch/arm/boot/compressed/string.c (revision b24413180f5600bcb3bb70fbed5cf186b60864bd)
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