@@ -154,3 +154,43 @@ TEST_F(LlvmLibcWcsnrtombs, ErrnoTest) {
154154 static_cast <size_t >(-1 ));
155155 ASSERT_ERRNO_EQ (EILSEQ);
156156}
157+
158+ TEST_F (LlvmLibcWcsnrtombs, NullState) {
159+ // this test is the same as DestLimit except it uses a nullptr mbstate*
160+
161+ // / clown emoji, sigma symbol, y with diaeresis, letter A
162+ const wchar_t src[] = {static_cast <wchar_t >(0x1f921 ),
163+ static_cast <wchar_t >(0x2211 ),
164+ static_cast <wchar_t >(0xff ), static_cast <wchar_t >(0x41 ),
165+ static_cast <wchar_t >(0x0 )};
166+ const wchar_t *cur = src;
167+
168+ char mbs[11 ];
169+ for (int i = 0 ; i < 11 ; ++i)
170+ mbs[i] = ' \x01 ' ; // dummy initial values
171+
172+ ASSERT_EQ (LIBC_NAMESPACE::wcsnrtombs (mbs, &cur, 5 , 4 , nullptr ),
173+ static_cast <size_t >(4 ));
174+ ASSERT_ERRNO_SUCCESS ();
175+ ASSERT_EQ (cur, src + 1 );
176+ ASSERT_EQ (mbs[0 ], ' \xF0 ' );
177+ ASSERT_EQ (mbs[1 ], ' \x9F ' );
178+ ASSERT_EQ (mbs[2 ], ' \xA4 ' );
179+ ASSERT_EQ (mbs[3 ], ' \xA1 ' );
180+ ASSERT_EQ (mbs[4 ], ' \x01 ' ); // didn't write more than 4 bytes
181+
182+ for (int i = 0 ; i < 11 ; ++i)
183+ mbs[i] = ' \x01 ' ; // dummy initial values
184+
185+ // not enough bytes to convert the second character, so only converts one
186+ cur = src;
187+ ASSERT_EQ (LIBC_NAMESPACE::wcsnrtombs (mbs, &cur, 5 , 6 , nullptr ),
188+ static_cast <size_t >(4 ));
189+ ASSERT_ERRNO_SUCCESS ();
190+ ASSERT_EQ (cur, src + 1 );
191+ ASSERT_EQ (mbs[0 ], ' \xF0 ' );
192+ ASSERT_EQ (mbs[1 ], ' \x9F ' );
193+ ASSERT_EQ (mbs[2 ], ' \xA4 ' );
194+ ASSERT_EQ (mbs[3 ], ' \xA1 ' );
195+ ASSERT_EQ (mbs[4 ], ' \x01 ' );
196+ }
0 commit comments