X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dbcf443c7d19d415c23678c16d3da5cd8fbb151d..0b1cc7bffb94ebfb4bc988b9a7320b96ea0cfcda:/src/common/textfile.cpp?ds=sidebyside diff --git a/src/common/textfile.cpp b/src/common/textfile.cpp index c48a48d2ab..f61220dc06 100644 --- a/src/common/textfile.cpp +++ b/src/common/textfile.cpp @@ -86,7 +86,7 @@ bool wxTextFile::OnClose() } -bool wxTextFile::OnRead(wxMBConv& conv) +bool wxTextFile::OnRead(const wxMBConv& conv) { // file should be opened and we must be in it's beginning wxASSERT( m_file.IsOpened() && m_file.Tell() == 0 ); @@ -98,7 +98,7 @@ bool wxTextFile::OnRead(wxMBConv& conv) // read and so the conversion would fail) and, as the file contents is kept // in memory by wxTextFile anyhow, it shouldn't be a big problem to read // the file entirely - const size_t bufSize = m_file.Length() + 4 /* for trailing NULs */; + const size_t bufSize = (size_t)(m_file.Length() + 4 /* for trailing NULs */ ); size_t bufPos = 0; wxCharBuffer buf(bufSize - 1 /* it adds 1 internally */); @@ -114,18 +114,8 @@ bool wxTextFile::OnRead(wxMBConv& conv) return false; } - eof = nRead == 0; - if ( eof ) - { - // append 4 trailing NUL bytes: this is needed to ensure that the - // string is going to be NUL-terminated, whatever is the encoding - // used (even UTF-32) - block[0] = - block[1] = - block[2] = - block[3] = '\0'; - nRead = 4; - } + if ( nRead == 0 ) + break; // this shouldn't happen but don't overwrite the buffer if it does wxCHECK_MSG( bufPos + nRead <= bufSize, false, @@ -136,9 +126,11 @@ bool wxTextFile::OnRead(wxMBConv& conv) bufPos += nRead; } - const wxString str(buf, conv); + const wxString str(buf, conv, bufPos); + + // this doesn't risk to happen in ANSI build #if wxUSE_UNICODE - if ( str.empty() ) + if ( bufSize > 4 && str.empty() ) { wxLogError(_("Failed to convert file contents to Unicode.")); return false; @@ -165,7 +157,15 @@ bool wxTextFile::OnRead(wxMBConv& conv) // could be a DOS or Unix EOL if ( chLast == '\r' ) { - AddLine(wxString(lineStart, p - 1), wxTextFileType_Dos); + if ( p - 1 >= lineStart ) + { + AddLine(wxString(lineStart, p - 1), wxTextFileType_Dos); + } + else + { + // there were two line endings, so add an empty line: + AddLine(wxEmptyString, wxTextFileType_Dos); + } } else // bare '\n', Unix style { @@ -190,7 +190,15 @@ bool wxTextFile::OnRead(wxMBConv& conv) if ( chLast == '\r' ) { // Mac line termination - AddLine(wxString(lineStart, p - 1), wxTextFileType_Mac); + if ( p - 1 >= lineStart ) + { + AddLine(wxString(lineStart, p - 1), wxTextFileType_Mac); + } + else + { + // there were two line endings, so add an empty line: + AddLine(wxEmptyString, wxTextFileType_Mac); + } lineStart = p; } } @@ -209,7 +217,7 @@ bool wxTextFile::OnRead(wxMBConv& conv) } -bool wxTextFile::OnWrite(wxTextFileType typeNew, wxMBConv& conv) +bool wxTextFile::OnWrite(wxTextFileType typeNew, const wxMBConv& conv) { wxFileName fn = m_strBufferName; @@ -239,4 +247,3 @@ bool wxTextFile::OnWrite(wxTextFileType typeNew, wxMBConv& conv) } #endif // wxUSE_TEXTFILE -