From 05b283f552bb6a47894c120e45235da417e3cb74 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Wed, 22 Sep 2021 10:24:12 +0000 Subject: [PATCH] LibC: Implement wmemmove --- Tests/LibC/TestWchar.cpp | 26 ++++++++++++++++++++++++++ Userland/Libraries/LibC/wchar.cpp | 15 +++++++++++++++ Userland/Libraries/LibC/wchar.h | 1 + 3 files changed, 42 insertions(+) diff --git a/Tests/LibC/TestWchar.cpp b/Tests/LibC/TestWchar.cpp index 770a4da82c..1a165f8c08 100644 --- a/Tests/LibC/TestWchar.cpp +++ b/Tests/LibC/TestWchar.cpp @@ -137,6 +137,32 @@ TEST_CASE(wmemset) free(buf); } +TEST_CASE(wmemmove) +{ + wchar_t* ret; + const wchar_t* string = L"abc\0def"; + auto buf = static_cast(calloc(32, sizeof(wchar_t))); + + if (!buf) { + FAIL("Could not allocate memory for target buffer"); + return; + } + + // Test moving to smaller addresses. + wmemcpy(buf + 3, string, 8); + ret = wmemmove(buf + 1, buf + 3, 8); + EXPECT_EQ(ret, buf + 1); + EXPECT_EQ(memcmp(string, buf + 1, 8 * sizeof(wchar_t)), 0); + + // Test moving to larger addresses. + wmemcpy(buf + 16, string, 8); + ret = wmemmove(buf + 18, buf + 16, 8); + EXPECT_EQ(ret, buf + 18); + EXPECT_EQ(memcmp(string, buf + 18, 8 * sizeof(wchar_t)), 0); + + free(buf); +} + TEST_CASE(wcscoll) { // Check if wcscoll is sorting correctly. At the moment we are doing raw char comparisons, diff --git a/Userland/Libraries/LibC/wchar.cpp b/Userland/Libraries/LibC/wchar.cpp index 13208004c2..4bdc43545a 100644 --- a/Userland/Libraries/LibC/wchar.cpp +++ b/Userland/Libraries/LibC/wchar.cpp @@ -402,4 +402,19 @@ wchar_t* wmemset(wchar_t* wcs, wchar_t wc, size_t n) return wcs; } + +wchar_t* wmemmove(wchar_t* dest, const wchar_t* src, size_t n) +{ + if (dest > src) { + for (size_t i = 1; i <= n; i++) { + dest[n - i] = src[n - i]; + } + } else if (dest < src) { + for (size_t i = 0; i < n; i++) { + dest[i] = src[i]; + } + } + + return dest; +} } diff --git a/Userland/Libraries/LibC/wchar.h b/Userland/Libraries/LibC/wchar.h index 7f731ad38b..8eea8e919e 100644 --- a/Userland/Libraries/LibC/wchar.h +++ b/Userland/Libraries/LibC/wchar.h @@ -46,5 +46,6 @@ wchar_t* wcsstr(const wchar_t*, const wchar_t*); wchar_t* wmemchr(const wchar_t*, wchar_t, size_t); wchar_t* wmemcpy(wchar_t*, const wchar_t*, size_t); wchar_t* wmemset(wchar_t*, wchar_t, size_t); +wchar_t* wmemmove(wchar_t*, const wchar_t*, size_t); __END_DECLS