X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca8cf4fffbe8e6671dd96927cd06ec11513b4173..08670ea85abf4b4946a9ce64971b591d7b1ee30b:/src/common/txtstrm.cpp diff --git a/src/common/txtstrm.cpp b/src/common/txtstrm.cpp index f7d6c09efd..9408345960 100644 --- a/src/common/txtstrm.cpp +++ b/src/common/txtstrm.cpp @@ -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) - != wxCONV_FAILED ) - 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(); @@ -125,7 +149,7 @@ bool wxTextInputStream::EatEOL(const wxChar &c) wxUint32 wxTextInputStream::Read32(int base) { - wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); + wxASSERT_MSG( !base || (base > 1 && base <= 36), wxT("invalid base") ); if(!m_input) return 0; wxString word = ReadWord(); @@ -146,7 +170,7 @@ wxUint8 wxTextInputStream::Read8(int base) wxInt32 wxTextInputStream::Read32S(int base) { - wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); + wxASSERT_MSG( !base || (base > 1 && base <= 36), wxT("invalid base") ); if(!m_input) return 0; wxString word = ReadWord(); @@ -387,15 +411,15 @@ void wxTextOutputStream::WriteString(const wxString& string) switch ( m_mode ) { case wxEOL_DOS: - out << _T("\r\n"); + out << wxT("\r\n"); continue; case wxEOL_MAC: - out << _T('\r'); + out << wxT('\r'); continue; default: - wxFAIL_MSG( _T("unknown EOL mode in wxTextOutputStream") ); + wxFAIL_MSG( wxT("unknown EOL mode in wxTextOutputStream") ); // fall through case wxEOL_UNIX: