- ch = buf[n];
- switch ( ch )
- {
- case '\n':
- // Dos/Unix line termination
- *strPtr = '\0';
- AddLine(wxString(strBuf, conv),
- chLast == '\r' ? wxTextFileType_Dos
- : wxTextFileType_Unix);
- strPtr = strBuf;
- chLast = '\n';
- break;
-
- case '\r':
- if ( chLast == '\r' )
+ // if no bytes have been read, presumably this is a valid-but-empty file
+ if ( bufPos == 0 )
+ return true;
+
+ // otherwise we've finished reading the file
+ break;
+ }
+
+ if ( seekable )
+ {
+ // this shouldn't happen but don't overwrite the buffer if it does
+ wxCHECK_MSG( bufPos + nRead <= bufSize, false,
+ _T("read more than file length?") );
+ }
+ else // !seekable
+ {
+ // for non-seekable files we have to allocate more memory on the go
+ if ( !buf.extend(bufPos + nRead - 1 /* it adds 1 internally */) )
+ return false;
+ }
+
+ // append to the buffer
+ memcpy(buf.data() + bufPos, block, nRead);
+ bufPos += nRead;
+ }
+
+ if ( !seekable )
+ {
+ bufSize = bufPos;
+ }
+
+ const wxString str(buf, conv, bufPos);
+
+ // there's no risk of this happening in ANSI build
+#if wxUSE_UNICODE
+ if ( bufSize > 4 && str.empty() )
+ {
+ wxLogError(_("Failed to convert file \"%s\" to Unicode."), GetName());
+ return false;
+ }
+#endif // wxUSE_UNICODE
+
+ free(buf.release()); // we don't need this memory any more
+
+
+ // now break the buffer in lines
+
+ // last processed character, we need to know if it was a CR or not
+ wxChar chLast = '\0';
+
+ // the beginning of the current line, changes inside the loop
+ wxString::const_iterator lineStart = str.begin();
+ const wxString::const_iterator end = str.end();
+ for ( wxString::const_iterator p = lineStart; p != end; p++ )
+ {
+ const wxChar ch = *p;
+ switch ( ch )
+ {
+ case '\n':
+ // could be a DOS or Unix EOL
+ if ( chLast == '\r' )
+ {
+ if ( p - 1 >= lineStart )