• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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