This is a small subset of string functions needed by commits to come. Except for memcpy() which is unchanged from its original location, their implementation is meant to be small, and -Os is enforced to prevent gcc from doing pointless loop unrolling. Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org> Tested-by: Shawn Guo <shawn.guo@linaro.org> Tested-by: Dave Martin <dave.martin@linaro.org> Tested-by: Thomas Abraham <thomas.abraham@linaro.org>tirimbino
parent
5ffb04f669
commit
df4879fa26
@ -0,0 +1,127 @@ |
||||
/*
|
||||
* arch/arm/boot/compressed/string.c |
||||
* |
||||
* Small subset of simple string routines |
||||
*/ |
||||
|
||||
#include <linux/string.h> |
||||
|
||||
void *memcpy(void *__dest, __const void *__src, size_t __n) |
||||
{ |
||||
int i = 0; |
||||
unsigned char *d = (unsigned char *)__dest, *s = (unsigned char *)__src; |
||||
|
||||
for (i = __n >> 3; i > 0; i--) { |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
} |
||||
|
||||
if (__n & 1 << 2) { |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
} |
||||
|
||||
if (__n & 1 << 1) { |
||||
*d++ = *s++; |
||||
*d++ = *s++; |
||||
} |
||||
|
||||
if (__n & 1) |
||||
*d++ = *s++; |
||||
|
||||
return __dest; |
||||
} |
||||
|
||||
void *memmove(void *__dest, __const void *__src, size_t count) |
||||
{ |
||||
unsigned char *d = __dest; |
||||
const unsigned char *s = __src; |
||||
|
||||
if (__dest == __src) |
||||
return __dest; |
||||
|
||||
if (__dest < __src) |
||||
return memcpy(__dest, __src, count); |
||||
|
||||
while (count--) |
||||
d[count] = s[count]; |
||||
return __dest; |
||||
} |
||||
|
||||
size_t strlen(const char *s) |
||||
{ |
||||
const char *sc = s; |
||||
|
||||
while (*sc != '\0') |
||||
sc++; |
||||
return sc - s; |
||||
} |
||||
|
||||
int memcmp(const void *cs, const void *ct, size_t count) |
||||
{ |
||||
const unsigned char *su1 = cs, *su2 = ct, *end = su1 + count; |
||||
int res = 0; |
||||
|
||||
while (su1 < end) { |
||||
res = *su1++ - *su2++; |
||||
if (res) |
||||
break; |
||||
} |
||||
return res; |
||||
} |
||||
|
||||
int strcmp(const char *cs, const char *ct) |
||||
{ |
||||
unsigned char c1, c2; |
||||
int res = 0; |
||||
|
||||
do { |
||||
c1 = *cs++; |
||||
c2 = *ct++; |
||||
res = c1 - c2; |
||||
if (res) |
||||
break; |
||||
} while (c1); |
||||
return res; |
||||
} |
||||
|
||||
void *memchr(const void *s, int c, size_t count) |
||||
{ |
||||
const unsigned char *p = s; |
||||
|
||||
while (count--) |
||||
if ((unsigned char)c == *p++) |
||||
return (void *)(p - 1); |
||||
return NULL; |
||||
} |
||||
|
||||
char *strchr(const char *s, int c) |
||||
{ |
||||
while (*s != (char)c) |
||||
if (*s++ == '\0') |
||||
return NULL; |
||||
return (char *)s; |
||||
} |
||||
|
||||
#undef memset |
||||
|
||||
void *memset(void *s, int c, size_t count) |
||||
{ |
||||
char *xs = s; |
||||
while (count--) |
||||
*xs++ = c; |
||||
return s; |
||||
} |
||||
|
||||
void __memzero(void *s, size_t count) |
||||
{ |
||||
memset(s, 0, count); |
||||
} |
Loading…
Reference in new issue