summaryrefslogtreecommitdiff
path: root/libk/src/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'libk/src/string.c')
-rw-r--r--libk/src/string.c61
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;
+}