aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-12-23 20:00:46 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-12-23 20:00:46 +0100
commit57ab6985b524ee5d45cd2471fa3af0917d93da34 (patch)
tree7384cd2f9a678e5ddea721a4ce81426f1ee50124
parentd8f1841846b015fdbee8921ea0378ef455c1a4bd (diff)
downloadteachos-57ab6985b524ee5d45cd2471fa3af0917d93da34.tar.xz
teachos-57ab6985b524ee5d45cd2471fa3af0917d93da34.zip
kstd/libc: implement basic memmove
-rw-r--r--libs/kstd/src/libc/string.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/libs/kstd/src/libc/string.cpp b/libs/kstd/src/libc/string.cpp
index 319f6fd..b7d4c6b 100644
--- a/libs/kstd/src/libc/string.cpp
+++ b/libs/kstd/src/libc/string.cpp
@@ -27,6 +27,27 @@ namespace kstd::libc
return std::bit_cast<char>(*mismatched.in1) - std::bit_cast<char>(*mismatched.in2);
}
+
+ auto memmove(void * dest, void const * src, std::size_t size) -> void *
+ {
+ auto dest_span = std::span{static_cast<std::byte *>(dest), size};
+ auto src_span = std::span{static_cast<std::byte const *>(src), size};
+ if (dest < src)
+ {
+ for (std::size_t i = 0; i < size; ++i)
+ {
+ dest_span[i] = src_span[i];
+ }
+ }
+ else
+ {
+ for (std::size_t i = size; i > 0; --i)
+ {
+ dest_span[i - 1] = src_span[i - 1];
+ }
+ }
+ return dest;
+ }
}
} // namespace kstd::libc \ No newline at end of file