X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a62848fdba49396eba4f52c037d2dc82130274b4..1db4e8dd8dc92a55779d4dd477dfd22afccd2b7b:/src/common/ffile.cpp?ds=sidebyside diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp index 866dc2ef6a..736bbea55f 100644 --- a/src/common/ffile.cpp +++ b/src/common/ffile.cpp @@ -41,6 +41,18 @@ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// seek and tell with large file support if available +// ---------------------------------------------------------------------------- + +#ifdef HAVE_FSEEKO +# define wxFseek fseeko +# define wxFtell ftello +#else +# define wxFseek fseek +# define wxFtell ftell +#endif + // ---------------------------------------------------------------------------- // opening the file // ---------------------------------------------------------------------------- @@ -95,11 +107,14 @@ bool wxFFile::ReadAll(wxString *str) { 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()); + str->Alloc(length); wxChar buf[1024]; static const size_t nSize = WXSIZEOF(buf) - 1; // -1 for trailing '\0' @@ -170,7 +185,7 @@ bool wxFFile::Flush() // seeking // ---------------------------------------------------------------------------- -bool wxFFile::Seek(long ofs, wxSeekMode mode) +bool wxFFile::Seek(wxFileOffset ofs, wxSeekMode mode) { wxCHECK_MSG( IsOpened(), false, wxT("can't seek on closed file") ); @@ -194,7 +209,18 @@ bool wxFFile::Seek(long ofs, wxSeekMode mode) break; } - if ( fseek(m_fp, ofs, origin) != 0 ) +#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; + } + + 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()); @@ -204,34 +230,34 @@ bool wxFFile::Seek(long ofs, wxSeekMode mode) return true; } -size_t wxFFile::Tell() const +wxFileOffset wxFFile::Tell() const { - wxCHECK_MSG( IsOpened(), (size_t)-1, + wxCHECK_MSG( IsOpened(), wxInvalidOffset, _T("wxFFile::Tell(): file is closed!") ); - long rc = ftell(m_fp); - if ( rc == -1 ) + wxFileOffset rc = wxFtell(m_fp); + if ( rc == wxInvalidOffset ) { wxLogSysError(_("Can't find current position in file '%s'"), m_name.c_str()); } - return (size_t)rc; + return rc; } -size_t wxFFile::Length() const +wxFileOffset wxFFile::Length() const { - wxCHECK_MSG( IsOpened(), (size_t)-1, + wxCHECK_MSG( IsOpened(), wxInvalidOffset, _T("wxFFile::Length(): file is closed!") ); wxFFile& self = *(wxFFile *)this; // const_cast - size_t posOld = Tell(); - if ( posOld != (size_t)-1 ) + wxFileOffset posOld = Tell(); + if ( posOld != wxInvalidOffset ) { if ( self.SeekEnd() ) { - size_t len = Tell(); + wxFileOffset len = Tell(); (void)self.Seek(posOld); @@ -239,7 +265,7 @@ size_t wxFFile::Length() const } } - return (size_t)-1; + return wxInvalidOffset; } #endif // wxUSE_FFILE