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:
Vadim Zeitlin
2010-01-24 10:13:33 +00:00
parent 8e7262fca7
commit 32dd8aa22b

View File

@@ -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();