X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/70a7bd90f9bdafd5ffbc89fd0b79b9e900d7dd22..99d800190a04a2deaf769017a5fae04a4ae50378:/src/common/ffile.cpp diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp index a208dacb3e..2fa5abeff7 100644 --- a/src/common/ffile.cpp +++ b/src/common/ffile.cpp @@ -103,40 +103,40 @@ bool wxFFile::Close() // read/write // ---------------------------------------------------------------------------- -bool wxFFile::ReadAll(wxString *str) +bool wxFFile::ReadAll(wxString *str, wxMBConv& conv) { wxCHECK_MSG( str, false, wxT("invalid parameter") ); wxCHECK_MSG( IsOpened(), false, wxT("can't read from closed file") ); + wxCHECK_MSG( Length() >= 0, false, wxT("invalid length") ); + size_t length = (size_t)Length(); + wxCHECK_MSG( (wxFileOffset)length == Length(), false, wxT("huge file not supported") ); clearerr(m_fp); - str->Empty(); - str->Alloc(Length()); + wxCharBuffer buf(length + 1); - wxChar buf[1024]; - static const size_t nSize = WXSIZEOF(buf) - 1; // -1 for trailing '\0' - while ( !Eof() ) - { - size_t nRead = fread(buf, sizeof(wxChar), nSize, m_fp); - if ( (nRead < nSize) && Error() ) - { - wxLogSysError(_("Read error on file '%s'"), m_name.c_str()); + // note that real length may be less than file length for text files with DOS EOLs + // ('\r's get dropped by CRT when reading which means that we have + // realLen = fileLen - numOfLinesInTheFile) + length = fread(buf.data(), sizeof(char), length, m_fp); - return false; - } - //else: just EOF + if ( Error() ) + { + wxLogSysError(_("Read error on file '%s'"), m_name.c_str()); - buf[nRead] = 0; - *str += buf; + return false; } + buf.data()[length] = 0; + *str = wxString(buf, conv); + return true; } size_t wxFFile::Read(void *pBuf, size_t nCount) { - wxCHECK_MSG( pBuf, FALSE, wxT("invalid parameter") ); - wxCHECK_MSG( IsOpened(), FALSE, wxT("can't read from closed file") ); + wxCHECK_MSG( pBuf, 0, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), 0, wxT("can't read from closed file") ); size_t nRead = fread(pBuf, 1, nCount, m_fp); if ( (nRead < nCount) && Error() ) @@ -149,8 +149,8 @@ size_t wxFFile::Read(void *pBuf, size_t nCount) size_t wxFFile::Write(const void *pBuf, size_t nCount) { - wxCHECK_MSG( pBuf, FALSE, wxT("invalid parameter") ); - wxCHECK_MSG( IsOpened(), FALSE, wxT("can't write to closed file") ); + wxCHECK_MSG( pBuf, 0, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), 0, wxT("can't write to closed file") ); size_t nWritten = fwrite(pBuf, 1, nCount, m_fp); if ( nWritten < nCount ) @@ -206,16 +206,18 @@ bool wxFFile::Seek(wxFileOffset ofs, wxSeekMode mode) break; } -#ifndef HAVE_FSEEKO +#ifndef HAVE_FSEEKO if ((long)ofs != ofs) { wxLogError(_("Seek error on file '%s' (large files not supported by stdio)"), m_name.c_str()); return false; } -#endif + if ( wxFseek(m_fp, (long)ofs, origin) != 0 ) +#else if ( wxFseek(m_fp, ofs, origin) != 0 ) +#endif { wxLogSysError(_("Seek error on file '%s'"), m_name.c_str()); @@ -260,7 +262,7 @@ wxFileOffset wxFFile::Length() const } } - return wxInvalidOffset; + return wxInvalidOffset; } #endif // wxUSE_FFILE