git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47555
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
m_linesTail = NULL;
// read the entire stream contents in memory
m_linesTail = NULL;
// read the entire stream contents in memory
- wxString str;
- {
- static const size_t chunkLen = 1024;
+ wxWxCharBuffer cbuf;
+ static const size_t chunkLen = 1024;
- wxMemoryBuffer buf(chunkLen);
- do
- {
- inStream.Read(buf.GetAppendBuf(chunkLen), chunkLen);
- buf.UngetAppendBuf(inStream.LastRead());
+ wxMemoryBuffer buf(chunkLen);
+ do
+ {
+ inStream.Read(buf.GetAppendBuf(chunkLen), chunkLen);
+ buf.UngetAppendBuf(inStream.LastRead());
- const wxStreamError err = inStream.GetLastError();
+ const wxStreamError err = inStream.GetLastError();
- if ( err != wxSTREAM_NO_ERROR && err != wxSTREAM_EOF )
- {
- wxLogError(_("Error reading config options."));
- break;
- }
+ if ( err != wxSTREAM_NO_ERROR && err != wxSTREAM_EOF )
+ {
+ wxLogError(_("Error reading config options."));
+ break;
- while ( !inStream.Eof() );
+ }
+ while ( !inStream.Eof() );
- size_t len;
- str = conv.cMB2WC((char *)buf.GetData(), buf.GetDataLen(), &len);
- if ( !len && buf.GetDataLen() )
- {
- wxLogError(_("Failed to read config options."));
- }
+ size_t len;
+ cbuf = conv.cMB2WC((char *)buf.GetData(), buf.GetDataLen(), &len);
+ if ( !len && buf.GetDataLen() )
+ {
+ wxLogError(_("Failed to read config options."));
+ }
- // no need for conversion
- str.assign((char *)buf.GetData(), buf.GetDataLen());
+ // no need for conversion
+ cbuf = wxCharBuffer::CreateNonOwned((char *)buf.GetData());
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
- // translate everything to the current (platform-dependent) line
- // termination character
- str = wxTextBuffer::Translate(str);
-
+ // now break it into lines
-
- // Now we can add the text to the memory text. To do this we extract line
- // by line from the translated string, until we've reached the end.
- //
- // VZ: all this is horribly inefficient, we should do the translation on
- // the fly in one pass saving both memory and time (TODO)
-
- const wxChar *pEOL = wxTextBuffer::GetEOL(wxTextBuffer::typeDefault);
- const size_t EOLLen = wxStrlen(pEOL);
-
- int posLineStart = str.Find(pEOL);
- while ( posLineStart != -1 )
+ for ( const wxChar *s = cbuf; ; ++s )
- wxString line(str.Left(posLineStart));
+ const wxChar *e = s;
+ while ( *e != '\0' && *e != '\n' && *e != '\r' )
+ ++e;
+ // notice that we throw away the original EOL kind here, maybe we
+ // should preserve it?
+ memText.AddLine(wxString(s, e));
- str = str.Mid(posLineStart + EOLLen);
+ if ( *e == '\0' )
+ break;
- posLineStart = str.Find(pEOL);
- }
+ // skip the second EOL byte if it's a DOS one
+ if ( *e == '\r' && e[1] == '\n' )
+ ++e;
- // also add whatever we have left in the translated string.
- if ( !str.empty() )
- memText.AddLine(str);
// Finally we can parse it all.
Parse(memText, true /* local */);
// Finally we can parse it all.
Parse(memText, true /* local */);