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)
|
if(m_input.LastRead() <= 0)
|
||||||
return wxEOT;
|
return wxEOT;
|
||||||
|
|
||||||
if ( m_conv->ToWChar(wbuf, WXSIZEOF(wbuf), m_lastBytes, inlen + 1)
|
switch ( m_conv->ToWChar(wbuf, WXSIZEOF(wbuf), m_lastBytes, inlen + 1) )
|
||||||
== 1 )
|
{
|
||||||
return wbuf[0];
|
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;
|
return wxEOT;
|
||||||
#else
|
#else
|
||||||
m_lastBytes[0] = m_input.GetC();
|
m_lastBytes[0] = m_input.GetC();
|
||||||
|
Reference in New Issue
Block a user