linux/arch/arm/boot/compressed/string.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * arch/arm/boot/compressed/string.c
   4 *
   5 * Small subset of simple string routines
   6 */
   7
   8#include <linux/string.h>
   9
  10void *memcpy(void *__dest, __const void *__src, size_t __n)
  11{
  12        int i = 0;
  13        unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src;
  14
  15        for (i = __n >> 3; i > 0; i--) {
  16                *d++ = *s++;
  17                *d++ = *s++;
  18                *d++ = *s++;
  19                *d++ = *s++;
  20                *d++ = *s++;
  21                *d++ = *s++;
  22                *d++ = *s++;
  23                *d++ = *s++;
  24        }
  25
  26        if (__n & 1 << 2) {
  27                *d++ = *s++;
  28                *d++ = *s++;
  29                *d++ = *s++;
  30                *d++ = *s++;
  31        }
  32
  33        if (__n & 1 << 1) {
  34                *d++ = *s++;
  35                *d++ = *s++;
  36        }
  37
  38        if (__n & 1)
  39                *d++ = *s++;
  40
  41        return __dest;
  42}
  43
  44void *memmove(void *__dest, __const void *__src, size_t count)
  45{
  46        unsigned char *d = __dest;
  47        const unsigned char *s = __src;
  48
  49        if (__dest == __src)
  50                return __dest;
  51
  52        if (__dest < __src)
  53                return memcpy(__dest, __src, count);
  54
  55        while (count--)
  56                d[count] = s[count];
  57        return __dest;
  58}
  59
  60size_t strlen(const char *s)
  61{
  62        const char *sc = s;
  63
  64        while (*sc != '\0')
  65                sc++;
  66        return sc - s;
  67}
  68
  69size_t strnlen(const char *s, size_t count)
  70{
  71        const char *sc;
  72
  73        for (sc = s; count-- && *sc != '\0'; ++sc)
  74                /* nothing */;
  75        return sc - s;
  76}
  77
  78int memcmp(const void *cs, const void *ct, size_t count)
  79{
  80        const unsigned char *su1 = cs, *su2 = ct, *end = su1 + count;
  81        int res = 0;
  82
  83        while (su1 < end) {
  84                res = *su1++ - *su2++;
  85                if (res)
  86                        break;
  87        }
  88        return res;
  89}
  90
  91int strcmp(const char *cs, const char *ct)
  92{
  93        unsigned char c1, c2;
  94        int res = 0;
  95
  96        do {
  97                c1 = *cs++;
  98                c2 = *ct++;
  99                res = c1 - c2;
 100                if (res)
 101                        break;
 102        } while (c1);
 103        return res;
 104}
 105
 106void *memchr(const void *s, int c, size_t count)
 107{
 108        const unsigned char *p = s;
 109
 110        while (count--)
 111                if ((unsigned char)c == *p++)
 112                        return (void *)(p - 1);
 113        return NULL;
 114}
 115
 116char *strchr(const char *s, int c)
 117{
 118        while (*s != (char)c)
 119                if (*s++ == '\0')
 120                        return NULL;
 121        return (char *)s;
 122}
 123
 124#undef memset
 125
 126void *memset(void *s, int c, size_t count)
 127{
 128        char *xs = s;
 129        while (count--)
 130                *xs++ = c;
 131        return s;
 132}
 133