From 4725538aa77b6eef14764951a090af56a53f0f4e Mon Sep 17 00:00:00 2001 From: apio Date: Sat, 22 Oct 2022 19:04:19 +0200 Subject: [PATCH] Tests: Add tests for memmove and memcmp + correct our memcmp implementation --- libs/libc/src/string.cpp | 14 +++++----- tests/libc/Test.c | 4 +++ tests/libc/string.c | 56 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/libs/libc/src/string.cpp b/libs/libc/src/string.cpp index 265f0c73..f07ff7b5 100644 --- a/libs/libc/src/string.cpp +++ b/libs/libc/src/string.cpp @@ -27,13 +27,15 @@ extern "C" int memcmp(const void* a, const void* b, size_t n) { - const char* _a = (const char*)a; - const char* _b = (const char*)b; - for (; n && _a == _b; n--, _a++, _b++) - ; if (!n) return 0; - if (*_a > *_b) return 1; - return -1; + const unsigned char* ap = (const unsigned char*)a; + const unsigned char* bp = (const unsigned char*)b; + while (--n && *ap == *bp) + { + ap++; + bp++; + } + return *ap - *bp; } void* memmove(void* dest, const void* src, size_t n) diff --git a/tests/libc/Test.c b/tests/libc/Test.c index f37459b8..797a788d 100644 --- a/tests/libc/Test.c +++ b/tests/libc/Test.c @@ -4,6 +4,8 @@ DEFINE_TEST(memset); DEFINE_TEST(memcpy); DEFINE_TEST(memchr); +DEFINE_TEST(memcmp); +DEFINE_TEST(memmove); DEFINE_TEST(strlen); DEFINE_TEST(strnlen); DEFINE_TEST(strcspn); @@ -26,6 +28,8 @@ int main() RUN_TEST(memset); RUN_TEST(memcpy); RUN_TEST(memchr); + RUN_TEST(memcmp); + RUN_TEST(memmove); RUN_TEST(strlen); RUN_TEST(strnlen); RUN_TEST(strcspn); diff --git a/tests/libc/string.c b/tests/libc/string.c index 542b401a..004644e8 100644 --- a/tests/libc/string.c +++ b/tests/libc/string.c @@ -67,6 +67,62 @@ DEFINE_TEST(memchr) TEST_SUCCESS(); } +DEFINE_TEST(memcmp) +{ + START_TEST(memcmp); + + char buf[20] = "abcdefghijklmnopqrs"; + char buf2[20] = "abcdefghijklmnopqrp"; + + int val = memcmp(buf, buf, 20); + + EXPECT_EQ(val, 0); + + val = memcmp(buf, buf2, 20); + + EXPECT(val > 0); + + val = memcmp(buf2, buf, 20); + + EXPECT(val < 0); + + TEST_SUCCESS(); +} + +DEFINE_TEST(memmove) +{ + START_TEST(memmove); + + char buf[20] = "Nothing is going on"; + const char* str = "Something is going!"; + + char* ptr = memmove(buf, str, 20); + + EXPECT_EQ(ptr, buf); + + for (int i = 0; i < 20; i++) { EXPECT_EQ(buf[i], str[i]); } + + const char* new = "Well..."; + + ptr = memmove(buf, new, 7); + + EXPECT_EQ(ptr, buf); + + for (int i = 0; i < 7; i++) { EXPECT_EQ(buf[i], new[i]); } + for (int i = 7; i < 20; i++) { EXPECT_EQ(buf[i], str[i]); } + + char newbuf[16] = "part_a is part_b"; + char result[16] = "is part_b part_b"; + + ptr = memmove(newbuf, newbuf + 7, 9); + + EXPECT_EQ(ptr, newbuf); + + EXPECT(memcmp(newbuf, result, 16) == 0); // we have tested memcmp at this point + + TEST_SUCCESS(); +} + DEFINE_TEST(strlen) { START_TEST(strlen);