diff options
Diffstat (limited to 'libk/src/string.c')
-rw-r--r-- | libk/src/string.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/libk/src/string.c b/libk/src/string.c new file mode 100644 index 0000000..6dfa683 --- /dev/null +++ b/libk/src/string.c @@ -0,0 +1,61 @@ +#include <stddef.h> +#include <stdint.h> +#include <string.h> + +int memcmp(const void *vl, const void *vr, size_t n) { + const unsigned char *l = vl, *r = vr; + for (; n && *l == *r; n--, l++, r++); + return n ? *l-*r : 0; +} + +void *memcpy(void *restrict dest, const void *restrict src, size_t n) { + char *d = dest; + const char *s = src; + for (; n; n--) *d++ = *s++; + return dest; +} + +void *memmove(void *dest, const void *src, size_t n) { + char *d = dest; + const char *s = src; + + if (d==s) return d; + + if (d<s) { + for (; n; n--) *d++ = *s++; + } else { + while (n) n--, d[n] = s[n]; + } + + return dest; +} + +void *memset(void *dest, int c, size_t n) { + unsigned char *d = dest; + for (; n; n--) *d++ = c; + return dest; +} + +char *strcpy(char *restrict dest, const char *restrict src) { + for(; (*dest = *src); dest++, src++); + return dest; +} + +char *strncpy(char *restrict dest, const char *restrict src, size_t n) { + for(; (*dest = *src) && n; dest++, src++, n--); + memset(dest, 0, n); + return dest; +} + +size_t strlen(const char *s) { + size_t len = 0; + for(; *s; s++, len++); + return len; +} + +int strncmp(const char* lhs, const char* rhs, size_t n) { + const unsigned char *l=(void *)lhs, *r=(void *)rhs; + if (!n--) return 0; + for (; *l && *r && n && *l == *r ; l++, r++, n--); + return *l - *r; +} |