mirror of
https://gitee.com/open-loongarch/linux-5.10.git
synced 2026-10-28 14:07:12 +08:00
173 lines
2.8 KiB
C
173 lines
2.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* arch/loongarch/boot/compressed/string.c
|
|
*
|
|
* Very small subset of simple string routines
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
|
|
void __weak *memset(void *s, int c, size_t n)
|
|
{
|
|
int i;
|
|
char *ss = s;
|
|
|
|
for (i = 0; i < n; i++)
|
|
ss[i] = c;
|
|
return s;
|
|
}
|
|
|
|
void __weak *memcpy(void *dest, const void *src, size_t n)
|
|
{
|
|
int i;
|
|
const char *s = src;
|
|
char *d = dest;
|
|
|
|
for (i = 0; i < n; i++)
|
|
d[i] = s[i];
|
|
return dest;
|
|
}
|
|
|
|
void __weak *memmove(void *dest, const void *src, size_t n)
|
|
{
|
|
int i;
|
|
const char *s = src;
|
|
char *d = dest;
|
|
|
|
if (d < s) {
|
|
for (i = 0; i < n; i++)
|
|
d[i] = s[i];
|
|
} else if (d > s) {
|
|
for (i = n - 1; i >= 0; i--)
|
|
d[i] = s[i];
|
|
}
|
|
|
|
return dest;
|
|
}
|
|
|
|
int __weak memcmp(const void *cs, const void *ct, size_t count)
|
|
{
|
|
int res = 0;
|
|
const unsigned char *su1, *su2;
|
|
|
|
for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) {
|
|
res = *su1 - *su2;
|
|
if (res != 0)
|
|
break;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
int __weak strcmp(const char *str1, const char *str2)
|
|
{
|
|
int delta = 0;
|
|
const unsigned char *s1 = (const unsigned char *)str1;
|
|
const unsigned char *s2 = (const unsigned char *)str2;
|
|
|
|
while (*s1 || *s2) {
|
|
delta = *s1 - *s2;
|
|
if (delta)
|
|
return delta;
|
|
s1++;
|
|
s2++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
size_t __weak strlen(const char *s)
|
|
{
|
|
const char *sc;
|
|
|
|
for (sc = s; *sc != '\0'; ++sc)
|
|
/* nothing */;
|
|
return sc - s;
|
|
}
|
|
|
|
size_t __weak strnlen(const char *s, size_t count)
|
|
{
|
|
const char *sc;
|
|
|
|
for (sc = s; count-- && *sc != '\0'; ++sc)
|
|
/* nothing */;
|
|
return sc - s;
|
|
}
|
|
|
|
char * __weak strnstr(const char *s1, const char *s2, size_t len)
|
|
{
|
|
size_t l2;
|
|
|
|
l2 = strlen(s2);
|
|
if (!l2)
|
|
return (char *)s1;
|
|
while (len >= l2) {
|
|
len--;
|
|
if (!memcmp(s1, s2, l2))
|
|
return (char *)s1;
|
|
s1++;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
#undef strcat
|
|
char * __weak strcat(char *dest, const char *src)
|
|
{
|
|
char *tmp = dest;
|
|
|
|
while (*dest)
|
|
dest++;
|
|
while ((*dest++ = *src++) != '\0')
|
|
;
|
|
return tmp;
|
|
}
|
|
|
|
char * __weak strncat(char *dest, const char *src, size_t count)
|
|
{
|
|
char *tmp = dest;
|
|
|
|
if (count) {
|
|
while (*dest)
|
|
dest++;
|
|
while ((*dest++ = *src++) != 0) {
|
|
if (--count == 0) {
|
|
*dest = '\0';
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return tmp;
|
|
}
|
|
|
|
char * __weak strpbrk(const char *cs, const char *ct)
|
|
{
|
|
const char *sc1, *sc2;
|
|
|
|
for (sc1 = cs; *sc1 != '\0'; ++sc1) {
|
|
for (sc2 = ct; *sc2 != '\0'; ++sc2) {
|
|
if (*sc1 == *sc2)
|
|
return (char *)sc1;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
char * __weak strsep(char **s, const char *ct)
|
|
{
|
|
char *sbegin = *s;
|
|
char *end;
|
|
|
|
if (sbegin == NULL)
|
|
return NULL;
|
|
|
|
end = strpbrk(sbegin, ct);
|
|
if (end)
|
|
*end++ = '\0';
|
|
*s = end;
|
|
return sbegin;
|
|
}
|
|
|
|
#ifdef CONFIG_KASAN
|
|
extern void *__memset(void *s, int c, size_t n) __alias(memset);
|
|
extern void *__memcpy(void *dest, const void *src, size_t n) __alias(memcpy);
|
|
extern void *__memmove(void *dest, const void *src, size_t n) __alias(memmove);
|
|
#endif
|