فهرست منبع

LibC: Implement wcsstr

Tim Schumacher 3 سال پیش
والد
کامیت
5ac2e84264
3فایلهای تغییر یافته به همراه51 افزوده شده و 0 حذف شده
  1. 30 0
      Tests/LibC/TestWchar.cpp
  2. 20 0
      Userland/Libraries/LibC/wchar.cpp
  3. 1 0
      Userland/Libraries/LibC/wchar.h

+ 30 - 0
Tests/LibC/TestWchar.cpp

@@ -35,6 +35,36 @@ TEST_CASE(wcspbrk)
     EXPECT_EQ(ret, input + 2);
 }
 
+TEST_CASE(wcsstr)
+{
+    const wchar_t* input = L"abcde";
+    wchar_t* ret;
+
+    // Empty needle should return haystack.
+    ret = wcsstr(input, L"");
+    EXPECT_EQ(ret, input);
+
+    // Test exact match.
+    ret = wcsstr(input, input);
+    EXPECT_EQ(ret, input);
+
+    // Test match at string start.
+    ret = wcsstr(input, L"ab");
+    EXPECT_EQ(ret, input);
+
+    // Test match at string end.
+    ret = wcsstr(input, L"de");
+    EXPECT_EQ(ret, input + 3);
+
+    // Test no match.
+    ret = wcsstr(input, L"z");
+    EXPECT_EQ(ret, nullptr);
+
+    // Test needle that is longer than the haystack.
+    ret = wcsstr(input, L"abcdef");
+    EXPECT_EQ(ret, nullptr);
+}
+
 TEST_CASE(wcscoll)
 {
     // Check if wcscoll is sorting correctly. At the moment we are doing raw char comparisons,

+ 20 - 0
Userland/Libraries/LibC/wchar.cpp

@@ -355,4 +355,24 @@ wchar_t* wcspbrk(const wchar_t* wcs, const wchar_t* accept)
 
     return nullptr;
 }
+
+wchar_t* wcsstr(const wchar_t* haystack, const wchar_t* needle)
+{
+    size_t nlen = wcslen(needle);
+
+    if (nlen == 0)
+        return const_cast<wchar_t*>(haystack);
+
+    size_t hlen = wcslen(haystack);
+
+    while (hlen >= nlen) {
+        if (wcsncmp(haystack, needle, nlen) == 0)
+            return const_cast<wchar_t*>(haystack);
+
+        haystack++;
+        hlen--;
+    }
+
+    return nullptr;
+}
 }

+ 1 - 0
Userland/Libraries/LibC/wchar.h

@@ -42,5 +42,6 @@ int wcscoll(const wchar_t*, const wchar_t*);
 int wctob(wint_t);
 int mbsinit(const mbstate_t*);
 wchar_t* wcspbrk(const wchar_t*, const wchar_t*);
+wchar_t* wcsstr(const wchar_t*, const wchar_t*);
 
 __END_DECLS