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
memchr(const void * s,int c,size_t n)10 void * __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
memcmp(const void * cs,const void * ct,size_t count)21 int __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
memset(void * s,int c,size_t n)34 void __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
memcpy(void * dest,const void * src,size_t n)44 void __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
memmove(void * dest,const void * src,size_t n)55 void __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
strcmp(const char * str1,const char * str2)72 int __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
strlen(const char * s)88 size_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
strnlen(const char * s,size_t count)97 size_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
strrchr(const char * s,int c)106 char * __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
117 extern void *__memset(void *s, int c, size_t n) __alias(memset);
118 extern void *__memcpy(void *dest, const void *src, size_t n) __alias(memcpy);
119 extern void *__memmove(void *dest, const void *src, size_t n) __alias(memmove);
120 #endif
121