X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=lib%2Fc%2Ffreestanding%2Fstring.c;h=0241f91b5c10176ef2fb8f54fc3b179e16717699;hp=a3bb62e63384a328bf5453fc41a5f1bb87c6275c;hb=28d0cc04e24ba27bfcfa1aabae10b5d409f05a14;hpb=92222712a7b6e2a83646724bfb1f1ccf38abff63 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; }