From 36a486cca6c25a4d5e9b201c0802c18bcb1e0655 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Wed, 1 Apr 2026 18:47:59 +0100 Subject: [PATCH] libc: core: implement memcmp and memmove --- lib/libc/core/string/memcmp.c | 9 +++++++++ lib/libc/core/string/memmove.c | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 lib/libc/core/string/memcmp.c create mode 100644 lib/libc/core/string/memmove.c diff --git a/lib/libc/core/string/memcmp.c b/lib/libc/core/string/memcmp.c new file mode 100644 index 0000000..9b65f92 --- /dev/null +++ b/lib/libc/core/string/memcmp.c @@ -0,0 +1,9 @@ +#include + +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; +} diff --git a/lib/libc/core/string/memmove.c b/lib/libc/core/string/memmove.c new file mode 100644 index 0000000..28b1aa2 --- /dev/null +++ b/lib/libc/core/string/memmove.c @@ -0,0 +1,24 @@ +#include +#include + +static void *memcpy_r(void *dest, const void *src, size_t sz) +{ + unsigned char *d = dest; + const unsigned char *s = src; + + for (size_t i = 0; i < sz; i++) { + size_t b = sz - i - 1; + d[b] = s[b]; + } + + return dest; +} + +void *memmove(void *dest, const void *src, size_t n) +{ + if (dest < src) { + return memcpy(dest, src, n); + } else { + return memcpy_r(dest, src, n); + } +}