1// SPDX-License-Identifier: GPL-2.0 2/* 3 * arch/loongarch/boot/compressed/string.c 4 * 5 * Very small subset of simple string routines 6 */ 7 8#include <linux/types.h> 9 10void * __weak memchr(const void *s, int c, size_t n) 11{ 12 const unsigned char *p = s; 13 while (n-- != 0) { 14 if ((unsigned char)c == *p++) { 15 return (void *)(p - 1); 16 } 17 } 18 return NULL; 19} 20 21int __weak memcmp(const void *cs, const void *ct, size_t count) 22{ 23 int res = 0; 24 const unsigned char *su1, *su2; 25 26 for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) { 27 res = *su1 - *su2; 28 if (res != 0) 29 break; 30 } 31 return res; 32} 33 34void __weak *memset(void *s, int c, size_t n) 35{ 36 int i; 37 char *ss = s; 38 39 for (i = 0; i < n; i++) 40 ss[i] = c; 41 return s; 42} 43 44void __weak *memcpy(void *dest, const void *src, size_t n) 45{ 46 int i; 47 const char *s = src; 48 char *d = dest; 49 50 for (i = 0; i < n; i++) 51 d[i] = s[i]; 52 return dest; 53} 54 55void __weak *memmove(void *dest, const void *src, size_t n) 56{ 57 int i; 58 const char *s = src; 59 char *d = dest; 60 61 if (d < s) { 62 for (i = 0; i < n; i++) 63 d[i] = s[i]; 64 } else if (d > s) { 65 for (i = n - 1; i >= 0; i--) 66 d[i] = s[i]; 67 } 68 69 return dest; 70} 71 72int __weak strcmp(const char *str1, const char *str2) 73{ 74 int delta = 0; 75 const unsigned char *s1 = (const unsigned char *)str1; 76 const unsigned char *s2 = (const unsigned char *)str2; 77 78 while (*s1 || *s2) { 79 delta = *s1 - *s2; 80 if (delta) 81 return delta; 82 s1++; 83 s2++; 84 } 85 return 0; 86} 87 88size_t __weak strlen(const char *s) 89{ 90 const char *sc; 91 92 for (sc = s; *sc != '\0'; ++sc) 93 /* nothing */; 94 return sc - s; 95} 96 97size_t __weak strnlen(const char *s, size_t count) 98{ 99 const char *sc; 100 101 for (sc = s; count-- && *sc != '\0'; ++sc) 102 /* nothing */; 103 return sc - s; 104} 105 106char * __weak strrchr(const char *s, int c) 107{ 108 const char *last = NULL; 109 do { 110 if (*s == (char)c) 111 last = s; 112 } while (*s++); 113 return (char *)last; 114} 115 116#ifdef CONFIG_KASAN 117extern void *__memset(void *s, int c, size_t n) __alias(memset); 118extern void *__memcpy(void *dest, const void *src, size_t n) __alias(memcpy); 119extern void *__memmove(void *dest, const void *src, size_t n) __alias(memmove); 120#endif 121