linux/lib/string.c
<<
>>
Prefs
   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 * * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>,
  18 *                    Matthew Hawkins <matt@mh.dropbear.id.au>
  19 * -  Kissed strtok() goodbye
  20 */
  21
  22#include <linux/types.h>
  23#include <linux/string.h>
  24#include <linux/ctype.h>
  25#include <linux/kernel.h>
  26#include <linux/export.h>
  27#include <linux/bug.h>
  28#include <linux/errno.h>
  29
  30#ifndef __HAVE_ARCH_STRNICMP
  31/**
  32 * strnicmp - Case insensitive, length-limited string comparison
  33 * @s1: One string
  34 * @s2: The other string
  35 * @len: the maximum number of characters to compare
  36 */
  37int strnicmp(const char *s1, const char *s2, size_t len)
  38{
  39        /* Yes, Virginia, it had better be unsigned */
  40        unsigned char c1, c2;
  41
  42        if (!len)
  43                return 0;
  44
  45        do {
  46                c1 = *s1++;
  47                c2 = *s2++;
  48                if (!c1 || !c2)
  49                        break;
  50                if (c1 == c2)
  51                        continue;
  52                c1 = tolower(c1);
  53                c2 = tolower(c2);
  54                if (c1 != c2)
  55                        break;
  56        } while (--len);
  57        return (int)c1 - (int)c2;
  58}
  59EXPORT_SYMBOL(strnicmp);
  60#endif
  61
  62#ifndef __HAVE_ARCH_STRCASECMP
  63int strcasecmp(const char *s1, const char *s2)
  64{
  65        int c1, c2;
  66
  67        do {
  68                c1 = tolower(*s1++);
  69                c2 = tolower(*s2++);
  70        } while (c1 == c2 && c1 != 0);
  71        return c1 - c2;
  72}
  73EXPORT_SYMBOL(strcasecmp);
  74#endif
  75
  76#ifndef __HAVE_ARCH_STRNCASECMP
  77int strncasecmp(const char *s1, const char *s2, size_t n)
  78{
  79        int c1, c2;
  80
  81        do {
  82                c1 = tolower(*s1++);
  83                c2 = tolower(*s2++);
  84        } while ((--n > 0) && c1 == c2 && c1 != 0);
  85        return c1 - c2;
  86}
  87EXPORT_SYMBOL(strncasecmp);
  88#endif
  89
  90#ifndef __HAVE_ARCH_STRCPY
  91/**
  92 * strcpy - Copy a %NUL terminated string
  93 * @dest: Where to copy the string to
  94 * @src: Where to copy the string from
  95 */
  96#undef strcpy
  97char *strcpy(char *dest, const char *src)
  98{
  99        char *tmp = dest;
 100
 101        while ((*dest++ = *src++) != '\0')
 102                /* nothing */;
 103        return tmp;
 104}
 105EXPORT_SYMBOL(strcpy);
 106#endif
 107
 108#ifndef __HAVE_ARCH_STRNCPY
 109/**
 110 * strncpy - Copy a length-limited, %NUL-terminated string
 111 * @dest: Where to copy the string to
 112 * @src: Where to copy the string from
 113 * @count: The maximum number of bytes to copy
 114 *
 115 * The result is not %NUL-terminated if the source exceeds
 116 * @count bytes.
 117 *
 118 * In the case where the length of @src is less than  that  of
 119 * count, the remainder of @dest will be padded with %NUL.
 120 *
 121 */
 122char *strncpy(char *dest, const char *src, size_t count)
 123{
 124        char *tmp = dest;
 125
 126        while (count) {
 127                if ((*tmp = *src) != 0)
 128                        src++;
 129                tmp++;
 130                count--;
 131        }
 132        return dest;
 133}
 134EXPORT_SYMBOL(strncpy);
 135#endif
 136
 137#ifndef __HAVE_ARCH_STRLCPY
 138/**
 139 * strlcpy - Copy a %NUL terminated string into a sized buffer
 140 * @dest: Where to copy the string to
 141 * @src: Where to copy the string from
 142 * @size: size of destination buffer
 143 *
 144 * Compatible with *BSD: the result is always a valid
 145 * NUL-terminated string that fits in the buffer (unless,
 146 * of course, the buffer size is zero). It does not pad
 147 * out the result like strncpy() does.
 148 */
 149size_t strlcpy(char *dest, const char *src, size_t size)
 150{
 151        size_t ret = strlen(src);
 152
 153        if (size) {
 154                size_t len = (ret >= size) ? size - 1 : ret;
 155                memcpy(dest, src, len);
 156                dest[len] = '\0';
 157        }
 158        return ret;
 159}
 160EXPORT_SYMBOL(strlcpy);
 161#endif
 162
 163#ifndef __HAVE_ARCH_STRCAT
 164/**
 165 * strcat - Append one %NUL-terminated string to another
 166 * @dest: The string to be appended to
 167 * @src: The string to append to it
 168 */
 169#undef strcat
 170char *strcat(char *dest, const char *src)
 171{
 172        char *tmp = dest;
 173
 174        while (*dest)
 175                dest++;
 176        while ((*dest++ = *src++) != '\0')
 177                ;
 178        return tmp;
 179}
 180EXPORT_SYMBOL(strcat);
 181#endif
 182
 183#ifndef __HAVE_ARCH_STRNCAT
 184/**
 185 * strncat - Append a length-limited, %NUL-terminated string to another
 186 * @dest: The string to be appended to
 187 * @src: The string to append to it
 188 * @count: The maximum numbers of bytes to copy
 189 *
 190 * Note that in contrast to strncpy(), strncat() ensures the result is
 191 * terminated.
 192 */
 193char *strncat(char *dest, const char *src, size_t count)
 194{
 195        char *tmp = dest;
 196
 197        if (count) {
 198                while (*dest)
 199                        dest++;
 200                while ((*dest++ = *src++) != 0) {
 201                        if (--count == 0) {
 202                                *dest = '\0';
 203                                break;
 204                        }
 205                }
 206        }
 207        return tmp;
 208}
 209EXPORT_SYMBOL(strncat);
 210#endif
 211
 212#ifndef __HAVE_ARCH_STRLCAT
 213/**
 214 * strlcat - Append a length-limited, %NUL-terminated string to another
 215 * @dest: The string to be appended to
 216 * @src: The string to append to it
 217 * @count: The size of the destination buffer.
 218 */
 219size_t strlcat(char *dest, const char *src, size_t count)
 220{
 221        size_t dsize = strlen(dest);
 222        size_t len = strlen(src);
 223        size_t res = dsize + len;
 224
 225        /* This would be a bug */
 226        BUG_ON(dsize >= count);
 227
 228        dest += dsize;
 229        count -= dsize;
 230        if (len >= count)
 231                len = count-1;
 232        memcpy(dest, src, len);
 233        dest[len] = 0;
 234        return res;
 235}
 236EXPORT_SYMBOL(strlcat);
 237#endif
 238
 239#ifndef __HAVE_ARCH_STRCMP
 240/**
 241 * strcmp - Compare two strings
 242 * @cs: One string
 243 * @ct: Another string
 244 */
 245#undef strcmp
 246int strcmp(const char *cs, const char *ct)
 247{
 248        unsigned char c1, c2;
 249
 250        while (1) {
 251                c1 = *cs++;
 252                c2 = *ct++;
 253                if (c1 != c2)
 254                        return c1 < c2 ? -1 : 1;
 255                if (!c1)
 256                        break;
 257        }
 258        return 0;
 259}
 260EXPORT_SYMBOL(strcmp);
 261#endif
 262
 263#ifndef __HAVE_ARCH_STRNCMP
 264/**
 265 * strncmp - Compare two length-limited strings
 266 * @cs: One string
 267 * @ct: Another string
 268 * @count: The maximum number of bytes to compare
 269 */
 270int strncmp(const char *cs, const char *ct, size_t count)
 271{
 272        unsigned char c1, c2;
 273
 274        while (count) {
 275                c1 = *cs++;
 276                c2 = *ct++;
 277                if (c1 != c2)
 278                        return c1 < c2 ? -1 : 1;
 279                if (!c1)
 280                        break;
 281                count--;
 282        }
 283        return 0;
 284}
 285EXPORT_SYMBOL(strncmp);
 286#endif
 287
 288#ifndef __HAVE_ARCH_STRCHR
 289/**
 290 * strchr - Find the first occurrence of a character in a string
 291 * @s: The string to be searched
 292 * @c: The character to search for
 293 */
 294char *strchr(const char *s, int c)
 295{
 296        for (; *s != (char)c; ++s)
 297                if (*s == '\0')
 298                        return NULL;
 299        return (char *)s;
 300}
 301EXPORT_SYMBOL(strchr);
 302#endif
 303
 304#ifndef __HAVE_ARCH_STRCHRNUL
 305/**
 306 * strchrnul - Find and return a character in a string, or end of string
 307 * @s: The string to be searched
 308 * @c: The character to search for
 309 *
 310 * Returns pointer to first occurrence of 'c' in s. If c is not found, then
 311 * return a pointer to the null byte at the end of s.
 312 */
 313char *strchrnul(const char *s, int c)
 314{
 315        while (*s && *s != (char)c)
 316                s++;
 317        return (char *)s;
 318}
 319EXPORT_SYMBOL(strchrnul);
 320#endif
 321
 322#ifndef __HAVE_ARCH_STRRCHR
 323/**
 324 * strrchr - Find the last occurrence of a character in a string
 325 * @s: The string to be searched
 326 * @c: The character to search for
 327 */
 328char *strrchr(const char *s, int c)
 329{
 330       const char *p = s + strlen(s);
 331       do {
 332           if (*p == (char)c)
 333               return (char *)p;
 334       } while (--p >= s);
 335       return NULL;
 336}
 337EXPORT_SYMBOL(strrchr);
 338#endif
 339
 340#ifndef __HAVE_ARCH_STRNCHR
 341/**
 342 * strnchr - Find a character in a length limited string
 343 * @s: The string to be searched
 344 * @count: The number of characters to be searched
 345 * @c: The character to search for
 346 */
 347char *strnchr(const char *s, size_t count, int c)
 348{
 349        for (; count-- && *s != '\0'; ++s)
 350                if (*s == (char)c)
 351                        return (char *)s;
 352        return NULL;
 353}
 354EXPORT_SYMBOL(strnchr);
 355#endif
 356
 357/**
 358 * skip_spaces - Removes leading whitespace from @str.
 359 * @str: The string to be stripped.
 360 *
 361 * Returns a pointer to the first non-whitespace character in @str.
 362 */
 363char *skip_spaces(const char *str)
 364{
 365        while (isspace(*str))
 366                ++str;
 367        return (char *)str;
 368}
 369EXPORT_SYMBOL(skip_spaces);
 370
 371/**
 372 * strim - Removes leading and trailing whitespace from @s.
 373 * @s: The string to be stripped.
 374 *
 375 * Note that the first trailing whitespace is replaced with a %NUL-terminator
 376 * in the given string @s. Returns a pointer to the first non-whitespace
 377 * character in @s.
 378 */
 379char *strim(char *s)
 380{
 381        size_t size;
 382        char *end;
 383
 384        size = strlen(s);
 385        if (!size)
 386                return s;
 387
 388        end = s + size - 1;
 389        while (end >= s && isspace(*end))
 390                end--;
 391        *(end + 1) = '\0';
 392
 393        return skip_spaces(s);
 394}
 395EXPORT_SYMBOL(strim);
 396
 397#ifndef __HAVE_ARCH_STRLEN
 398/**
 399 * strlen - Find the length of a string
 400 * @s: The string to be sized
 401 */
 402size_t strlen(const char *s)
 403{
 404        const char *sc;
 405
 406        for (sc = s; *sc != '\0'; ++sc)
 407                /* nothing */;
 408        return sc - s;
 409}
 410EXPORT_SYMBOL(strlen);
 411#endif
 412
 413#ifndef __HAVE_ARCH_STRNLEN
 414/**
 415 * strnlen - Find the length of a length-limited string
 416 * @s: The string to be sized
 417 * @count: The maximum number of bytes to search
 418 */
 419size_t strnlen(const char *s, size_t count)
 420{
 421        const char *sc;
 422
 423        for (sc = s; count-- && *sc != '\0'; ++sc)
 424                /* nothing */;
 425        return sc - s;
 426}
 427EXPORT_SYMBOL(strnlen);
 428#endif
 429
 430#ifndef __HAVE_ARCH_STRSPN
 431/**
 432 * strspn - Calculate the length of the initial substring of @s which only contain letters in @accept
 433 * @s: The string to be searched
 434 * @accept: The string to search for
 435 */
 436size_t strspn(const char *s, const char *accept)
 437{
 438        const char *p;
 439        const char *a;
 440        size_t count = 0;
 441
 442        for (p = s; *p != '\0'; ++p) {
 443                for (a = accept; *a != '\0'; ++a) {
 444                        if (*p == *a)
 445                                break;
 446                }
 447                if (*a == '\0')
 448                        return count;
 449                ++count;
 450        }
 451        return count;
 452}
 453
 454EXPORT_SYMBOL(strspn);
 455#endif
 456
 457#ifndef __HAVE_ARCH_STRCSPN
 458/**
 459 * strcspn - Calculate the length of the initial substring of @s which does not contain letters in @reject
 460 * @s: The string to be searched
 461 * @reject: The string to avoid
 462 */
 463size_t strcspn(const char *s, const char *reject)
 464{
 465        const char *p;
 466        const char *r;
 467        size_t count = 0;
 468
 469        for (p = s; *p != '\0'; ++p) {
 470                for (r = reject; *r != '\0'; ++r) {
 471                        if (*p == *r)
 472                                return count;
 473                }
 474                ++count;
 475        }
 476        return count;
 477}
 478EXPORT_SYMBOL(strcspn);
 479#endif
 480
 481#ifndef __HAVE_ARCH_STRPBRK
 482/**
 483 * strpbrk - Find the first occurrence of a set of characters
 484 * @cs: The string to be searched
 485 * @ct: The characters to search for
 486 */
 487char *strpbrk(const char *cs, const char *ct)
 488{
 489        const char *sc1, *sc2;
 490
 491        for (sc1 = cs; *sc1 != '\0'; ++sc1) {
 492                for (sc2 = ct; *sc2 != '\0'; ++sc2) {
 493                        if (*sc1 == *sc2)
 494                                return (char *)sc1;
 495                }
 496        }
 497        return NULL;
 498}
 499EXPORT_SYMBOL(strpbrk);
 500#endif
 501
 502#ifndef __HAVE_ARCH_STRSEP
 503/**
 504 * strsep - Split a string into tokens
 505 * @s: The string to be searched
 506 * @ct: The characters to search for
 507 *
 508 * strsep() updates @s to point after the token, ready for the next call.
 509 *
 510 * It returns empty tokens, too, behaving exactly like the libc function
 511 * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
 512 * Same semantics, slimmer shape. ;)
 513 */
 514char *strsep(char **s, const char *ct)
 515{
 516        char *sbegin = *s;
 517        char *end;
 518
 519        if (sbegin == NULL)
 520                return NULL;
 521
 522        end = strpbrk(sbegin, ct);
 523        if (end)
 524                *end++ = '\0';
 525        *s = end;
 526        return sbegin;
 527}
 528EXPORT_SYMBOL(strsep);
 529#endif
 530
 531/**
 532 * sysfs_streq - return true if strings are equal, modulo trailing newline
 533 * @s1: one string
 534 * @s2: another string
 535 *
 536 * This routine returns true iff two strings are equal, treating both
 537 * NUL and newline-then-NUL as equivalent string terminations.  It's
 538 * geared for use with sysfs input strings, which generally terminate
 539 * with newlines but are compared against values without newlines.
 540 */
 541bool sysfs_streq(const char *s1, const char *s2)
 542{
 543        while (*s1 && *s1 == *s2) {
 544                s1++;
 545                s2++;
 546        }
 547
 548        if (*s1 == *s2)
 549                return true;
 550        if (!*s1 && *s2 == '\n' && !s2[1])
 551                return true;
 552        if (*s1 == '\n' && !s1[1] && !*s2)
 553                return true;
 554        return false;
 555}
 556EXPORT_SYMBOL(sysfs_streq);
 557
 558/**
 559 * match_string - matches given string in an array
 560 * @array:      array of strings
 561 * @n:          number of strings in the array or -1 for NULL terminated arrays
 562 * @string:     string to match with
 563 *
 564 * Return:
 565 * index of a @string in the @array if matches, or %-EINVAL otherwise.
 566 */
 567int match_string(const char * const *array, size_t n, const char *string)
 568{
 569        int index;
 570        const char *item;
 571
 572        for (index = 0; index < n; index++) {
 573                item = array[index];
 574                if (!item)
 575                        break;
 576                if (!strcmp(item, string))
 577                        return index;
 578        }
 579
 580        return -EINVAL;
 581}
 582EXPORT_SYMBOL(match_string);
 583
 584#ifndef __HAVE_ARCH_MEMSET
 585/**
 586 * memset - Fill a region of memory with the given value
 587 * @s: Pointer to the start of the area.
 588 * @c: The byte to fill the area with
 589 * @count: The size of the area.
 590 *
 591 * Do not use memset() to access IO space, use memset_io() instead.
 592 */
 593void *memset(void *s, int c, size_t count)
 594{
 595        char *xs = s;
 596
 597        while (count--)
 598                *xs++ = c;
 599        return s;
 600}
 601EXPORT_SYMBOL(memset);
 602#endif
 603
 604/**
 605 * memzero_explicit - Fill a region of memory (e.g. sensitive
 606 *                    keying data) with 0s.
 607 * @s: Pointer to the start of the area.
 608 * @count: The size of the area.
 609 *
 610 * Note: usually using memset() is just fine (!), but in cases
 611 * where clearing out _local_ data at the end of a scope is
 612 * necessary, memzero_explicit() should be used instead in
 613 * order to prevent the compiler from optimising away zeroing.
 614 *
 615 * memzero_explicit() doesn't need an arch-specific version as
 616 * it just invokes the one of memset() implicitly.
 617 */
 618void memzero_explicit(void *s, size_t count)
 619{
 620        memset(s, 0, count);
 621        barrier_data(s);
 622}
 623EXPORT_SYMBOL(memzero_explicit);
 624
 625#ifndef __HAVE_ARCH_MEMCPY
 626/**
 627 * memcpy - Copy one area of memory to another
 628 * @dest: Where to copy to
 629 * @src: Where to copy from
 630 * @count: The size of the area.
 631 *
 632 * You should not use this function to access IO space, use memcpy_toio()
 633 * or memcpy_fromio() instead.
 634 */
 635void *memcpy(void *dest, const void *src, size_t count)
 636{
 637        char *tmp = dest;
 638        const char *s = src;
 639
 640        while (count--)
 641                *tmp++ = *s++;
 642        return dest;
 643}
 644EXPORT_SYMBOL(memcpy);
 645#endif
 646
 647#ifndef __HAVE_ARCH_MEMMOVE
 648/**
 649 * memmove - Copy one area of memory to another
 650 * @dest: Where to copy to
 651 * @src: Where to copy from
 652 * @count: The size of the area.
 653 *
 654 * Unlike memcpy(), memmove() copes with overlapping areas.
 655 */
 656void *memmove(void *dest, const void *src, size_t count)
 657{
 658        char *tmp;
 659        const char *s;
 660
 661        if (dest <= src) {
 662                tmp = dest;
 663                s = src;
 664                while (count--)
 665                        *tmp++ = *s++;
 666        } else {
 667                tmp = dest;
 668                tmp += count;
 669                s = src;
 670                s += count;
 671                while (count--)
 672                        *--tmp = *--s;
 673        }
 674        return dest;
 675}
 676EXPORT_SYMBOL(memmove);
 677#endif
 678
 679#ifndef __HAVE_ARCH_MEMCMP
 680/**
 681 * memcmp - Compare two areas of memory
 682 * @cs: One area of memory
 683 * @ct: Another area of memory
 684 * @count: The size of the area.
 685 */
 686#undef memcmp
 687int memcmp(const void *cs, const void *ct, size_t count)
 688{
 689        const unsigned char *su1, *su2;
 690        int res = 0;
 691
 692        for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
 693                if ((res = *su1 - *su2) != 0)
 694                        break;
 695        return res;
 696}
 697EXPORT_SYMBOL(memcmp);
 698#endif
 699
 700#ifndef __HAVE_ARCH_MEMSCAN
 701/**
 702 * memscan - Find a character in an area of memory.
 703 * @addr: The memory area
 704 * @c: The byte to search for
 705 * @size: The size of the area.
 706 *
 707 * returns the address of the first occurrence of @c, or 1 byte past
 708 * the area if @c is not found
 709 */
 710void *memscan(void *addr, int c, size_t size)
 711{
 712        unsigned char *p = addr;
 713
 714        while (size) {
 715                if (*p == c)
 716                        return (void *)p;
 717                p++;
 718                size--;
 719        }
 720        return (void *)p;
 721}
 722EXPORT_SYMBOL(memscan);
 723#endif
 724
 725#ifndef __HAVE_ARCH_STRSTR
 726/**
 727 * strstr - Find the first substring in a %NUL terminated string
 728 * @s1: The string to be searched
 729 * @s2: The string to search for
 730 */
 731char *strstr(const char *s1, const char *s2)
 732{
 733        size_t l1, l2;
 734
 735        l2 = strlen(s2);
 736        if (!l2)
 737                return (char *)s1;
 738        l1 = strlen(s1);
 739        while (l1 >= l2) {
 740                l1--;
 741                if (!memcmp(s1, s2, l2))
 742                        return (char *)s1;
 743                s1++;
 744        }
 745        return NULL;
 746}
 747EXPORT_SYMBOL(strstr);
 748#endif
 749
 750#ifndef __HAVE_ARCH_STRNSTR
 751/**
 752 * strnstr - Find the first substring in a length-limited string
 753 * @s1: The string to be searched
 754 * @s2: The string to search for
 755 * @len: the maximum number of characters to search
 756 */
 757char *strnstr(const char *s1, const char *s2, size_t len)
 758{
 759        size_t l2;
 760
 761        l2 = strlen(s2);
 762        if (!l2)
 763                return (char *)s1;
 764        while (len >= l2) {
 765                len--;
 766                if (!memcmp(s1, s2, l2))
 767                        return (char *)s1;
 768                s1++;
 769        }
 770        return NULL;
 771}
 772EXPORT_SYMBOL(strnstr);
 773#endif
 774
 775#ifndef __HAVE_ARCH_MEMCHR
 776/**
 777 * memchr - Find a character in an area of memory.
 778 * @s: The memory area
 779 * @c: The byte to search for
 780 * @n: The size of the area.
 781 *
 782 * returns the address of the first occurrence of @c, or %NULL
 783 * if @c is not found
 784 */
 785void *memchr(const void *s, int c, size_t n)
 786{
 787        const unsigned char *p = s;
 788        while (n-- != 0) {
 789                if ((unsigned char)c == *p++) {
 790                        return (void *)(p - 1);
 791                }
 792        }
 793        return NULL;
 794}
 795EXPORT_SYMBOL(memchr);
 796#endif
 797
 798static void *check_bytes8(const u8 *start, u8 value, unsigned int bytes)
 799{
 800        while (bytes) {
 801                if (*start != value)
 802                        return (void *)start;
 803                start++;
 804                bytes--;
 805        }
 806        return NULL;
 807}
 808
 809/**
 810 * memchr_inv - Find an unmatching character in an area of memory.
 811 * @start: The memory area
 812 * @c: Find a character other than c
 813 * @bytes: The size of the area.
 814 *
 815 * returns the address of the first character other than @c, or %NULL
 816 * if the whole buffer contains just @c.
 817 */
 818void *memchr_inv(const void *start, int c, size_t bytes)
 819{
 820        u8 value = c;
 821        u64 value64;
 822        unsigned int words, prefix;
 823
 824        if (bytes <= 16)
 825                return check_bytes8(start, value, bytes);
 826
 827        value64 = value;
 828#if defined(ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64
 829        value64 *= 0x0101010101010101;
 830#elif defined(ARCH_HAS_FAST_MULTIPLIER)
 831        value64 *= 0x01010101;
 832        value64 |= value64 << 32;
 833#else
 834        value64 |= value64 << 8;
 835        value64 |= value64 << 16;
 836        value64 |= value64 << 32;
 837#endif
 838
 839        prefix = (unsigned long)start % 8;
 840        if (prefix) {
 841                u8 *r;
 842
 843                prefix = 8 - prefix;
 844                r = check_bytes8(start, value, prefix);
 845                if (r)
 846                        return r;
 847                start += prefix;
 848                bytes -= prefix;
 849        }
 850
 851        words = bytes / 8;
 852
 853        while (words) {
 854                if (*(u64 *)start != value64)
 855                        return check_bytes8(start, value, 8);
 856                start += 8;
 857                words--;
 858        }
 859
 860        return check_bytes8(start, value, bytes % 8);
 861}
 862EXPORT_SYMBOL(memchr_inv);
 863