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