Check the result of ToWChar() call in wxTextInputStream::NextChar() better.
The logic in this function depends on ToWChar() working correctly so check that it doesn't return obviously wrong results, e.g. 0 output length for non-empty input. This was mostly done to detect the problem in wxConvAuto currently but it could also be useful with user-defined conversions and shouldn't have a big performance effect on wxTextInputStream so leave these checks in to facilitate debugging in the future. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63244 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -75,11 +75,35 @@ wxChar wxTextInputStream::NextChar()
|
||||
if(m_input.LastRead() <= 0)
|
||||
return wxEOT;
|
||||
|
||||
if ( m_conv->ToWChar(wbuf, WXSIZEOF(wbuf), m_lastBytes, inlen + 1)
|
||||
== 1 )
|
||||
return wbuf[0];
|
||||
switch ( m_conv->ToWChar(wbuf, WXSIZEOF(wbuf), m_lastBytes, inlen + 1) )
|
||||
{
|
||||
case 0:
|
||||
// this is a bug in converter object as it should either fail
|
||||
// or decode non-empty string to something non-empty
|
||||
wxFAIL_MSG("ToWChar() can't return 0 for non-empty input");
|
||||
break;
|
||||
|
||||
case wxCONV_FAILED:
|
||||
// the buffer probably doesn't contain enough bytes to decode
|
||||
// as a complete character, try with more bytes
|
||||
break;
|
||||
|
||||
default:
|
||||
// if we couldn't decode a single character during the last
|
||||
// loop iteration we shouldn't be able to decode 2 or more of
|
||||
// them with an extra single byte, something fishy is going on
|
||||
wxFAIL_MSG("unexpected decoding result");
|
||||
// fall through nevertheless and return at least something
|
||||
|
||||
case 1:
|
||||
// we finally decoded a character
|
||||
return wbuf[0];
|
||||
}
|
||||
}
|
||||
// there should be no encoding which requires more than nine bytes for one character...
|
||||
|
||||
// there should be no encoding which requires more than nine bytes for one
|
||||
// character so something must be wrong with our conversion but we have no
|
||||
// way to signal it from here
|
||||
return wxEOT;
|
||||
#else
|
||||
m_lastBytes[0] = m_input.GetC();
|
||||
|
Reference in New Issue
Block a user