diff options
Diffstat (limited to 'arch/arm/boot/compressed/string.c')
| -rw-r--r-- | arch/arm/boot/compressed/string.c | 127 | 
1 files changed, 127 insertions, 0 deletions
diff --git a/arch/arm/boot/compressed/string.c b/arch/arm/boot/compressed/string.c new file mode 100644 index 00000000000..36e53ef9200 --- /dev/null +++ b/arch/arm/boot/compressed/string.c @@ -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); +}  |