X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/44327ff375205d04dd7f71560b454f3ec283c233..d10e22fe8ad283f37b1809349028ffc282e393ce:/src/common/textfile.cpp diff --git a/src/common/textfile.cpp b/src/common/textfile.cpp index 1ba27db9f1..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,7 +126,7 @@ 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 @@ -167,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 { @@ -192,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; } } @@ -211,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; @@ -241,4 +247,3 @@ bool wxTextFile::OnWrite(wxTextFileType typeNew, wxMBConv& conv) } #endif // wxUSE_TEXTFILE -