We didn't handle the case when the length of the input buffer was not
specified correctly and wxConvAuto::DetectBOM() could read beyond the end of
input. Moreover, the unit test actually relied on this as it didn't pass the
correct length for the literal strings with embedded NULs. This somehow worked
with MSVC but failed with MinGW (see #10713).
Correct the code to handle wxNO_LEN case correctly and fix the unit test to
pass the correct lengths.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65739
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
bool wxConvAuto::InitFromInput(const char *src, size_t len)
{
bool wxConvAuto::InitFromInput(const char *src, size_t len)
{
- m_bomType = DetectBOM(src, len);
+ m_bomType = DetectBOM(src, len == wxNO_LEN ? strlen(src) : len);
if ( m_bomType == BOM_Unknown )
return false;
if ( m_bomType == BOM_Unknown )
return false;
// real test function: check that converting the src multibyte string to
// wide char using wxConvAuto yields wch as the first result
// real test function: check that converting the src multibyte string to
// wide char using wxConvAuto yields wch as the first result
- void TestFirstChar(const char *src, wchar_t wch);
+ //
+ // the length of the string may need to be passed explicitly if it has
+ // embedded NULs, otherwise it's not necessary
+ void TestFirstChar(const char *src, wchar_t wch, int len = wxNO_LEN);
void Empty();
void Short();
void Empty();
void Short();
// tests
// ----------------------------------------------------------------------------
// tests
// ----------------------------------------------------------------------------
-void ConvAutoTestCase::TestFirstChar(const char *src, wchar_t wch)
+void ConvAutoTestCase::TestFirstChar(const char *src, wchar_t wch, int len)
- wxWCharBuffer wbuf = wxConvAuto().cMB2WC(src);
+ wxWCharBuffer wbuf = wxConvAuto().cMB2WC(src, len, NULL);
CPPUNIT_ASSERT( wbuf );
CPPUNIT_ASSERT_EQUAL( wch, *wbuf );
}
void ConvAutoTestCase::Empty()
{
CPPUNIT_ASSERT( wbuf );
CPPUNIT_ASSERT_EQUAL( wch, *wbuf );
}
void ConvAutoTestCase::Empty()
{
- TestFirstChar("", wxT('\0'));
+ CPPUNIT_ASSERT( !wxConvAuto().cMB2WC("") );
}
void ConvAutoTestCase::Short()
}
void ConvAutoTestCase::Short()
void ConvAutoTestCase::UTF32LE()
{
void ConvAutoTestCase::UTF32LE()
{
- TestFirstChar("\xff\xfe\0\0A\0\0\0", wxT('A'));
+ TestFirstChar("\xff\xfe\0\0A\0\0\0", wxT('A'), 8);
}
void ConvAutoTestCase::UTF32BE()
{
}
void ConvAutoTestCase::UTF32BE()
{
- TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B'));
+ TestFirstChar("\0\0\xfe\xff\0\0\0B", wxT('B'), 8);
}
void ConvAutoTestCase::UTF16LE()
{
}
void ConvAutoTestCase::UTF16LE()
{
- TestFirstChar("\xff\xfeZ\0", wxT('Z'));
+ TestFirstChar("\xff\xfeZ\0", wxT('Z'), 4);
}
void ConvAutoTestCase::UTF16BE()
{
}
void ConvAutoTestCase::UTF16BE()
{
- TestFirstChar("\xfe\xff\0Y", wxT('Y'));
+ TestFirstChar("\xfe\xff\0Y", wxT('Y'), 4);
}
void ConvAutoTestCase::UTF8()
}
void ConvAutoTestCase::UTF8()