LCOV - code coverage report
Current view: top level - lib - string.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 184 300 61.3 %
Date: 2022-04-01 14:35:51 Functions: 24 37 64.9 %
Branches: 124 264 47.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : /*
       3                 :            :  *  linux/lib/string.c
       4                 :            :  *
       5                 :            :  *  Copyright (C) 1991, 1992  Linus Torvalds
       6                 :            :  */
       7                 :            : 
       8                 :            : /*
       9                 :            :  * stupid library routines.. The optimized versions should generally be found
      10                 :            :  * as inline code in <asm-xx/string.h>
      11                 :            :  *
      12                 :            :  * These are buggy as well..
      13                 :            :  *
      14                 :            :  * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
      15                 :            :  * -  Added strsep() which will replace strtok() soon (because strsep() is
      16                 :            :  *    reentrant and should be faster). Use only strsep() in new code, please.
      17                 :            :  *
      18                 :            :  * * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>,
      19                 :            :  *                    Matthew Hawkins <matt@mh.dropbear.id.au>
      20                 :            :  * -  Kissed strtok() goodbye
      21                 :            :  */
      22                 :            : 
      23                 :            : #include <linux/types.h>
      24                 :            : #include <linux/string.h>
      25                 :            : #include <linux/ctype.h>
      26                 :            : #include <linux/kernel.h>
      27                 :            : #include <linux/export.h>
      28                 :            : #include <linux/bug.h>
      29                 :            : #include <linux/errno.h>
      30                 :            : #include <linux/slab.h>
      31                 :            : 
      32                 :            : #include <asm/byteorder.h>
      33                 :            : #include <asm/word-at-a-time.h>
      34                 :            : #include <asm/page.h>
      35                 :            : 
      36                 :            : #ifndef __HAVE_ARCH_STRNCASECMP
      37                 :            : /**
      38                 :            :  * strncasecmp - Case insensitive, length-limited string comparison
      39                 :            :  * @s1: One string
      40                 :            :  * @s2: The other string
      41                 :            :  * @len: the maximum number of characters to compare
      42                 :            :  */
      43                 :         84 : int strncasecmp(const char *s1, const char *s2, size_t len)
      44                 :            : {
      45                 :            :         /* Yes, Virginia, it had better be unsigned */
      46                 :         84 :         unsigned char c1, c2;
      47                 :            : 
      48         [ +  - ]:         84 :         if (!len)
      49                 :            :                 return 0;
      50                 :            : 
      51                 :         84 :         do {
      52                 :         84 :                 c1 = *s1++;
      53                 :         84 :                 c2 = *s2++;
      54         [ +  - ]:         84 :                 if (!c1 || !c2)
      55                 :            :                         break;
      56         [ -  + ]:         84 :                 if (c1 == c2)
      57                 :          0 :                         continue;
      58         [ -  + ]:         84 :                 c1 = tolower(c1);
      59         [ -  + ]:         84 :                 c2 = tolower(c2);
      60         [ -  + ]:         84 :                 if (c1 != c2)
      61                 :            :                         break;
      62         [ #  # ]:          0 :         } while (--len);
      63                 :         84 :         return (int)c1 - (int)c2;
      64                 :            : }
      65                 :            : EXPORT_SYMBOL(strncasecmp);
      66                 :            : #endif
      67                 :            : 
      68                 :            : #ifndef __HAVE_ARCH_STRCASECMP
      69                 :         63 : int strcasecmp(const char *s1, const char *s2)
      70                 :            : {
      71                 :         63 :         int c1, c2;
      72                 :            : 
      73                 :         63 :         do {
      74         [ +  - ]:         63 :                 c1 = tolower(*s1++);
      75         [ +  - ]:         63 :                 c2 = tolower(*s2++);
      76         [ -  + ]:         63 :         } while (c1 == c2 && c1 != 0);
      77                 :         63 :         return c1 - c2;
      78                 :            : }
      79                 :            : EXPORT_SYMBOL(strcasecmp);
      80                 :            : #endif
      81                 :            : 
      82                 :            : #ifndef __HAVE_ARCH_STRCPY
      83                 :            : /**
      84                 :            :  * strcpy - Copy a %NUL terminated string
      85                 :            :  * @dest: Where to copy the string to
      86                 :            :  * @src: Where to copy the string from
      87                 :            :  */
      88                 :            : #undef strcpy
      89                 :      62361 : char *strcpy(char *dest, const char *src)
      90                 :            : {
      91                 :      62361 :         char *tmp = dest;
      92                 :            : 
      93                 :      62361 :         while ((*dest++ = *src++) != '\0')
      94         [ +  + ]:     871646 :                 /* nothing */;
      95                 :      62361 :         return tmp;
      96                 :            : }
      97                 :            : EXPORT_SYMBOL(strcpy);
      98                 :            : #endif
      99                 :            : 
     100                 :            : #ifndef __HAVE_ARCH_STRNCPY
     101                 :            : /**
     102                 :            :  * strncpy - Copy a length-limited, C-string
     103                 :            :  * @dest: Where to copy the string to
     104                 :            :  * @src: Where to copy the string from
     105                 :            :  * @count: The maximum number of bytes to copy
     106                 :            :  *
     107                 :            :  * The result is not %NUL-terminated if the source exceeds
     108                 :            :  * @count bytes.
     109                 :            :  *
     110                 :            :  * In the case where the length of @src is less than  that  of
     111                 :            :  * count, the remainder of @dest will be padded with %NUL.
     112                 :            :  *
     113                 :            :  */
     114                 :      17805 : char *strncpy(char *dest, const char *src, size_t count)
     115                 :            : {
     116                 :      17805 :         char *tmp = dest;
     117                 :            : 
     118         [ +  + ]:     703242 :         while (count) {
     119         [ +  + ]:     685437 :                 if ((*tmp = *src) != 0)
     120                 :     127453 :                         src++;
     121                 :     685437 :                 tmp++;
     122                 :     685437 :                 count--;
     123                 :            :         }
     124                 :      17805 :         return dest;
     125                 :            : }
     126                 :            : EXPORT_SYMBOL(strncpy);
     127                 :            : #endif
     128                 :            : 
     129                 :            : #ifndef __HAVE_ARCH_STRLCPY
     130                 :            : /**
     131                 :            :  * strlcpy - Copy a C-string into a sized buffer
     132                 :            :  * @dest: Where to copy the string to
     133                 :            :  * @src: Where to copy the string from
     134                 :            :  * @size: size of destination buffer
     135                 :            :  *
     136                 :            :  * Compatible with ``*BSD``: the result is always a valid
     137                 :            :  * NUL-terminated string that fits in the buffer (unless,
     138                 :            :  * of course, the buffer size is zero). It does not pad
     139                 :            :  * out the result like strncpy() does.
     140                 :            :  */
     141                 :     162029 : size_t strlcpy(char *dest, const char *src, size_t size)
     142                 :            : {
     143                 :     162029 :         size_t ret = strlen(src);
     144                 :            : 
     145                 :     162029 :         if (size) {
     146         [ +  + ]:     162029 :                 size_t len = (ret >= size) ? size - 1 : ret;
     147                 :     162029 :                 memcpy(dest, src, len);
     148                 :     162029 :                 dest[len] = '\0';
     149                 :            :         }
     150                 :     162029 :         return ret;
     151                 :            : }
     152                 :            : EXPORT_SYMBOL(strlcpy);
     153                 :            : #endif
     154                 :            : 
     155                 :            : #ifndef __HAVE_ARCH_STRSCPY
     156                 :            : /**
     157                 :            :  * strscpy - Copy a C-string into a sized buffer
     158                 :            :  * @dest: Where to copy the string to
     159                 :            :  * @src: Where to copy the string from
     160                 :            :  * @count: Size of destination buffer
     161                 :            :  *
     162                 :            :  * Copy the string, or as much of it as fits, into the dest buffer.  The
     163                 :            :  * behavior is undefined if the string buffers overlap.  The destination
     164                 :            :  * buffer is always NUL terminated, unless it's zero-sized.
     165                 :            :  *
     166                 :            :  * Preferred to strlcpy() since the API doesn't require reading memory
     167                 :            :  * from the src string beyond the specified "count" bytes, and since
     168                 :            :  * the return value is easier to error-check than strlcpy()'s.
     169                 :            :  * In addition, the implementation is robust to the string changing out
     170                 :            :  * from underneath it, unlike the current strlcpy() implementation.
     171                 :            :  *
     172                 :            :  * Preferred to strncpy() since it always returns a valid string, and
     173                 :            :  * doesn't unnecessarily force the tail of the destination buffer to be
     174                 :            :  * zeroed.  If zeroing is desired please use strscpy_pad().
     175                 :            :  *
     176                 :            :  * Returns:
     177                 :            :  * * The number of characters copied (not including the trailing %NUL)
     178                 :            :  * * -E2BIG if count is 0 or @src was truncated.
     179                 :            :  */
     180                 :      38037 : ssize_t strscpy(char *dest, const char *src, size_t count)
     181                 :            : {
     182                 :      38037 :         const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS;
     183                 :      38037 :         size_t max = count;
     184                 :      38037 :         long res = 0;
     185                 :            : 
     186   [ +  -  -  +  :      38037 :         if (count == 0 || WARN_ON_ONCE(count > INT_MAX))
                   +  - ]
     187                 :            :                 return -E2BIG;
     188                 :            : 
     189                 :            : #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
     190                 :            :         /*
     191                 :            :          * If src is unaligned, don't cross a page boundary,
     192                 :            :          * since we don't know if the next page is mapped.
     193                 :            :          */
     194         [ -  + ]:      38037 :         if ((long)src & (sizeof(long) - 1)) {
     195                 :          0 :                 size_t limit = PAGE_SIZE - ((long)src & (PAGE_SIZE - 1));
     196                 :          0 :                 if (limit < max)
     197                 :            :                         max = limit;
     198                 :            :         }
     199                 :            : #else
     200                 :            :         /* If src or dest is unaligned, don't do word-at-a-time. */
     201                 :            :         if (((long) dest | (long) src) & (sizeof(long) - 1))
     202                 :            :                 max = 0;
     203                 :            : #endif
     204                 :            : 
     205         [ +  - ]:      66423 :         while (max >= sizeof(unsigned long)) {
     206                 :      66423 :                 unsigned long c, data;
     207                 :            : 
     208                 :      66423 :                 c = read_word_at_a_time(src+res);
     209         [ +  + ]:      66423 :                 if (has_zero(c, &data, &constants)) {
     210                 :      38037 :                         data = prep_zero_mask(c, data, &constants);
     211                 :      38037 :                         data = create_zero_mask(data);
     212                 :      38037 :                         *(unsigned long *)(dest+res) = c & zero_bytemask(data);
     213                 :      38037 :                         return res + find_zero(data);
     214                 :            :                 }
     215                 :      28386 :                 *(unsigned long *)(dest+res) = c;
     216                 :      28386 :                 res += sizeof(unsigned long);
     217                 :      28386 :                 count -= sizeof(unsigned long);
     218                 :      28386 :                 max -= sizeof(unsigned long);
     219                 :            :         }
     220                 :            : 
     221         [ #  # ]:          0 :         while (count) {
     222                 :          0 :                 char c;
     223                 :            : 
     224                 :          0 :                 c = src[res];
     225                 :          0 :                 dest[res] = c;
     226         [ #  # ]:          0 :                 if (!c)
     227                 :          0 :                         return res;
     228                 :          0 :                 res++;
     229                 :          0 :                 count--;
     230                 :            :         }
     231                 :            : 
     232                 :            :         /* Hit buffer length without finding a NUL; force NUL-termination. */
     233         [ #  # ]:          0 :         if (res)
     234                 :          0 :                 dest[res-1] = '\0';
     235                 :            : 
     236                 :            :         return -E2BIG;
     237                 :            : }
     238                 :            : EXPORT_SYMBOL(strscpy);
     239                 :            : #endif
     240                 :            : 
     241                 :            : /**
     242                 :            :  * strscpy_pad() - Copy a C-string into a sized buffer
     243                 :            :  * @dest: Where to copy the string to
     244                 :            :  * @src: Where to copy the string from
     245                 :            :  * @count: Size of destination buffer
     246                 :            :  *
     247                 :            :  * Copy the string, or as much of it as fits, into the dest buffer.  The
     248                 :            :  * behavior is undefined if the string buffers overlap.  The destination
     249                 :            :  * buffer is always %NUL terminated, unless it's zero-sized.
     250                 :            :  *
     251                 :            :  * If the source string is shorter than the destination buffer, zeros
     252                 :            :  * the tail of the destination buffer.
     253                 :            :  *
     254                 :            :  * For full explanation of why you may want to consider using the
     255                 :            :  * 'strscpy' functions please see the function docstring for strscpy().
     256                 :            :  *
     257                 :            :  * Returns:
     258                 :            :  * * The number of characters copied (not including the trailing %NUL)
     259                 :            :  * * -E2BIG if count is 0 or @src was truncated.
     260                 :            :  */
     261                 :          0 : ssize_t strscpy_pad(char *dest, const char *src, size_t count)
     262                 :            : {
     263                 :          0 :         ssize_t written;
     264                 :            : 
     265                 :          0 :         written = strscpy(dest, src, count);
     266   [ #  #  #  # ]:          0 :         if (written < 0 || written == count - 1)
     267                 :            :                 return written;
     268                 :            : 
     269                 :          0 :         memset(dest + written + 1, 0, count - written - 1);
     270                 :            : 
     271                 :          0 :         return written;
     272                 :            : }
     273                 :            : EXPORT_SYMBOL(strscpy_pad);
     274                 :            : 
     275                 :            : #ifndef __HAVE_ARCH_STRCAT
     276                 :            : /**
     277                 :            :  * strcat - Append one %NUL-terminated string to another
     278                 :            :  * @dest: The string to be appended to
     279                 :            :  * @src: The string to append to it
     280                 :            :  */
     281                 :            : #undef strcat
     282                 :       2688 : char *strcat(char *dest, const char *src)
     283                 :            : {
     284                 :       2688 :         char *tmp = dest;
     285                 :            : 
     286         [ +  + ]:       8736 :         while (*dest)
     287                 :       6048 :                 dest++;
     288                 :      13440 :         while ((*dest++ = *src++) != '\0')
     289         [ +  + ]:      13440 :                 ;
     290                 :       2688 :         return tmp;
     291                 :            : }
     292                 :            : EXPORT_SYMBOL(strcat);
     293                 :            : #endif
     294                 :            : 
     295                 :            : #ifndef __HAVE_ARCH_STRNCAT
     296                 :            : /**
     297                 :            :  * strncat - Append a length-limited, C-string to another
     298                 :            :  * @dest: The string to be appended to
     299                 :            :  * @src: The string to append to it
     300                 :            :  * @count: The maximum numbers of bytes to copy
     301                 :            :  *
     302                 :            :  * Note that in contrast to strncpy(), strncat() ensures the result is
     303                 :            :  * terminated.
     304                 :            :  */
     305                 :          0 : char *strncat(char *dest, const char *src, size_t count)
     306                 :            : {
     307                 :          0 :         char *tmp = dest;
     308                 :            : 
     309         [ #  # ]:          0 :         if (count) {
     310         [ #  # ]:          0 :                 while (*dest)
     311                 :          0 :                         dest++;
     312         [ #  # ]:          0 :                 while ((*dest++ = *src++) != 0) {
     313         [ #  # ]:          0 :                         if (--count == 0) {
     314                 :          0 :                                 *dest = '\0';
     315                 :          0 :                                 break;
     316                 :            :                         }
     317                 :            :                 }
     318                 :            :         }
     319                 :          0 :         return tmp;
     320                 :            : }
     321                 :            : EXPORT_SYMBOL(strncat);
     322                 :            : #endif
     323                 :            : 
     324                 :            : #ifndef __HAVE_ARCH_STRLCAT
     325                 :            : /**
     326                 :            :  * strlcat - Append a length-limited, C-string to another
     327                 :            :  * @dest: The string to be appended to
     328                 :            :  * @src: The string to append to it
     329                 :            :  * @count: The size of the destination buffer.
     330                 :            :  */
     331                 :        294 : size_t strlcat(char *dest, const char *src, size_t count)
     332                 :            : {
     333                 :        294 :         size_t dsize = strlen(dest);
     334                 :        294 :         size_t len = strlen(src);
     335                 :        294 :         size_t res = dsize + len;
     336                 :            : 
     337                 :            :         /* This would be a bug */
     338                 :          0 :         BUG_ON(dsize >= count);
     339                 :            : 
     340                 :        294 :         dest += dsize;
     341                 :        294 :         count -= dsize;
     342         [ -  + ]:        294 :         if (len >= count)
     343                 :          0 :                 len = count-1;
     344                 :        294 :         memcpy(dest, src, len);
     345                 :        294 :         dest[len] = 0;
     346                 :        294 :         return res;
     347                 :            : }
     348                 :            : EXPORT_SYMBOL(strlcat);
     349                 :            : #endif
     350                 :            : 
     351                 :            : #ifndef __HAVE_ARCH_STRCMP
     352                 :            : /**
     353                 :            :  * strcmp - Compare two strings
     354                 :            :  * @cs: One string
     355                 :            :  * @ct: Another string
     356                 :            :  */
     357                 :            : #undef strcmp
     358                 :   71118840 : int strcmp(const char *cs, const char *ct)
     359                 :            : {
     360                 : 3645240000 :         unsigned char c1, c2;
     361                 :            : 
     362                 : 3645240000 :         while (1) {
     363                 : 3645240000 :                 c1 = *cs++;
     364                 : 3645240000 :                 c2 = *ct++;
     365   [ -  -  +  + ]: 3645240000 :                 if (c1 != c2)
     366         [ +  + ]:   69681210 :                         return c1 < c2 ? -1 : 1;
     367   [ -  -  +  + ]: 3575560000 :                 if (!c1)
     368                 :            :                         break;
     369                 :            :         }
     370                 :            :         return 0;
     371                 :            : }
     372                 :            : EXPORT_SYMBOL(strcmp);
     373                 :            : #endif
     374                 :            : 
     375                 :            : #ifndef __HAVE_ARCH_STRNCMP
     376                 :            : /**
     377                 :            :  * strncmp - Compare two length-limited strings
     378                 :            :  * @cs: One string
     379                 :            :  * @ct: Another string
     380                 :            :  * @count: The maximum number of bytes to compare
     381                 :            :  */
     382                 :   11462892 : int strncmp(const char *cs, const char *ct, size_t count)
     383                 :            : {
     384                 :   11462892 :         unsigned char c1, c2;
     385                 :            : 
     386         [ +  + ]:   37688910 :         while (count) {
     387                 :   37613100 :                 c1 = *cs++;
     388                 :   37613100 :                 c2 = *ct++;
     389         [ +  + ]:   37613100 :                 if (c1 != c2)
     390         [ +  + ]:   11386956 :                         return c1 < c2 ? -1 : 1;
     391         [ +  - ]:   26226060 :                 if (!c1)
     392                 :            :                         break;
     393                 :   26226060 :                 count--;
     394                 :            :         }
     395                 :            :         return 0;
     396                 :            : }
     397                 :            : EXPORT_SYMBOL(strncmp);
     398                 :            : #endif
     399                 :            : 
     400                 :            : #ifndef __HAVE_ARCH_STRCHR
     401                 :            : /**
     402                 :            :  * strchr - Find the first occurrence of a character in a string
     403                 :            :  * @s: The string to be searched
     404                 :            :  * @c: The character to search for
     405                 :            :  *
     406                 :            :  * Note that the %NUL-terminator is considered part of the string, and can
     407                 :            :  * be searched for.
     408                 :            :  */
     409                 :    4086080 : char *strchr(const char *s, int c)
     410                 :            : {
     411         [ +  + ]:   22572270 :         for (; *s != (char)c; ++s)
     412         [ +  + ]:   22074540 :                 if (*s == '\0')
     413                 :            :                         return NULL;
     414                 :            :         return (char *)s;
     415                 :            : }
     416                 :            : EXPORT_SYMBOL(strchr);
     417                 :            : #endif
     418                 :            : 
     419                 :            : #ifndef __HAVE_ARCH_STRCHRNUL
     420                 :            : /**
     421                 :            :  * strchrnul - Find and return a character in a string, or end of string
     422                 :            :  * @s: The string to be searched
     423                 :            :  * @c: The character to search for
     424                 :            :  *
     425                 :            :  * Returns pointer to first occurrence of 'c' in s. If c is not found, then
     426                 :            :  * return a pointer to the null byte at the end of s.
     427                 :            :  */
     428                 :          0 : char *strchrnul(const char *s, int c)
     429                 :            : {
     430   [ #  #  #  # ]:          0 :         while (*s && *s != (char)c)
     431                 :          0 :                 s++;
     432                 :          0 :         return (char *)s;
     433                 :            : }
     434                 :            : EXPORT_SYMBOL(strchrnul);
     435                 :            : #endif
     436                 :            : 
     437                 :            : /**
     438                 :            :  * strnchrnul - Find and return a character in a length limited string,
     439                 :            :  * or end of string
     440                 :            :  * @s: The string to be searched
     441                 :            :  * @count: The number of characters to be searched
     442                 :            :  * @c: The character to search for
     443                 :            :  *
     444                 :            :  * Returns pointer to the first occurrence of 'c' in s. If c is not found,
     445                 :            :  * then return a pointer to the last character of the string.
     446                 :            :  */
     447                 :          0 : char *strnchrnul(const char *s, size_t count, int c)
     448                 :            : {
     449   [ #  #  #  #  :          0 :         while (count-- && *s && *s != (char)c)
                   #  # ]
     450                 :          0 :                 s++;
     451                 :          0 :         return (char *)s;
     452                 :            : }
     453                 :            : 
     454                 :            : #ifndef __HAVE_ARCH_STRRCHR
     455                 :            : /**
     456                 :            :  * strrchr - Find the last occurrence of a character in a string
     457                 :            :  * @s: The string to be searched
     458                 :            :  * @c: The character to search for
     459                 :            :  */
     460                 :     315735 : char *strrchr(const char *s, int c)
     461                 :            : {
     462                 :     315735 :         const char *last = NULL;
     463                 :   11141697 :         do {
     464         [ +  + ]:   11141697 :                 if (*s == (char)c)
     465                 :     814716 :                         last = s;
     466         [ +  + ]:   11141697 :         } while (*s++);
     467                 :     315735 :         return (char *)last;
     468                 :            : }
     469                 :            : EXPORT_SYMBOL(strrchr);
     470                 :            : #endif
     471                 :            : 
     472                 :            : #ifndef __HAVE_ARCH_STRNCHR
     473                 :            : /**
     474                 :            :  * strnchr - Find a character in a length limited string
     475                 :            :  * @s: The string to be searched
     476                 :            :  * @count: The number of characters to be searched
     477                 :            :  * @c: The character to search for
     478                 :            :  *
     479                 :            :  * Note that the %NUL-terminator is considered part of the string, and can
     480                 :            :  * be searched for.
     481                 :            :  */
     482                 :      11571 : char *strnchr(const char *s, size_t count, int c)
     483                 :            : {
     484         [ +  + ]:      48153 :         while (count--) {
     485         [ +  + ]:      36834 :                 if (*s == (char)c)
     486                 :        252 :                         return (char *)s;
     487         [ +  - ]:      36582 :                 if (*s++ == '\0')
     488                 :            :                         break;
     489                 :            :         }
     490                 :            :         return NULL;
     491                 :            : }
     492                 :            : EXPORT_SYMBOL(strnchr);
     493                 :            : #endif
     494                 :            : 
     495                 :            : /**
     496                 :            :  * skip_spaces - Removes leading whitespace from @str.
     497                 :            :  * @str: The string to be stripped.
     498                 :            :  *
     499                 :            :  * Returns a pointer to the first non-whitespace character in @str.
     500                 :            :  */
     501                 :       5271 : char *skip_spaces(const char *str)
     502                 :            : {
     503   [ -  +  +  + ]:       5565 :         while (isspace(*str))
     504                 :        294 :                 ++str;
     505                 :       2037 :         return (char *)str;
     506                 :            : }
     507                 :            : EXPORT_SYMBOL(skip_spaces);
     508                 :            : 
     509                 :            : /**
     510                 :            :  * strim - Removes leading and trailing whitespace from @s.
     511                 :            :  * @s: The string to be stripped.
     512                 :            :  *
     513                 :            :  * Note that the first trailing whitespace is replaced with a %NUL-terminator
     514                 :            :  * in the given string @s. Returns a pointer to the first non-whitespace
     515                 :            :  * character in @s.
     516                 :            :  */
     517                 :       3234 : char *strim(char *s)
     518                 :            : {
     519                 :       3234 :         size_t size;
     520                 :       3234 :         char *end;
     521                 :            : 
     522                 :       3234 :         size = strlen(s);
     523                 :       3234 :         if (!size)
     524                 :            :                 return s;
     525                 :            : 
     526                 :       3234 :         end = s + size - 1;
     527   [ +  -  +  + ]:       6468 :         while (end >= s && isspace(*end))
     528                 :       3234 :                 end--;
     529                 :       3234 :         *(end + 1) = '\0';
     530                 :            : 
     531                 :       3234 :         return skip_spaces(s);
     532                 :            : }
     533                 :            : EXPORT_SYMBOL(strim);
     534                 :            : 
     535                 :            : #ifndef __HAVE_ARCH_STRLEN
     536                 :            : /**
     537                 :            :  * strlen - Find the length of a string
     538                 :            :  * @s: The string to be sized
     539                 :            :  */
     540                 :    4141678 : size_t strlen(const char *s)
     541                 :            : {
     542                 :    4141384 :         const char *sc;
     543                 :            : 
     544   [ -  -  +  +  :  141608460 :         for (sc = s; *sc != '\0'; ++sc)
          +  +  +  +  +  
          +  +  +  +  +  
                   +  + ]
     545                 :  137358260 :                 /* nothing */;
     546   [ +  -  -  +  :     165851 :         return sc - s;
                   +  - ]
     547                 :            : }
     548                 :            : EXPORT_SYMBOL(strlen);
     549                 :            : #endif
     550                 :            : 
     551                 :            : #ifndef __HAVE_ARCH_STRNLEN
     552                 :            : /**
     553                 :            :  * strnlen - Find the length of a length-limited string
     554                 :            :  * @s: The string to be sized
     555                 :            :  * @count: The maximum number of bytes to search
     556                 :            :  */
     557                 :      21630 : size_t strnlen(const char *s, size_t count)
     558                 :            : {
     559                 :      21630 :         const char *sc;
     560                 :            : 
     561   [ +  +  +  + ]:     152544 :         for (sc = s; count-- && *sc != '\0'; ++sc)
     562                 :     130914 :                 /* nothing */;
     563                 :      21630 :         return sc - s;
     564                 :            : }
     565                 :            : EXPORT_SYMBOL(strnlen);
     566                 :            : #endif
     567                 :            : 
     568                 :            : #ifndef __HAVE_ARCH_STRSPN
     569                 :            : /**
     570                 :            :  * strspn - Calculate the length of the initial substring of @s which only contain letters in @accept
     571                 :            :  * @s: The string to be searched
     572                 :            :  * @accept: The string to search for
     573                 :            :  */
     574                 :          0 : size_t strspn(const char *s, const char *accept)
     575                 :            : {
     576                 :          0 :         const char *p;
     577                 :          0 :         const char *a;
     578                 :          0 :         size_t count = 0;
     579                 :            : 
     580         [ #  # ]:          0 :         for (p = s; *p != '\0'; ++p) {
     581         [ #  # ]:          0 :                 for (a = accept; *a != '\0'; ++a) {
     582         [ #  # ]:          0 :                         if (*p == *a)
     583                 :            :                                 break;
     584                 :            :                 }
     585         [ #  # ]:          0 :                 if (*a == '\0')
     586                 :          0 :                         return count;
     587                 :          0 :                 ++count;
     588                 :            :         }
     589                 :            :         return count;
     590                 :            : }
     591                 :            : 
     592                 :            : EXPORT_SYMBOL(strspn);
     593                 :            : #endif
     594                 :            : 
     595                 :            : #ifndef __HAVE_ARCH_STRCSPN
     596                 :            : /**
     597                 :            :  * strcspn - Calculate the length of the initial substring of @s which does not contain letters in @reject
     598                 :            :  * @s: The string to be searched
     599                 :            :  * @reject: The string to avoid
     600                 :            :  */
     601                 :          0 : size_t strcspn(const char *s, const char *reject)
     602                 :            : {
     603                 :          0 :         const char *p;
     604                 :          0 :         const char *r;
     605                 :          0 :         size_t count = 0;
     606                 :            : 
     607         [ #  # ]:          0 :         for (p = s; *p != '\0'; ++p) {
     608         [ #  # ]:          0 :                 for (r = reject; *r != '\0'; ++r) {
     609         [ #  # ]:          0 :                         if (*p == *r)
     610                 :          0 :                                 return count;
     611                 :            :                 }
     612                 :          0 :                 ++count;
     613                 :            :         }
     614                 :            :         return count;
     615                 :            : }
     616                 :            : EXPORT_SYMBOL(strcspn);
     617                 :            : #endif
     618                 :            : 
     619                 :            : #ifndef __HAVE_ARCH_STRPBRK
     620                 :            : /**
     621                 :            :  * strpbrk - Find the first occurrence of a set of characters
     622                 :            :  * @cs: The string to be searched
     623                 :            :  * @ct: The characters to search for
     624                 :            :  */
     625                 :          0 : char *strpbrk(const char *cs, const char *ct)
     626                 :            : {
     627                 :          0 :         const char *sc1, *sc2;
     628                 :            : 
     629   [ +  +  -  - ]:       4263 :         for (sc1 = cs; *sc1 != '\0'; ++sc1) {
     630   [ +  +  -  - ]:       7644 :                 for (sc2 = ct; *sc2 != '\0'; ++sc2) {
     631   [ +  +  -  - ]:       3990 :                         if (*sc1 == *sc2)
     632                 :          0 :                                 return (char *)sc1;
     633                 :            :                 }
     634                 :            :         }
     635                 :            :         return NULL;
     636                 :            : }
     637                 :            : EXPORT_SYMBOL(strpbrk);
     638                 :            : #endif
     639                 :            : 
     640                 :            : #ifndef __HAVE_ARCH_STRSEP
     641                 :            : /**
     642                 :            :  * strsep - Split a string into tokens
     643                 :            :  * @s: The string to be searched
     644                 :            :  * @ct: The characters to search for
     645                 :            :  *
     646                 :            :  * strsep() updates @s to point after the token, ready for the next call.
     647                 :            :  *
     648                 :            :  * It returns empty tokens, too, behaving exactly like the libc function
     649                 :            :  * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
     650                 :            :  * Same semantics, slimmer shape. ;)
     651                 :            :  */
     652                 :        924 : char *strsep(char **s, const char *ct)
     653                 :            : {
     654                 :        924 :         char *sbegin = *s;
     655                 :        924 :         char *end;
     656                 :            : 
     657         [ +  + ]:        924 :         if (sbegin == NULL)
     658                 :            :                 return NULL;
     659                 :            : 
     660                 :            :         end = strpbrk(sbegin, ct);
     661         [ +  + ]:        609 :         if (end)
     662                 :        336 :                 *end++ = '\0';
     663                 :        609 :         *s = end;
     664                 :        609 :         return sbegin;
     665                 :            : }
     666                 :            : EXPORT_SYMBOL(strsep);
     667                 :            : #endif
     668                 :            : 
     669                 :            : /**
     670                 :            :  * sysfs_streq - return true if strings are equal, modulo trailing newline
     671                 :            :  * @s1: one string
     672                 :            :  * @s2: another string
     673                 :            :  *
     674                 :            :  * This routine returns true iff two strings are equal, treating both
     675                 :            :  * NUL and newline-then-NUL as equivalent string terminations.  It's
     676                 :            :  * geared for use with sysfs input strings, which generally terminate
     677                 :            :  * with newlines but are compared against values without newlines.
     678                 :            :  */
     679                 :         63 : bool sysfs_streq(const char *s1, const char *s2)
     680                 :            : {
     681   [ +  -  +  + ]:        567 :         while (*s1 && *s1 == *s2) {
     682                 :        504 :                 s1++;
     683                 :        504 :                 s2++;
     684                 :            :         }
     685                 :            : 
     686         [ +  - ]:         63 :         if (*s1 == *s2)
     687                 :            :                 return true;
     688   [ -  +  -  -  :         63 :         if (!*s1 && *s2 == '\n' && !s2[1])
                   -  - ]
     689                 :            :                 return true;
     690   [ -  +  -  -  :         63 :         if (*s1 == '\n' && !s1[1] && !*s2)
                   -  - ]
     691                 :          0 :                 return true;
     692                 :            :         return false;
     693                 :            : }
     694                 :            : EXPORT_SYMBOL(sysfs_streq);
     695                 :            : 
     696                 :            : /**
     697                 :            :  * match_string - matches given string in an array
     698                 :            :  * @array:      array of strings
     699                 :            :  * @n:          number of strings in the array or -1 for NULL terminated arrays
     700                 :            :  * @string:     string to match with
     701                 :            :  *
     702                 :            :  * This routine will look for a string in an array of strings up to the
     703                 :            :  * n-th element in the array or until the first NULL element.
     704                 :            :  *
     705                 :            :  * Historically the value of -1 for @n, was used to search in arrays that
     706                 :            :  * are NULL terminated. However, the function does not make a distinction
     707                 :            :  * when finishing the search: either @n elements have been compared OR
     708                 :            :  * the first NULL element was found.
     709                 :            :  *
     710                 :            :  * Return:
     711                 :            :  * index of a @string in the @array if matches, or %-EINVAL otherwise.
     712                 :            :  */
     713                 :          0 : int match_string(const char * const *array, size_t n, const char *string)
     714                 :            : {
     715                 :          0 :         int index;
     716                 :          0 :         const char *item;
     717                 :            : 
     718         [ #  # ]:          0 :         for (index = 0; index < n; index++) {
     719                 :          0 :                 item = array[index];
     720         [ #  # ]:          0 :                 if (!item)
     721                 :            :                         break;
     722                 :            :                 if (!strcmp(item, string))
     723                 :          0 :                         return index;
     724                 :            :         }
     725                 :            : 
     726                 :            :         return -EINVAL;
     727                 :            : }
     728                 :            : EXPORT_SYMBOL(match_string);
     729                 :            : 
     730                 :            : /**
     731                 :            :  * __sysfs_match_string - matches given string in an array
     732                 :            :  * @array: array of strings
     733                 :            :  * @n: number of strings in the array or -1 for NULL terminated arrays
     734                 :            :  * @str: string to match with
     735                 :            :  *
     736                 :            :  * Returns index of @str in the @array or -EINVAL, just like match_string().
     737                 :            :  * Uses sysfs_streq instead of strcmp for matching.
     738                 :            :  *
     739                 :            :  * This routine will look for a string in an array of strings up to the
     740                 :            :  * n-th element in the array or until the first NULL element.
     741                 :            :  *
     742                 :            :  * Historically the value of -1 for @n, was used to search in arrays that
     743                 :            :  * are NULL terminated. However, the function does not make a distinction
     744                 :            :  * when finishing the search: either @n elements have been compared OR
     745                 :            :  * the first NULL element was found.
     746                 :            :  */
     747                 :          0 : int __sysfs_match_string(const char * const *array, size_t n, const char *str)
     748                 :            : {
     749                 :          0 :         const char *item;
     750                 :          0 :         int index;
     751                 :            : 
     752         [ #  # ]:          0 :         for (index = 0; index < n; index++) {
     753                 :          0 :                 item = array[index];
     754         [ #  # ]:          0 :                 if (!item)
     755                 :            :                         break;
     756         [ #  # ]:          0 :                 if (sysfs_streq(item, str))
     757                 :          0 :                         return index;
     758                 :            :         }
     759                 :            : 
     760                 :            :         return -EINVAL;
     761                 :            : }
     762                 :            : EXPORT_SYMBOL(__sysfs_match_string);
     763                 :            : 
     764                 :            : #ifndef __HAVE_ARCH_MEMSET
     765                 :            : /**
     766                 :            :  * memset - Fill a region of memory with the given value
     767                 :            :  * @s: Pointer to the start of the area.
     768                 :            :  * @c: The byte to fill the area with
     769                 :            :  * @count: The size of the area.
     770                 :            :  *
     771                 :            :  * Do not use memset() to access IO space, use memset_io() instead.
     772                 :            :  */
     773                 :            : void *memset(void *s, int c, size_t count)
     774                 :            : {
     775                 :            :         char *xs = s;
     776                 :            : 
     777                 :            :         while (count--)
     778                 :            :                 *xs++ = c;
     779                 :            :         return s;
     780                 :            : }
     781                 :            : EXPORT_SYMBOL(memset);
     782                 :            : #endif
     783                 :            : 
     784                 :            : #ifndef __HAVE_ARCH_MEMSET16
     785                 :            : /**
     786                 :            :  * memset16() - Fill a memory area with a uint16_t
     787                 :            :  * @s: Pointer to the start of the area.
     788                 :            :  * @v: The value to fill the area with
     789                 :            :  * @count: The number of values to store
     790                 :            :  *
     791                 :            :  * Differs from memset() in that it fills with a uint16_t instead
     792                 :            :  * of a byte.  Remember that @count is the number of uint16_ts to
     793                 :            :  * store, not the number of bytes.
     794                 :            :  */
     795                 :            : void *memset16(uint16_t *s, uint16_t v, size_t count)
     796                 :            : {
     797                 :            :         uint16_t *xs = s;
     798                 :            : 
     799                 :            :         while (count--)
     800                 :            :                 *xs++ = v;
     801                 :            :         return s;
     802                 :            : }
     803                 :            : EXPORT_SYMBOL(memset16);
     804                 :            : #endif
     805                 :            : 
     806                 :            : #ifndef __HAVE_ARCH_MEMSET32
     807                 :            : /**
     808                 :            :  * memset32() - Fill a memory area with a uint32_t
     809                 :            :  * @s: Pointer to the start of the area.
     810                 :            :  * @v: The value to fill the area with
     811                 :            :  * @count: The number of values to store
     812                 :            :  *
     813                 :            :  * Differs from memset() in that it fills with a uint32_t instead
     814                 :            :  * of a byte.  Remember that @count is the number of uint32_ts to
     815                 :            :  * store, not the number of bytes.
     816                 :            :  */
     817                 :            : void *memset32(uint32_t *s, uint32_t v, size_t count)
     818                 :            : {
     819                 :            :         uint32_t *xs = s;
     820                 :            : 
     821                 :            :         while (count--)
     822                 :            :                 *xs++ = v;
     823                 :            :         return s;
     824                 :            : }
     825                 :            : EXPORT_SYMBOL(memset32);
     826                 :            : #endif
     827                 :            : 
     828                 :            : #ifndef __HAVE_ARCH_MEMSET64
     829                 :            : /**
     830                 :            :  * memset64() - Fill a memory area with a uint64_t
     831                 :            :  * @s: Pointer to the start of the area.
     832                 :            :  * @v: The value to fill the area with
     833                 :            :  * @count: The number of values to store
     834                 :            :  *
     835                 :            :  * Differs from memset() in that it fills with a uint64_t instead
     836                 :            :  * of a byte.  Remember that @count is the number of uint64_ts to
     837                 :            :  * store, not the number of bytes.
     838                 :            :  */
     839                 :            : void *memset64(uint64_t *s, uint64_t v, size_t count)
     840                 :            : {
     841                 :            :         uint64_t *xs = s;
     842                 :            : 
     843                 :            :         while (count--)
     844                 :            :                 *xs++ = v;
     845                 :            :         return s;
     846                 :            : }
     847                 :            : EXPORT_SYMBOL(memset64);
     848                 :            : #endif
     849                 :            : 
     850                 :            : #ifndef __HAVE_ARCH_MEMCPY
     851                 :            : /**
     852                 :            :  * memcpy - Copy one area of memory to another
     853                 :            :  * @dest: Where to copy to
     854                 :            :  * @src: Where to copy from
     855                 :            :  * @count: The size of the area.
     856                 :            :  *
     857                 :            :  * You should not use this function to access IO space, use memcpy_toio()
     858                 :            :  * or memcpy_fromio() instead.
     859                 :            :  */
     860                 :            : void *memcpy(void *dest, const void *src, size_t count)
     861                 :            : {
     862                 :            :         char *tmp = dest;
     863                 :            :         const char *s = src;
     864                 :            : 
     865                 :            :         while (count--)
     866                 :            :                 *tmp++ = *s++;
     867                 :            :         return dest;
     868                 :            : }
     869                 :            : EXPORT_SYMBOL(memcpy);
     870                 :            : #endif
     871                 :            : 
     872                 :            : #ifndef __HAVE_ARCH_MEMMOVE
     873                 :            : /**
     874                 :            :  * memmove - Copy one area of memory to another
     875                 :            :  * @dest: Where to copy to
     876                 :            :  * @src: Where to copy from
     877                 :            :  * @count: The size of the area.
     878                 :            :  *
     879                 :            :  * Unlike memcpy(), memmove() copes with overlapping areas.
     880                 :            :  */
     881                 :            : void *memmove(void *dest, const void *src, size_t count)
     882                 :            : {
     883                 :            :         char *tmp;
     884                 :            :         const char *s;
     885                 :            : 
     886                 :            :         if (dest <= src) {
     887                 :            :                 tmp = dest;
     888                 :            :                 s = src;
     889                 :            :                 while (count--)
     890                 :            :                         *tmp++ = *s++;
     891                 :            :         } else {
     892                 :            :                 tmp = dest;
     893                 :            :                 tmp += count;
     894                 :            :                 s = src;
     895                 :            :                 s += count;
     896                 :            :                 while (count--)
     897                 :            :                         *--tmp = *--s;
     898                 :            :         }
     899                 :            :         return dest;
     900                 :            : }
     901                 :            : EXPORT_SYMBOL(memmove);
     902                 :            : #endif
     903                 :            : 
     904                 :            : #ifndef __HAVE_ARCH_MEMCMP
     905                 :            : /**
     906                 :            :  * memcmp - Compare two areas of memory
     907                 :            :  * @cs: One area of memory
     908                 :            :  * @ct: Another area of memory
     909                 :            :  * @count: The size of the area.
     910                 :            :  */
     911                 :            : #undef memcmp
     912                 :    1024436 : __visible int memcmp(const void *cs, const void *ct, size_t count)
     913                 :            : {
     914                 :    1024436 :         const unsigned char *su1, *su2;
     915                 :    1024436 :         int res = 0;
     916                 :            : 
     917   [ -  -  +  +  :    2220822 :         for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
             -  -  +  + ]
     918   [ -  -  +  +  :    1963990 :                 if ((res = *su1 - *su2) != 0)
             -  -  +  + ]
     919                 :            :                         break;
     920                 :    1024436 :         return res;
     921                 :            : }
     922                 :            : EXPORT_SYMBOL(memcmp);
     923                 :            : #endif
     924                 :            : 
     925                 :            : #ifndef __HAVE_ARCH_BCMP
     926                 :            : /**
     927                 :            :  * bcmp - returns 0 if and only if the buffers have identical contents.
     928                 :            :  * @a: pointer to first buffer.
     929                 :            :  * @b: pointer to second buffer.
     930                 :            :  * @len: size of buffers.
     931                 :            :  *
     932                 :            :  * The sign or magnitude of a non-zero return value has no particular
     933                 :            :  * meaning, and architectures may implement their own more efficient bcmp(). So
     934                 :            :  * while this particular implementation is a simple (tail) call to memcmp, do
     935                 :            :  * not rely on anything but whether the return value is zero or non-zero.
     936                 :            :  */
     937                 :            : #undef bcmp
     938                 :          0 : int bcmp(const void *a, const void *b, size_t len)
     939                 :            : {
     940                 :          0 :         return memcmp(a, b, len);
     941                 :            : }
     942                 :            : EXPORT_SYMBOL(bcmp);
     943                 :            : #endif
     944                 :            : 
     945                 :            : #ifndef __HAVE_ARCH_MEMSCAN
     946                 :            : /**
     947                 :            :  * memscan - Find a character in an area of memory.
     948                 :            :  * @addr: The memory area
     949                 :            :  * @c: The byte to search for
     950                 :            :  * @size: The size of the area.
     951                 :            :  *
     952                 :            :  * returns the address of the first occurrence of @c, or 1 byte past
     953                 :            :  * the area if @c is not found
     954                 :            :  */
     955                 :          0 : void *memscan(void *addr, int c, size_t size)
     956                 :            : {
     957                 :          0 :         unsigned char *p = addr;
     958                 :            : 
     959         [ #  # ]:          0 :         while (size) {
     960         [ #  # ]:          0 :                 if (*p == c)
     961                 :          0 :                         return (void *)p;
     962                 :          0 :                 p++;
     963                 :          0 :                 size--;
     964                 :            :         }
     965                 :            :         return (void *)p;
     966                 :            : }
     967                 :            : EXPORT_SYMBOL(memscan);
     968                 :            : #endif
     969                 :            : 
     970                 :            : #ifndef __HAVE_ARCH_STRSTR
     971                 :            : /**
     972                 :            :  * strstr - Find the first substring in a %NUL terminated string
     973                 :            :  * @s1: The string to be searched
     974                 :            :  * @s2: The string to search for
     975                 :            :  */
     976                 :     108507 : char *strstr(const char *s1, const char *s2)
     977                 :            : {
     978                 :     108507 :         size_t l1, l2;
     979                 :            : 
     980                 :     108507 :         l2 = strlen(s2);
     981         [ +  - ]:     108507 :         if (!l2)
     982                 :            :                 return (char *)s1;
     983                 :            :         l1 = strlen(s1);
     984         [ +  + ]:     296457 :         while (l1 >= l2) {
     985                 :     204519 :                 l1--;
     986         [ +  + ]:     409038 :                 if (!memcmp(s1, s2, l2))
     987                 :      16569 :                         return (char *)s1;
     988                 :     187950 :                 s1++;
     989                 :            :         }
     990                 :            :         return NULL;
     991                 :            : }
     992                 :            : EXPORT_SYMBOL(strstr);
     993                 :            : #endif
     994                 :            : 
     995                 :            : #ifndef __HAVE_ARCH_STRNSTR
     996                 :            : /**
     997                 :            :  * strnstr - Find the first substring in a length-limited string
     998                 :            :  * @s1: The string to be searched
     999                 :            :  * @s2: The string to search for
    1000                 :            :  * @len: the maximum number of characters to search
    1001                 :            :  */
    1002                 :          0 : char *strnstr(const char *s1, const char *s2, size_t len)
    1003                 :            : {
    1004                 :          0 :         size_t l2;
    1005                 :            : 
    1006                 :          0 :         l2 = strlen(s2);
    1007         [ #  # ]:          0 :         if (!l2)
    1008                 :            :                 return (char *)s1;
    1009         [ #  # ]:          0 :         while (len >= l2) {
    1010                 :          0 :                 len--;
    1011         [ #  # ]:          0 :                 if (!memcmp(s1, s2, l2))
    1012                 :          0 :                         return (char *)s1;
    1013                 :          0 :                 s1++;
    1014                 :            :         }
    1015                 :            :         return NULL;
    1016                 :            : }
    1017                 :            : EXPORT_SYMBOL(strnstr);
    1018                 :            : #endif
    1019                 :            : 
    1020                 :            : #ifndef __HAVE_ARCH_MEMCHR
    1021                 :            : /**
    1022                 :            :  * memchr - Find a character in an area of memory.
    1023                 :            :  * @s: The memory area
    1024                 :            :  * @c: The byte to search for
    1025                 :            :  * @n: The size of the area.
    1026                 :            :  *
    1027                 :            :  * returns the address of the first occurrence of @c, or %NULL
    1028                 :            :  * if @c is not found
    1029                 :            :  */
    1030                 :     345762 : void *memchr(const void *s, int c, size_t n)
    1031                 :            : {
    1032                 :     345762 :         const unsigned char *p = s;
    1033         [ +  + ]:    4917059 :         while (n-- != 0) {
    1034         [ +  + ]:    4571927 :                 if ((unsigned char)c == *p++) {
    1035                 :        630 :                         return (void *)(p - 1);
    1036                 :            :                 }
    1037                 :            :         }
    1038                 :            :         return NULL;
    1039                 :            : }
    1040                 :            : EXPORT_SYMBOL(memchr);
    1041                 :            : #endif
    1042                 :            : 
    1043                 :        959 : static void *check_bytes8(const u8 *start, u8 value, unsigned int bytes)
    1044                 :            : {
    1045   [ +  +  -  -  :       8045 :         while (bytes) {
             -  -  -  - ]
    1046   [ +  +  -  -  :       7323 :                 if (*start != value)
             -  -  -  - ]
    1047                 :            :                         return (void *)start;
    1048                 :       7086 :                 start++;
    1049                 :       7086 :                 bytes--;
    1050                 :            :         }
    1051                 :            :         return NULL;
    1052                 :            : }
    1053                 :            : 
    1054                 :            : /**
    1055                 :            :  * memchr_inv - Find an unmatching character in an area of memory.
    1056                 :            :  * @start: The memory area
    1057                 :            :  * @c: Find a character other than c
    1058                 :            :  * @bytes: The size of the area.
    1059                 :            :  *
    1060                 :            :  * returns the address of the first character other than @c, or %NULL
    1061                 :            :  * if the whole buffer contains just @c.
    1062                 :            :  */
    1063                 :        959 : void *memchr_inv(const void *start, int c, size_t bytes)
    1064                 :            : {
    1065                 :        959 :         u8 value = c;
    1066                 :        959 :         u64 value64;
    1067                 :        959 :         unsigned int words, prefix;
    1068                 :            : 
    1069         [ +  - ]:        959 :         if (bytes <= 16)
    1070                 :        959 :                 return check_bytes8(start, value, bytes);
    1071                 :            : 
    1072                 :          0 :         value64 = value;
    1073                 :            : #if defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64
    1074                 :          0 :         value64 *= 0x0101010101010101ULL;
    1075                 :            : #elif defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER)
    1076                 :            :         value64 *= 0x01010101;
    1077                 :            :         value64 |= value64 << 32;
    1078                 :            : #else
    1079                 :            :         value64 |= value64 << 8;
    1080                 :            :         value64 |= value64 << 16;
    1081                 :            :         value64 |= value64 << 32;
    1082                 :            : #endif
    1083                 :            : 
    1084                 :          0 :         prefix = (unsigned long)start % 8;
    1085         [ #  # ]:          0 :         if (prefix) {
    1086                 :          0 :                 u8 *r;
    1087                 :            : 
    1088                 :          0 :                 prefix = 8 - prefix;
    1089                 :          0 :                 r = check_bytes8(start, value, prefix);
    1090         [ #  # ]:          0 :                 if (r)
    1091                 :            :                         return r;
    1092                 :          0 :                 start += prefix;
    1093                 :          0 :                 bytes -= prefix;
    1094                 :            :         }
    1095                 :            : 
    1096                 :          0 :         words = bytes / 8;
    1097                 :            : 
    1098         [ #  # ]:          0 :         while (words) {
    1099         [ #  # ]:          0 :                 if (*(u64 *)start != value64)
    1100                 :          0 :                         return check_bytes8(start, value, 8);
    1101                 :          0 :                 start += 8;
    1102                 :          0 :                 words--;
    1103                 :            :         }
    1104                 :            : 
    1105                 :          0 :         return check_bytes8(start, value, bytes % 8);
    1106                 :            : }
    1107                 :            : EXPORT_SYMBOL(memchr_inv);
    1108                 :            : 
    1109                 :            : /**
    1110                 :            :  * strreplace - Replace all occurrences of character in string.
    1111                 :            :  * @s: The string to operate on.
    1112                 :            :  * @old: The character being replaced.
    1113                 :            :  * @new: The character @old is replaced with.
    1114                 :            :  *
    1115                 :            :  * Returns pointer to the nul byte at the end of @s.
    1116                 :            :  */
    1117                 :        189 : char *strreplace(char *s, char old, char new)
    1118                 :            : {
    1119         [ +  + ]:        903 :         for (; *s; ++s)
    1120         [ +  + ]:        714 :                 if (*s == old)
    1121                 :         42 :                         *s = new;
    1122                 :        189 :         return s;
    1123                 :            : }
    1124                 :            : EXPORT_SYMBOL(strreplace);
    1125                 :            : 
    1126                 :          0 : void fortify_panic(const char *name)
    1127                 :            : {
    1128                 :          0 :         pr_emerg("detected buffer overflow in %s\n", name);
    1129                 :          0 :         BUG();
    1130                 :            : }
    1131                 :            : EXPORT_SYMBOL(fortify_panic);

Generated by: LCOV version 1.14