diff options
Diffstat (limited to 'libk/string/memory.cc')
-rw-r--r-- | libk/string/memory.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libk/string/memory.cc b/libk/string/memory.cc new file mode 100644 index 0000000..5b8a1f8 --- /dev/null +++ b/libk/string/memory.cc @@ -0,0 +1,37 @@ +#include <types.h> + +extern "C" void* memcpy(void* dstptr, const void* srcptr, const size_t n) { + auto* dst = static_cast<uint8_t*>(dstptr); + const auto* src = static_cast<const uint8_t*>(srcptr); + for (size_t i = 0; i < n; ++i) dst[i] = src[i]; + return dstptr; +} + +extern "C" void* memset(void* bufptr, const int value, const size_t n) { + auto* buf = static_cast<uint8_t*>(bufptr); + for (size_t i = 0; i < n; ++i) buf[i] = static_cast<uint8_t>(value); + return bufptr; +} + +extern "C" void* memmove(void* dstptr, const void* srcptr, const size_t n) { + auto* dst = static_cast<uint8_t*>(dstptr); + const auto* src = static_cast<const uint8_t*>(srcptr); + if (dst < src) { + for (size_t i = 0; i < n; ++i) dst[i] = src[i]; + } else { + for (size_t i = n; i != 0; i--) dst[i - 1] = src[i - 1]; + } + return dstptr; +} + +extern "C" int memcmp(const void* aptr, const void* bptr, const size_t n) { + const auto* a = static_cast<const uint8_t*>(aptr); + const auto* b = static_cast<const uint8_t*>(bptr); + for (size_t i = 0; i < n; ++i) { + if (a[i] < b[i]) + return -1; + else if (b[i] < a[i]) + return 1; + } + return 0; +} |