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