xref: /rk3399_rockchip-uboot/lib/string.c (revision 78acc472d9719316f22e002a009a998d9ceec29d)
1*78acc472SPeter Tyser /*
2*78acc472SPeter Tyser  *  linux/lib/string.c
3*78acc472SPeter Tyser  *
4*78acc472SPeter Tyser  *  Copyright (C) 1991, 1992  Linus Torvalds
5*78acc472SPeter Tyser  */
6*78acc472SPeter Tyser 
7*78acc472SPeter Tyser /*
8*78acc472SPeter Tyser  * stupid library routines.. The optimized versions should generally be found
9*78acc472SPeter Tyser  * as inline code in <asm-xx/string.h>
10*78acc472SPeter Tyser  *
11*78acc472SPeter Tyser  * These are buggy as well..
12*78acc472SPeter Tyser  *
13*78acc472SPeter Tyser  * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
14*78acc472SPeter Tyser  * -  Added strsep() which will replace strtok() soon (because strsep() is
15*78acc472SPeter Tyser  *    reentrant and should be faster). Use only strsep() in new code, please.
16*78acc472SPeter Tyser  */
17*78acc472SPeter Tyser 
18*78acc472SPeter Tyser #include <linux/types.h>
19*78acc472SPeter Tyser #include <linux/string.h>
20*78acc472SPeter Tyser #include <linux/ctype.h>
21*78acc472SPeter Tyser #include <malloc.h>
22*78acc472SPeter Tyser 
23*78acc472SPeter Tyser 
24*78acc472SPeter Tyser #if 0 /* not used - was: #ifndef __HAVE_ARCH_STRNICMP */
25*78acc472SPeter Tyser /**
26*78acc472SPeter Tyser  * strnicmp - Case insensitive, length-limited string comparison
27*78acc472SPeter Tyser  * @s1: One string
28*78acc472SPeter Tyser  * @s2: The other string
29*78acc472SPeter Tyser  * @len: the maximum number of characters to compare
30*78acc472SPeter Tyser  */
31*78acc472SPeter Tyser int strnicmp(const char *s1, const char *s2, size_t len)
32*78acc472SPeter Tyser {
33*78acc472SPeter Tyser 	/* Yes, Virginia, it had better be unsigned */
34*78acc472SPeter Tyser 	unsigned char c1, c2;
35*78acc472SPeter Tyser 
36*78acc472SPeter Tyser 	c1 = 0;	c2 = 0;
37*78acc472SPeter Tyser 	if (len) {
38*78acc472SPeter Tyser 		do {
39*78acc472SPeter Tyser 			c1 = *s1; c2 = *s2;
40*78acc472SPeter Tyser 			s1++; s2++;
41*78acc472SPeter Tyser 			if (!c1)
42*78acc472SPeter Tyser 				break;
43*78acc472SPeter Tyser 			if (!c2)
44*78acc472SPeter Tyser 				break;
45*78acc472SPeter Tyser 			if (c1 == c2)
46*78acc472SPeter Tyser 				continue;
47*78acc472SPeter Tyser 			c1 = tolower(c1);
48*78acc472SPeter Tyser 			c2 = tolower(c2);
49*78acc472SPeter Tyser 			if (c1 != c2)
50*78acc472SPeter Tyser 				break;
51*78acc472SPeter Tyser 		} while (--len);
52*78acc472SPeter Tyser 	}
53*78acc472SPeter Tyser 	return (int)c1 - (int)c2;
54*78acc472SPeter Tyser }
55*78acc472SPeter Tyser #endif
56*78acc472SPeter Tyser 
57*78acc472SPeter Tyser char * ___strtok;
58*78acc472SPeter Tyser 
59*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRCPY
60*78acc472SPeter Tyser /**
61*78acc472SPeter Tyser  * strcpy - Copy a %NUL terminated string
62*78acc472SPeter Tyser  * @dest: Where to copy the string to
63*78acc472SPeter Tyser  * @src: Where to copy the string from
64*78acc472SPeter Tyser  */
65*78acc472SPeter Tyser char * strcpy(char * dest,const char *src)
66*78acc472SPeter Tyser {
67*78acc472SPeter Tyser 	char *tmp = dest;
68*78acc472SPeter Tyser 
69*78acc472SPeter Tyser 	while ((*dest++ = *src++) != '\0')
70*78acc472SPeter Tyser 		/* nothing */;
71*78acc472SPeter Tyser 	return tmp;
72*78acc472SPeter Tyser }
73*78acc472SPeter Tyser #endif
74*78acc472SPeter Tyser 
75*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRNCPY
76*78acc472SPeter Tyser /**
77*78acc472SPeter Tyser  * strncpy - Copy a length-limited, %NUL-terminated string
78*78acc472SPeter Tyser  * @dest: Where to copy the string to
79*78acc472SPeter Tyser  * @src: Where to copy the string from
80*78acc472SPeter Tyser  * @count: The maximum number of bytes to copy
81*78acc472SPeter Tyser  *
82*78acc472SPeter Tyser  * Note that unlike userspace strncpy, this does not %NUL-pad the buffer.
83*78acc472SPeter Tyser  * However, the result is not %NUL-terminated if the source exceeds
84*78acc472SPeter Tyser  * @count bytes.
85*78acc472SPeter Tyser  */
86*78acc472SPeter Tyser char * strncpy(char * dest,const char *src,size_t count)
87*78acc472SPeter Tyser {
88*78acc472SPeter Tyser 	char *tmp = dest;
89*78acc472SPeter Tyser 
90*78acc472SPeter Tyser 	while (count-- && (*dest++ = *src++) != '\0')
91*78acc472SPeter Tyser 		/* nothing */;
92*78acc472SPeter Tyser 
93*78acc472SPeter Tyser 	return tmp;
94*78acc472SPeter Tyser }
95*78acc472SPeter Tyser #endif
96*78acc472SPeter Tyser 
97*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRCAT
98*78acc472SPeter Tyser /**
99*78acc472SPeter Tyser  * strcat - Append one %NUL-terminated string to another
100*78acc472SPeter Tyser  * @dest: The string to be appended to
101*78acc472SPeter Tyser  * @src: The string to append to it
102*78acc472SPeter Tyser  */
103*78acc472SPeter Tyser char * strcat(char * dest, const char * src)
104*78acc472SPeter Tyser {
105*78acc472SPeter Tyser 	char *tmp = dest;
106*78acc472SPeter Tyser 
107*78acc472SPeter Tyser 	while (*dest)
108*78acc472SPeter Tyser 		dest++;
109*78acc472SPeter Tyser 	while ((*dest++ = *src++) != '\0')
110*78acc472SPeter Tyser 		;
111*78acc472SPeter Tyser 
112*78acc472SPeter Tyser 	return tmp;
113*78acc472SPeter Tyser }
114*78acc472SPeter Tyser #endif
115*78acc472SPeter Tyser 
116*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRNCAT
117*78acc472SPeter Tyser /**
118*78acc472SPeter Tyser  * strncat - Append a length-limited, %NUL-terminated string to another
119*78acc472SPeter Tyser  * @dest: The string to be appended to
120*78acc472SPeter Tyser  * @src: The string to append to it
121*78acc472SPeter Tyser  * @count: The maximum numbers of bytes to copy
122*78acc472SPeter Tyser  *
123*78acc472SPeter Tyser  * Note that in contrast to strncpy, strncat ensures the result is
124*78acc472SPeter Tyser  * terminated.
125*78acc472SPeter Tyser  */
126*78acc472SPeter Tyser char * strncat(char *dest, const char *src, size_t count)
127*78acc472SPeter Tyser {
128*78acc472SPeter Tyser 	char *tmp = dest;
129*78acc472SPeter Tyser 
130*78acc472SPeter Tyser 	if (count) {
131*78acc472SPeter Tyser 		while (*dest)
132*78acc472SPeter Tyser 			dest++;
133*78acc472SPeter Tyser 		while ((*dest++ = *src++)) {
134*78acc472SPeter Tyser 			if (--count == 0) {
135*78acc472SPeter Tyser 				*dest = '\0';
136*78acc472SPeter Tyser 				break;
137*78acc472SPeter Tyser 			}
138*78acc472SPeter Tyser 		}
139*78acc472SPeter Tyser 	}
140*78acc472SPeter Tyser 
141*78acc472SPeter Tyser 	return tmp;
142*78acc472SPeter Tyser }
143*78acc472SPeter Tyser #endif
144*78acc472SPeter Tyser 
145*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRCMP
146*78acc472SPeter Tyser /**
147*78acc472SPeter Tyser  * strcmp - Compare two strings
148*78acc472SPeter Tyser  * @cs: One string
149*78acc472SPeter Tyser  * @ct: Another string
150*78acc472SPeter Tyser  */
151*78acc472SPeter Tyser int strcmp(const char * cs,const char * ct)
152*78acc472SPeter Tyser {
153*78acc472SPeter Tyser 	register signed char __res;
154*78acc472SPeter Tyser 
155*78acc472SPeter Tyser 	while (1) {
156*78acc472SPeter Tyser 		if ((__res = *cs - *ct++) != 0 || !*cs++)
157*78acc472SPeter Tyser 			break;
158*78acc472SPeter Tyser 	}
159*78acc472SPeter Tyser 
160*78acc472SPeter Tyser 	return __res;
161*78acc472SPeter Tyser }
162*78acc472SPeter Tyser #endif
163*78acc472SPeter Tyser 
164*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRNCMP
165*78acc472SPeter Tyser /**
166*78acc472SPeter Tyser  * strncmp - Compare two length-limited strings
167*78acc472SPeter Tyser  * @cs: One string
168*78acc472SPeter Tyser  * @ct: Another string
169*78acc472SPeter Tyser  * @count: The maximum number of bytes to compare
170*78acc472SPeter Tyser  */
171*78acc472SPeter Tyser int strncmp(const char * cs,const char * ct,size_t count)
172*78acc472SPeter Tyser {
173*78acc472SPeter Tyser 	register signed char __res = 0;
174*78acc472SPeter Tyser 
175*78acc472SPeter Tyser 	while (count) {
176*78acc472SPeter Tyser 		if ((__res = *cs - *ct++) != 0 || !*cs++)
177*78acc472SPeter Tyser 			break;
178*78acc472SPeter Tyser 		count--;
179*78acc472SPeter Tyser 	}
180*78acc472SPeter Tyser 
181*78acc472SPeter Tyser 	return __res;
182*78acc472SPeter Tyser }
183*78acc472SPeter Tyser #endif
184*78acc472SPeter Tyser 
185*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRCHR
186*78acc472SPeter Tyser /**
187*78acc472SPeter Tyser  * strchr - Find the first occurrence of a character in a string
188*78acc472SPeter Tyser  * @s: The string to be searched
189*78acc472SPeter Tyser  * @c: The character to search for
190*78acc472SPeter Tyser  */
191*78acc472SPeter Tyser char * strchr(const char * s, int c)
192*78acc472SPeter Tyser {
193*78acc472SPeter Tyser 	for(; *s != (char) c; ++s)
194*78acc472SPeter Tyser 		if (*s == '\0')
195*78acc472SPeter Tyser 			return NULL;
196*78acc472SPeter Tyser 	return (char *) s;
197*78acc472SPeter Tyser }
198*78acc472SPeter Tyser #endif
199*78acc472SPeter Tyser 
200*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRRCHR
201*78acc472SPeter Tyser /**
202*78acc472SPeter Tyser  * strrchr - Find the last occurrence of a character in a string
203*78acc472SPeter Tyser  * @s: The string to be searched
204*78acc472SPeter Tyser  * @c: The character to search for
205*78acc472SPeter Tyser  */
206*78acc472SPeter Tyser char * strrchr(const char * s, int c)
207*78acc472SPeter Tyser {
208*78acc472SPeter Tyser        const char *p = s + strlen(s);
209*78acc472SPeter Tyser        do {
210*78acc472SPeter Tyser 	   if (*p == (char)c)
211*78acc472SPeter Tyser 	       return (char *)p;
212*78acc472SPeter Tyser        } while (--p >= s);
213*78acc472SPeter Tyser        return NULL;
214*78acc472SPeter Tyser }
215*78acc472SPeter Tyser #endif
216*78acc472SPeter Tyser 
217*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRLEN
218*78acc472SPeter Tyser /**
219*78acc472SPeter Tyser  * strlen - Find the length of a string
220*78acc472SPeter Tyser  * @s: The string to be sized
221*78acc472SPeter Tyser  */
222*78acc472SPeter Tyser size_t strlen(const char * s)
223*78acc472SPeter Tyser {
224*78acc472SPeter Tyser 	const char *sc;
225*78acc472SPeter Tyser 
226*78acc472SPeter Tyser 	for (sc = s; *sc != '\0'; ++sc)
227*78acc472SPeter Tyser 		/* nothing */;
228*78acc472SPeter Tyser 	return sc - s;
229*78acc472SPeter Tyser }
230*78acc472SPeter Tyser #endif
231*78acc472SPeter Tyser 
232*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRNLEN
233*78acc472SPeter Tyser /**
234*78acc472SPeter Tyser  * strnlen - Find the length of a length-limited string
235*78acc472SPeter Tyser  * @s: The string to be sized
236*78acc472SPeter Tyser  * @count: The maximum number of bytes to search
237*78acc472SPeter Tyser  */
238*78acc472SPeter Tyser size_t strnlen(const char * s, size_t count)
239*78acc472SPeter Tyser {
240*78acc472SPeter Tyser 	const char *sc;
241*78acc472SPeter Tyser 
242*78acc472SPeter Tyser 	for (sc = s; count-- && *sc != '\0'; ++sc)
243*78acc472SPeter Tyser 		/* nothing */;
244*78acc472SPeter Tyser 	return sc - s;
245*78acc472SPeter Tyser }
246*78acc472SPeter Tyser #endif
247*78acc472SPeter Tyser 
248*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRDUP
249*78acc472SPeter Tyser char * strdup(const char *s)
250*78acc472SPeter Tyser {
251*78acc472SPeter Tyser 	char *new;
252*78acc472SPeter Tyser 
253*78acc472SPeter Tyser 	if ((s == NULL)	||
254*78acc472SPeter Tyser 	    ((new = malloc (strlen(s) + 1)) == NULL) ) {
255*78acc472SPeter Tyser 		return NULL;
256*78acc472SPeter Tyser 	}
257*78acc472SPeter Tyser 
258*78acc472SPeter Tyser 	strcpy (new, s);
259*78acc472SPeter Tyser 	return new;
260*78acc472SPeter Tyser }
261*78acc472SPeter Tyser #endif
262*78acc472SPeter Tyser 
263*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRSPN
264*78acc472SPeter Tyser /**
265*78acc472SPeter Tyser  * strspn - Calculate the length of the initial substring of @s which only
266*78acc472SPeter Tyser  *	contain letters in @accept
267*78acc472SPeter Tyser  * @s: The string to be searched
268*78acc472SPeter Tyser  * @accept: The string to search for
269*78acc472SPeter Tyser  */
270*78acc472SPeter Tyser size_t strspn(const char *s, const char *accept)
271*78acc472SPeter Tyser {
272*78acc472SPeter Tyser 	const char *p;
273*78acc472SPeter Tyser 	const char *a;
274*78acc472SPeter Tyser 	size_t count = 0;
275*78acc472SPeter Tyser 
276*78acc472SPeter Tyser 	for (p = s; *p != '\0'; ++p) {
277*78acc472SPeter Tyser 		for (a = accept; *a != '\0'; ++a) {
278*78acc472SPeter Tyser 			if (*p == *a)
279*78acc472SPeter Tyser 				break;
280*78acc472SPeter Tyser 		}
281*78acc472SPeter Tyser 		if (*a == '\0')
282*78acc472SPeter Tyser 			return count;
283*78acc472SPeter Tyser 		++count;
284*78acc472SPeter Tyser 	}
285*78acc472SPeter Tyser 
286*78acc472SPeter Tyser 	return count;
287*78acc472SPeter Tyser }
288*78acc472SPeter Tyser #endif
289*78acc472SPeter Tyser 
290*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRPBRK
291*78acc472SPeter Tyser /**
292*78acc472SPeter Tyser  * strpbrk - Find the first occurrence of a set of characters
293*78acc472SPeter Tyser  * @cs: The string to be searched
294*78acc472SPeter Tyser  * @ct: The characters to search for
295*78acc472SPeter Tyser  */
296*78acc472SPeter Tyser char * strpbrk(const char * cs,const char * ct)
297*78acc472SPeter Tyser {
298*78acc472SPeter Tyser 	const char *sc1,*sc2;
299*78acc472SPeter Tyser 
300*78acc472SPeter Tyser 	for( sc1 = cs; *sc1 != '\0'; ++sc1) {
301*78acc472SPeter Tyser 		for( sc2 = ct; *sc2 != '\0'; ++sc2) {
302*78acc472SPeter Tyser 			if (*sc1 == *sc2)
303*78acc472SPeter Tyser 				return (char *) sc1;
304*78acc472SPeter Tyser 		}
305*78acc472SPeter Tyser 	}
306*78acc472SPeter Tyser 	return NULL;
307*78acc472SPeter Tyser }
308*78acc472SPeter Tyser #endif
309*78acc472SPeter Tyser 
310*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRTOK
311*78acc472SPeter Tyser /**
312*78acc472SPeter Tyser  * strtok - Split a string into tokens
313*78acc472SPeter Tyser  * @s: The string to be searched
314*78acc472SPeter Tyser  * @ct: The characters to search for
315*78acc472SPeter Tyser  *
316*78acc472SPeter Tyser  * WARNING: strtok is deprecated, use strsep instead.
317*78acc472SPeter Tyser  */
318*78acc472SPeter Tyser char * strtok(char * s,const char * ct)
319*78acc472SPeter Tyser {
320*78acc472SPeter Tyser 	char *sbegin, *send;
321*78acc472SPeter Tyser 
322*78acc472SPeter Tyser 	sbegin  = s ? s : ___strtok;
323*78acc472SPeter Tyser 	if (!sbegin) {
324*78acc472SPeter Tyser 		return NULL;
325*78acc472SPeter Tyser 	}
326*78acc472SPeter Tyser 	sbegin += strspn(sbegin,ct);
327*78acc472SPeter Tyser 	if (*sbegin == '\0') {
328*78acc472SPeter Tyser 		___strtok = NULL;
329*78acc472SPeter Tyser 		return( NULL );
330*78acc472SPeter Tyser 	}
331*78acc472SPeter Tyser 	send = strpbrk( sbegin, ct);
332*78acc472SPeter Tyser 	if (send && *send != '\0')
333*78acc472SPeter Tyser 		*send++ = '\0';
334*78acc472SPeter Tyser 	___strtok = send;
335*78acc472SPeter Tyser 	return (sbegin);
336*78acc472SPeter Tyser }
337*78acc472SPeter Tyser #endif
338*78acc472SPeter Tyser 
339*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRSEP
340*78acc472SPeter Tyser /**
341*78acc472SPeter Tyser  * strsep - Split a string into tokens
342*78acc472SPeter Tyser  * @s: The string to be searched
343*78acc472SPeter Tyser  * @ct: The characters to search for
344*78acc472SPeter Tyser  *
345*78acc472SPeter Tyser  * strsep() updates @s to point after the token, ready for the next call.
346*78acc472SPeter Tyser  *
347*78acc472SPeter Tyser  * It returns empty tokens, too, behaving exactly like the libc function
348*78acc472SPeter Tyser  * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
349*78acc472SPeter Tyser  * Same semantics, slimmer shape. ;)
350*78acc472SPeter Tyser  */
351*78acc472SPeter Tyser char * strsep(char **s, const char *ct)
352*78acc472SPeter Tyser {
353*78acc472SPeter Tyser 	char *sbegin = *s, *end;
354*78acc472SPeter Tyser 
355*78acc472SPeter Tyser 	if (sbegin == NULL)
356*78acc472SPeter Tyser 		return NULL;
357*78acc472SPeter Tyser 
358*78acc472SPeter Tyser 	end = strpbrk(sbegin, ct);
359*78acc472SPeter Tyser 	if (end)
360*78acc472SPeter Tyser 		*end++ = '\0';
361*78acc472SPeter Tyser 	*s = end;
362*78acc472SPeter Tyser 
363*78acc472SPeter Tyser 	return sbegin;
364*78acc472SPeter Tyser }
365*78acc472SPeter Tyser #endif
366*78acc472SPeter Tyser 
367*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRSWAB
368*78acc472SPeter Tyser /**
369*78acc472SPeter Tyser  * strswab - swap adjacent even and odd bytes in %NUL-terminated string
370*78acc472SPeter Tyser  * s: address of the string
371*78acc472SPeter Tyser  *
372*78acc472SPeter Tyser  * returns the address of the swapped string or NULL on error. If
373*78acc472SPeter Tyser  * string length is odd, last byte is untouched.
374*78acc472SPeter Tyser  */
375*78acc472SPeter Tyser char *strswab(const char *s)
376*78acc472SPeter Tyser {
377*78acc472SPeter Tyser 	char *p, *q;
378*78acc472SPeter Tyser 
379*78acc472SPeter Tyser 	if ((NULL == s) || ('\0' == *s)) {
380*78acc472SPeter Tyser 		return (NULL);
381*78acc472SPeter Tyser 	}
382*78acc472SPeter Tyser 
383*78acc472SPeter Tyser 	for (p=(char *)s, q=p+1; (*p != '\0') && (*q != '\0'); p+=2, q+=2) {
384*78acc472SPeter Tyser 		char  tmp;
385*78acc472SPeter Tyser 
386*78acc472SPeter Tyser 		tmp = *p;
387*78acc472SPeter Tyser 		*p  = *q;
388*78acc472SPeter Tyser 		*q  = tmp;
389*78acc472SPeter Tyser 	}
390*78acc472SPeter Tyser 
391*78acc472SPeter Tyser 	return (char *) s;
392*78acc472SPeter Tyser }
393*78acc472SPeter Tyser #endif
394*78acc472SPeter Tyser 
395*78acc472SPeter Tyser #ifndef __HAVE_ARCH_MEMSET
396*78acc472SPeter Tyser /**
397*78acc472SPeter Tyser  * memset - Fill a region of memory with the given value
398*78acc472SPeter Tyser  * @s: Pointer to the start of the area.
399*78acc472SPeter Tyser  * @c: The byte to fill the area with
400*78acc472SPeter Tyser  * @count: The size of the area.
401*78acc472SPeter Tyser  *
402*78acc472SPeter Tyser  * Do not use memset() to access IO space, use memset_io() instead.
403*78acc472SPeter Tyser  */
404*78acc472SPeter Tyser void * memset(void * s,int c,size_t count)
405*78acc472SPeter Tyser {
406*78acc472SPeter Tyser 	unsigned long *sl = (unsigned long *) s;
407*78acc472SPeter Tyser 	unsigned long cl = 0;
408*78acc472SPeter Tyser 	char *s8;
409*78acc472SPeter Tyser 	int i;
410*78acc472SPeter Tyser 
411*78acc472SPeter Tyser 	/* do it one word at a time (32 bits or 64 bits) while possible */
412*78acc472SPeter Tyser 	if ( ((ulong)s & (sizeof(*sl) - 1)) == 0) {
413*78acc472SPeter Tyser 		for (i = 0; i < sizeof(*sl); i++) {
414*78acc472SPeter Tyser 			cl <<= 8;
415*78acc472SPeter Tyser 			cl |= c & 0xff;
416*78acc472SPeter Tyser 		}
417*78acc472SPeter Tyser 		while (count >= sizeof(*sl)) {
418*78acc472SPeter Tyser 			*sl++ = cl;
419*78acc472SPeter Tyser 			count -= sizeof(*sl);
420*78acc472SPeter Tyser 		}
421*78acc472SPeter Tyser 	}
422*78acc472SPeter Tyser 	/* fill 8 bits at a time */
423*78acc472SPeter Tyser 	s8 = (char *)sl;
424*78acc472SPeter Tyser 	while (count--)
425*78acc472SPeter Tyser 		*s8++ = c;
426*78acc472SPeter Tyser 
427*78acc472SPeter Tyser 	return s;
428*78acc472SPeter Tyser }
429*78acc472SPeter Tyser #endif
430*78acc472SPeter Tyser 
431*78acc472SPeter Tyser #ifndef __HAVE_ARCH_BCOPY
432*78acc472SPeter Tyser /**
433*78acc472SPeter Tyser  * bcopy - Copy one area of memory to another
434*78acc472SPeter Tyser  * @src: Where to copy from
435*78acc472SPeter Tyser  * @dest: Where to copy to
436*78acc472SPeter Tyser  * @count: The size of the area.
437*78acc472SPeter Tyser  *
438*78acc472SPeter Tyser  * Note that this is the same as memcpy(), with the arguments reversed.
439*78acc472SPeter Tyser  * memcpy() is the standard, bcopy() is a legacy BSD function.
440*78acc472SPeter Tyser  *
441*78acc472SPeter Tyser  * You should not use this function to access IO space, use memcpy_toio()
442*78acc472SPeter Tyser  * or memcpy_fromio() instead.
443*78acc472SPeter Tyser  */
444*78acc472SPeter Tyser char * bcopy(const char * src, char * dest, int count)
445*78acc472SPeter Tyser {
446*78acc472SPeter Tyser 	char *tmp = dest;
447*78acc472SPeter Tyser 
448*78acc472SPeter Tyser 	while (count--)
449*78acc472SPeter Tyser 		*tmp++ = *src++;
450*78acc472SPeter Tyser 
451*78acc472SPeter Tyser 	return dest;
452*78acc472SPeter Tyser }
453*78acc472SPeter Tyser #endif
454*78acc472SPeter Tyser 
455*78acc472SPeter Tyser #ifndef __HAVE_ARCH_MEMCPY
456*78acc472SPeter Tyser /**
457*78acc472SPeter Tyser  * memcpy - Copy one area of memory to another
458*78acc472SPeter Tyser  * @dest: Where to copy to
459*78acc472SPeter Tyser  * @src: Where to copy from
460*78acc472SPeter Tyser  * @count: The size of the area.
461*78acc472SPeter Tyser  *
462*78acc472SPeter Tyser  * You should not use this function to access IO space, use memcpy_toio()
463*78acc472SPeter Tyser  * or memcpy_fromio() instead.
464*78acc472SPeter Tyser  */
465*78acc472SPeter Tyser void * memcpy(void *dest, const void *src, size_t count)
466*78acc472SPeter Tyser {
467*78acc472SPeter Tyser 	unsigned long *dl = (unsigned long *)dest, *sl = (unsigned long *)src;
468*78acc472SPeter Tyser 	char *d8, *s8;
469*78acc472SPeter Tyser 
470*78acc472SPeter Tyser 	/* while all data is aligned (common case), copy a word at a time */
471*78acc472SPeter Tyser 	if ( (((ulong)dest | (ulong)src) & (sizeof(*dl) - 1)) == 0) {
472*78acc472SPeter Tyser 		while (count >= sizeof(*dl)) {
473*78acc472SPeter Tyser 			*dl++ = *sl++;
474*78acc472SPeter Tyser 			count -= sizeof(*dl);
475*78acc472SPeter Tyser 		}
476*78acc472SPeter Tyser 	}
477*78acc472SPeter Tyser 	/* copy the reset one byte at a time */
478*78acc472SPeter Tyser 	d8 = (char *)dl;
479*78acc472SPeter Tyser 	s8 = (char *)sl;
480*78acc472SPeter Tyser 	while (count--)
481*78acc472SPeter Tyser 		*d8++ = *s8++;
482*78acc472SPeter Tyser 
483*78acc472SPeter Tyser 	return dest;
484*78acc472SPeter Tyser }
485*78acc472SPeter Tyser #endif
486*78acc472SPeter Tyser 
487*78acc472SPeter Tyser #ifndef __HAVE_ARCH_MEMMOVE
488*78acc472SPeter Tyser /**
489*78acc472SPeter Tyser  * memmove - Copy one area of memory to another
490*78acc472SPeter Tyser  * @dest: Where to copy to
491*78acc472SPeter Tyser  * @src: Where to copy from
492*78acc472SPeter Tyser  * @count: The size of the area.
493*78acc472SPeter Tyser  *
494*78acc472SPeter Tyser  * Unlike memcpy(), memmove() copes with overlapping areas.
495*78acc472SPeter Tyser  */
496*78acc472SPeter Tyser void * memmove(void * dest,const void *src,size_t count)
497*78acc472SPeter Tyser {
498*78acc472SPeter Tyser 	char *tmp, *s;
499*78acc472SPeter Tyser 
500*78acc472SPeter Tyser 	if (dest <= src) {
501*78acc472SPeter Tyser 		tmp = (char *) dest;
502*78acc472SPeter Tyser 		s = (char *) src;
503*78acc472SPeter Tyser 		while (count--)
504*78acc472SPeter Tyser 			*tmp++ = *s++;
505*78acc472SPeter Tyser 		}
506*78acc472SPeter Tyser 	else {
507*78acc472SPeter Tyser 		tmp = (char *) dest + count;
508*78acc472SPeter Tyser 		s = (char *) src + count;
509*78acc472SPeter Tyser 		while (count--)
510*78acc472SPeter Tyser 			*--tmp = *--s;
511*78acc472SPeter Tyser 		}
512*78acc472SPeter Tyser 
513*78acc472SPeter Tyser 	return dest;
514*78acc472SPeter Tyser }
515*78acc472SPeter Tyser #endif
516*78acc472SPeter Tyser 
517*78acc472SPeter Tyser #ifndef __HAVE_ARCH_MEMCMP
518*78acc472SPeter Tyser /**
519*78acc472SPeter Tyser  * memcmp - Compare two areas of memory
520*78acc472SPeter Tyser  * @cs: One area of memory
521*78acc472SPeter Tyser  * @ct: Another area of memory
522*78acc472SPeter Tyser  * @count: The size of the area.
523*78acc472SPeter Tyser  */
524*78acc472SPeter Tyser int memcmp(const void * cs,const void * ct,size_t count)
525*78acc472SPeter Tyser {
526*78acc472SPeter Tyser 	const unsigned char *su1, *su2;
527*78acc472SPeter Tyser 	int res = 0;
528*78acc472SPeter Tyser 
529*78acc472SPeter Tyser 	for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
530*78acc472SPeter Tyser 		if ((res = *su1 - *su2) != 0)
531*78acc472SPeter Tyser 			break;
532*78acc472SPeter Tyser 	return res;
533*78acc472SPeter Tyser }
534*78acc472SPeter Tyser #endif
535*78acc472SPeter Tyser 
536*78acc472SPeter Tyser #ifndef __HAVE_ARCH_MEMSCAN
537*78acc472SPeter Tyser /**
538*78acc472SPeter Tyser  * memscan - Find a character in an area of memory.
539*78acc472SPeter Tyser  * @addr: The memory area
540*78acc472SPeter Tyser  * @c: The byte to search for
541*78acc472SPeter Tyser  * @size: The size of the area.
542*78acc472SPeter Tyser  *
543*78acc472SPeter Tyser  * returns the address of the first occurrence of @c, or 1 byte past
544*78acc472SPeter Tyser  * the area if @c is not found
545*78acc472SPeter Tyser  */
546*78acc472SPeter Tyser void * memscan(void * addr, int c, size_t size)
547*78acc472SPeter Tyser {
548*78acc472SPeter Tyser 	unsigned char * p = (unsigned char *) addr;
549*78acc472SPeter Tyser 
550*78acc472SPeter Tyser 	while (size) {
551*78acc472SPeter Tyser 		if (*p == c)
552*78acc472SPeter Tyser 			return (void *) p;
553*78acc472SPeter Tyser 		p++;
554*78acc472SPeter Tyser 		size--;
555*78acc472SPeter Tyser 	}
556*78acc472SPeter Tyser 	return (void *) p;
557*78acc472SPeter Tyser }
558*78acc472SPeter Tyser #endif
559*78acc472SPeter Tyser 
560*78acc472SPeter Tyser #ifndef __HAVE_ARCH_STRSTR
561*78acc472SPeter Tyser /**
562*78acc472SPeter Tyser  * strstr - Find the first substring in a %NUL terminated string
563*78acc472SPeter Tyser  * @s1: The string to be searched
564*78acc472SPeter Tyser  * @s2: The string to search for
565*78acc472SPeter Tyser  */
566*78acc472SPeter Tyser char * strstr(const char * s1,const char * s2)
567*78acc472SPeter Tyser {
568*78acc472SPeter Tyser 	int l1, l2;
569*78acc472SPeter Tyser 
570*78acc472SPeter Tyser 	l2 = strlen(s2);
571*78acc472SPeter Tyser 	if (!l2)
572*78acc472SPeter Tyser 		return (char *) s1;
573*78acc472SPeter Tyser 	l1 = strlen(s1);
574*78acc472SPeter Tyser 	while (l1 >= l2) {
575*78acc472SPeter Tyser 		l1--;
576*78acc472SPeter Tyser 		if (!memcmp(s1,s2,l2))
577*78acc472SPeter Tyser 			return (char *) s1;
578*78acc472SPeter Tyser 		s1++;
579*78acc472SPeter Tyser 	}
580*78acc472SPeter Tyser 	return NULL;
581*78acc472SPeter Tyser }
582*78acc472SPeter Tyser #endif
583*78acc472SPeter Tyser 
584*78acc472SPeter Tyser #ifndef __HAVE_ARCH_MEMCHR
585*78acc472SPeter Tyser /**
586*78acc472SPeter Tyser  * memchr - Find a character in an area of memory.
587*78acc472SPeter Tyser  * @s: The memory area
588*78acc472SPeter Tyser  * @c: The byte to search for
589*78acc472SPeter Tyser  * @n: The size of the area.
590*78acc472SPeter Tyser  *
591*78acc472SPeter Tyser  * returns the address of the first occurrence of @c, or %NULL
592*78acc472SPeter Tyser  * if @c is not found
593*78acc472SPeter Tyser  */
594*78acc472SPeter Tyser void *memchr(const void *s, int c, size_t n)
595*78acc472SPeter Tyser {
596*78acc472SPeter Tyser 	const unsigned char *p = s;
597*78acc472SPeter Tyser 	while (n-- != 0) {
598*78acc472SPeter Tyser 		if ((unsigned char)c == *p++) {
599*78acc472SPeter Tyser 			return (void *)(p-1);
600*78acc472SPeter Tyser 		}
601*78acc472SPeter Tyser 	}
602*78acc472SPeter Tyser 	return NULL;
603*78acc472SPeter Tyser }
604*78acc472SPeter Tyser 
605*78acc472SPeter Tyser #endif
606