diff options
Diffstat (limited to 'libs/kstd/src/libc')
| -rw-r--r-- | libs/kstd/src/libc/stdlib.cpp | 36 | ||||
| -rw-r--r-- | libs/kstd/src/libc/string.cpp | 116 |
2 files changed, 82 insertions, 70 deletions
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 |
