aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd/src/libc/string.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/kstd/src/libc/string.cpp')
-rw-r--r--libs/kstd/src/libc/string.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/libs/kstd/src/libc/string.cpp b/libs/kstd/src/libc/string.cpp
new file mode 100644
index 0000000..319f6fd
--- /dev/null
+++ b/libs/kstd/src/libc/string.cpp
@@ -0,0 +1,32 @@
+#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);
+ }
+ }
+
+} // namespace kstd::libc \ No newline at end of file