Sfoglia il codice sorgente

LibC: Implement mbrlen

Tim Schumacher 3 anni fa
parent
commit
e618602433
2 ha cambiato i file con 42 aggiunte e 3 eliminazioni
  1. 35 0
      Tests/LibC/TestWchar.cpp
  2. 7 3
      Userland/Libraries/LibC/wchar.cpp

+ 35 - 0
Tests/LibC/TestWchar.cpp

@@ -439,3 +439,38 @@ TEST_CASE(wcslcpy)
     ret = wcslcpy(nullptr, L"abc", 0);
     EXPECT_EQ(ret, 3ul);
 }
+
+TEST_CASE(mbrlen)
+{
+    size_t ret = 0;
+    mbstate_t state = {};
+
+    // Ensure that we can parse normal ASCII characters.
+    ret = mbrlen("Hello", 5, &state);
+    EXPECT_EQ(ret, 1ul);
+
+    // Try two three-byte codepoints (™™), only one of which should be consumed.
+    ret = mbrlen("\xe2\x84\xa2\xe2\x84\xa2", 6, &state);
+    EXPECT_EQ(ret, 3ul);
+
+    // Try a null character, which should return 0 and reset the state to the initial state.
+    ret = mbrlen("\x00\x00", 2, &state);
+    EXPECT_EQ(ret, 0ul);
+    EXPECT_NE(mbsinit(&state), 0);
+
+    // Try an incomplete multibyte character.
+    ret = mbrlen("\xe2\x84", 2, &state);
+    EXPECT_EQ(ret, -2ul);
+    EXPECT_EQ(mbsinit(&state), 0);
+
+    // Finish the previous multibyte character.
+    ret = mbrlen("\xa2", 1, &state);
+    EXPECT_EQ(ret, 1ul);
+
+    // Try an invalid multibyte sequence.
+    // Reset the state afterwards because the effects are undefined.
+    ret = mbrlen("\xff", 1, &state);
+    EXPECT_EQ(ret, -1ul);
+    EXPECT_EQ(errno, EILSEQ);
+    state = {};
+}

+ 7 - 3
Userland/Libraries/LibC/wchar.cpp

@@ -300,10 +300,14 @@ size_t mbrtowc(wchar_t* pwc, const char* s, size_t n, mbstate_t* state)
     return consumed_bytes;
 }
 
-size_t mbrlen(const char*, size_t, mbstate_t*)
+size_t mbrlen(const char* s, size_t n, mbstate_t* ps)
 {
-    dbgln("FIXME: Implement mbrlen()");
-    TODO();
+    static mbstate_t anonymous_state = {};
+
+    if (ps == nullptr)
+        ps = &anonymous_state;
+
+    return mbrtowc(nullptr, s, n, ps);
 }
 
 size_t wcrtomb(char* s, wchar_t wc, mbstate_t*)