1// SPDX-License-Identifier: GPL-2.0
2/*
3 * arch/loongarch/boot/compressed/string.c
4 *
5 * Very small subset of simple string routines
6 */
7
8#include <linux/types.h>
9
10void * __weak memchr(const void *s, int c, size_t n)
11{
12	const unsigned char *p = s;
13	while (n-- != 0) {
14		if ((unsigned char)c == *p++) {
15			return (void *)(p - 1);
16		}
17	}
18	return NULL;
19}
20
21int __weak memcmp(const void *cs, const void *ct, size_t count)
22{
23	int res = 0;
24	const unsigned char *su1, *su2;
25
26	for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) {
27		res = *su1 - *su2;
28		if (res != 0)
29			break;
30	}
31	return res;
32}
33
34void __weak *memset(void *s, int c, size_t n)
35{
36	int i;
37	char *ss = s;
38
39	for (i = 0; i < n; i++)
40		ss[i] = c;
41	return s;
42}
43
44void __weak *memcpy(void *dest, const void *src, size_t n)
45{
46	int i;
47	const char *s = src;
48	char *d = dest;
49
50	for (i = 0; i < n; i++)
51		d[i] = s[i];
52	return dest;
53}
54
55void __weak *memmove(void *dest, const void *src, size_t n)
56{
57	int i;
58	const char *s = src;
59	char *d = dest;
60
61	if (d < s) {
62		for (i = 0; i < n; i++)
63			d[i] = s[i];
64	} else if (d > s) {
65		for (i = n - 1; i >= 0; i--)
66			d[i] = s[i];
67	}
68
69	return dest;
70}
71
72int __weak strcmp(const char *str1, const char *str2)
73{
74	int delta = 0;
75	const unsigned char *s1 = (const unsigned char *)str1;
76	const unsigned char *s2 = (const unsigned char *)str2;
77
78	while (*s1 || *s2) {
79		delta = *s1 - *s2;
80		if (delta)
81			return delta;
82		s1++;
83		s2++;
84	}
85	return 0;
86}
87
88size_t __weak strlen(const char *s)
89{
90	const char *sc;
91
92	for (sc = s; *sc != '\0'; ++sc)
93		/* nothing */;
94	return sc - s;
95}
96
97size_t __weak strnlen(const char *s, size_t count)
98{
99	const char *sc;
100
101	for (sc = s; count-- && *sc != '\0'; ++sc)
102		/* nothing */;
103	return sc - s;
104}
105
106char * __weak strrchr(const char *s, int c)
107{
108	const char *last = NULL;
109	do {
110		if (*s == (char)c)
111			last = s;
112	} while (*s++);
113	return (char *)last;
114}
115
116#ifdef CONFIG_KASAN
117extern void *__memset(void *s, int c, size_t n) __alias(memset);
118extern void *__memcpy(void *dest, const void *src, size_t n) __alias(memcpy);
119extern void *__memmove(void *dest, const void *src, size_t n) __alias(memmove);
120#endif
121