From 28d0cc04e24ba27bfcfa1aabae10b5d409f05a14 Mon Sep 17 00:00:00 2001 From: Scott Wood Date: Sun, 5 Aug 2007 12:05:08 -0500 Subject: [PATCH 1/1] More libc functions, and build-as-c fixes. --- include/c/std/string.h | 24 ++++++++++--- lib/c/freestanding/string.c | 70 +++++++++++++++++++++++++++++-------- utils/buildendian.c | 9 ++--- 3 files changed, 80 insertions(+), 23 deletions(-) diff --git a/include/c/std/string.h b/include/c/std/string.h index e457ed5..5526159 100644 --- a/include/c/std/string.h +++ b/include/c/std/string.h @@ -7,13 +7,29 @@ extern "C" { #endif -void *memcpy(void *dest, const void *src, size_t len); -void *memset(void *block, int count, size_t len); -int memcmp(const void *b1, const void *b2, size_t len); -size_t strlen(const char *s); + void *memcpy(void *dest, const void *src, size_t len); + void *memmove(void *dest, const void *src, size_t len); + int memcmp(const void *b1, const void *b2, size_t len); + void *memset(void *block, int count, size_t len); + size_t strnlen(const char *s, size_t n); + size_t strlen(const char *s); + char *strcpy(char *dest, const char *src); + char *strncpy(char *dest, const char *src, size_t len); + char *strcat(char *dest, const char *src); + char *strncat(char *dest, const char *src, size_t len); + int strcmp(const char *s1, const char *s2); + int strncmp(const char *s1, const char *s2, int n); #ifdef __cplusplus + char *strchr(char *s, int c); } + +static inline const char *strchr(const char *s, int c) +{ + return const_cast(strchr(const_cast(s), c)); +} +#else +char *strchr(const char *s, int c); #endif #endif diff --git a/lib/c/freestanding/string.c b/lib/c/freestanding/string.c index a3bb62e..0241f91 100644 --- a/lib/c/freestanding/string.c +++ b/lib/c/freestanding/string.c @@ -17,10 +17,11 @@ void *memcpy(void *dest, const void *src, size_t len) { - const char *cs = static_cast(src); - char *cd = static_cast(dest); + const char *cs = src; + char *cd = dest; + size_t i; - for (size_t i = 0; i < len; i++) + for (i = 0; i < len; i++) cd[i] = cs[i]; return dest; @@ -28,13 +29,14 @@ void *memcpy(void *dest, const void *src, size_t len) void *memmove(void *dest, const void *src, size_t len) { + const char *cs = src; + char *cd = dest; + size_t i; + if (dest < src) return memcpy(dest, src, len); - const char *cs = static_cast(src); - char *cd = static_cast(dest); - - for (size_t i = len - 1; i >= 0; i--) + for (i = len - 1; i >= 0; i--) cd[i] = cs[i]; return dest; @@ -43,8 +45,8 @@ void *memmove(void *dest, const void *src, size_t len) int memcmp(const void *b1, const void *b2, size_t len) { size_t pos; - const char *c1 = static_cast(b1); - const char *c2 = static_cast(b2); + const char *c1 = b1; + const char *c2 = b2; for (pos = 0; pos < len; pos++) { if (c1[pos] != c2[pos]) @@ -56,19 +58,33 @@ int memcmp(const void *b1, const void *b2, size_t len) return 0; } +void *memset(void *b, int ch, size_t len) +{ + char *c = b; + + while (len--) + *c++ = ch; + + return b; +} + size_t strnlen(const char *s, size_t n) { size_t pos = 0; + while (pos < n && *s++) pos++; + return pos; } size_t strlen(const char *s) { size_t pos = 0; + while (*s++) pos++; + return pos; } @@ -129,12 +145,36 @@ char *strncat(char *dest, const char *src, size_t len) return orig; } -void *memset(void *b, int ch, size_t len) +int strcmp(const char *s1, const char *s2) { - char *c = static_cast(b); - - while (len--) - *c++ = ch; + while (*s1 && *s2 && *s1 == *s2) { + s1++; + s2++; + } - return b; + return *s2 - *s1; +} + +int strncmp(const char *s1, const char *s2, int n) +{ + int i = 0; + + while (i < n && s1[i] && s2[i] && s1[i] == s2[i]) + i++; + + if (i == n) + return 0; + + return *s2 - *s1; +} + +char *strchr(const char *s, int c) +{ + while (*s && *s != c) + s++; + + if (*s == c) + return (char *)s; + + return NULL; } diff --git a/utils/buildendian.c b/utils/buildendian.c index d9b4e6e..f4026ae 100644 --- a/utils/buildendian.c +++ b/utils/buildendian.c @@ -6,13 +6,14 @@ int main(void) union { uint32_t a; uint8_t b[4]; - }; + } u; - a = 0x12345678; + u.a = 0x12345678; - if (b[0] == 0x12 && b[1] == 0x34 && b[2] == 0x56 && b[3] == 0x78) + if (u.b[0] == 0x12 && u.b[1] == 0x34 && u.b[2] == 0x56 && u.b[3] == 0x78) printf("BE"); - else if (b[3] == 0x12 && b[2] == 0x34 && b[1] == 0x56 && b[0] == 0x78) + else if (u.b[3] == 0x12 && u.b[2] == 0x34 && + u.b[1] == 0x56 && u.b[0] == 0x78) printf("LE"); else printf("UNKNOWN"); -- 2.39.2