aboutsummaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-03-02 23:43:09 +0100
committerLukas Oesch <lukasoesch20@gmail.com>2026-03-17 16:42:27 +0100
commit62bf2eef72854750c7325d2e2c6e92562a522e16 (patch)
treef874aaba208e7617ec1b46c1033f75184597c42b /libs
parent760f6ca4d59f6bf90f70944df4f418c236f8eab1 (diff)
downloadteachos-62bf2eef72854750c7325d2e2c6e92562a522e16.tar.xz
teachos-62bf2eef72854750c7325d2e2c6e92562a522e16.zip
implement memcpy
Diffstat (limited to 'libs')
-rw-r--r--libs/kstd/CMakeLists.txt2
-rw-r--r--libs/kstd/include/kstd/cstring19
-rw-r--r--libs/kstd/src/libc/stdlib.cpp36
-rw-r--r--libs/kstd/src/libc/string.cpp116
4 files changed, 103 insertions, 70 deletions
diff --git a/libs/kstd/CMakeLists.txt b/libs/kstd/CMakeLists.txt
index 1f140f6..77b12a9 100644
--- a/libs/kstd/CMakeLists.txt
+++ b/libs/kstd/CMakeLists.txt
@@ -5,6 +5,7 @@ set(KSTD_LIBC_SYMBOLS
"abort"
"strlen"
"memcmp"
+ "memcpy"
)
target_sources("kstd" PRIVATE
@@ -33,6 +34,7 @@ target_sources("kstd" PUBLIC
"include/kstd/os/print.hpp"
"include/kstd/asm_ptr"
+ "include/kstd/cstring"
"include/kstd/format"
"include/kstd/memory"
"include/kstd/mutex"
diff --git a/libs/kstd/include/kstd/cstring b/libs/kstd/include/kstd/cstring
new file mode 100644
index 0000000..e97ecac
--- /dev/null
+++ b/libs/kstd/include/kstd/cstring
@@ -0,0 +1,19 @@
+#ifndef KSTD_CSTRING
+#define KSTD_CSTRING
+
+#include <cstddef>
+
+namespace kstd::libc
+{
+
+ extern "C"
+ {
+ auto memcpy(void * dest, void const * src, std::size_t size) -> void *;
+ auto memmove(void * dest, void const * src, std::size_t size) -> void *;
+ auto memcmp(void const * lhs, void const * rhs, std::size_t size) -> std::size_t;
+ auto strlen(char const * string) -> std::size_t;
+ }
+
+} // namespace kstd::libc
+
+#endif \ No newline at end of file
diff --git a/libs/kstd/src/libc/stdlib.cpp b/libs/kstd/src/libc/stdlib.cpp
index 4a5c91f..bb40605 100644
--- a/libs/kstd/src/libc/stdlib.cpp
+++ b/libs/kstd/src/libc/stdlib.cpp
@@ -1,19 +1,19 @@
-#include "kstd/os/error.hpp"
-
-namespace kstd::libc
-{
-
- extern "C"
- {
- [[noreturn]] auto abort() -> void
- {
- kstd::os::abort();
- }
-
- [[noreturn, gnu::weak]] auto free(void *) -> void
- {
- kstd::os::panic("Tried to call free.");
- }
- }
-
+#include "kstd/os/error.hpp"
+
+namespace kstd::libc
+{
+
+ extern "C"
+ {
+ [[noreturn]] auto abort() -> void
+ {
+ kstd::os::abort();
+ }
+
+ [[noreturn, gnu::weak]] auto free(void *) -> void
+ {
+ kstd::os::panic("Tried to call free.");
+ }
+ }
+
} // namespace kstd::libc \ No newline at end of file
diff --git a/libs/kstd/src/libc/string.cpp b/libs/kstd/src/libc/string.cpp
index b7d4c6b..4e264f9 100644
--- a/libs/kstd/src/libc/string.cpp
+++ b/libs/kstd/src/libc/string.cpp
@@ -1,53 +1,65 @@
-#include <algorithm>
-#include <bit>
-#include <cstddef>
-#include <iterator>
-#include <span>
-
-namespace kstd::libc
-{
-
- extern "C"
- {
- auto strlen(char const * string) -> std::size_t
- {
- return std::distance(string, std::ranges::find(string, nullptr, '\0'));
- }
-
- auto memcmp(void const * lhs, void const * rhs, std::size_t size) -> std::size_t
- {
- auto left_span = std::span{static_cast<std::byte const *>(lhs), size};
- auto right_span = std::span{static_cast<std::byte const *>(rhs), size};
- auto mismatched = std::ranges::mismatch(left_span, right_span);
-
- if (mismatched.in1 == left_span.end())
- {
- return 0;
- }
-
- 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;
- }
- }
-
+#include <kstd/cstring>
+
+#include <algorithm>
+#include <bit>
+#include <cstddef>
+#include <iterator>
+#include <span>
+
+namespace kstd::libc
+{
+
+ auto memcpy(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};
+
+ for (std::size_t i = 0; i < size; ++i)
+ {
+ dest_span[i] = src_span[i];
+ }
+
+ return dest;
+ }
+
+ auto strlen(char const * string) -> std::size_t
+ {
+ return std::distance(string, std::ranges::find(string, nullptr, '\0'));
+ }
+
+ auto memcmp(void const * lhs, void const * rhs, std::size_t size) -> std::size_t
+ {
+ auto left_span = std::span{static_cast<std::byte const *>(lhs), size};
+ auto right_span = std::span{static_cast<std::byte const *>(rhs), size};
+ auto mismatched = std::ranges::mismatch(left_span, right_span);
+
+ if (mismatched.in1 == left_span.end())
+ {
+ return 0;
+ }
+
+ 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