X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/55d99c7a77789ff4904bf96eddca3715eb5af9b9..52069700e7f9c4cc1fc4379306e9f763c5b83073:/src/common/ffile.cpp diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp index 6b09f9876b..a208dacb3e 100644 --- a/src/common/ffile.cpp +++ b/src/common/ffile.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "ffile.h" #endif @@ -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 // ---------------------------------------------------------------------------- @@ -62,12 +74,12 @@ bool wxFFile::Open(const wxChar *filename, const wxChar *mode) { wxLogSysError(_("can't open file '%s'"), filename); - return FALSE; + return false; } m_name = filename; - return TRUE; + return true; } bool wxFFile::Close() @@ -78,13 +90,13 @@ bool wxFFile::Close() { wxLogSysError(_("can't close file '%s'"), m_name.c_str()); - return FALSE; + return false; } Detach(); } - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -93,8 +105,8 @@ bool wxFFile::Close() 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( str, false, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), false, wxT("can't read from closed file") ); clearerr(m_fp); @@ -110,7 +122,7 @@ bool wxFFile::ReadAll(wxString *str) { wxLogSysError(_("Read error on file '%s'"), m_name.c_str()); - return FALSE; + return false; } //else: just EOF @@ -118,7 +130,7 @@ bool wxFFile::ReadAll(wxString *str) *str += buf; } - return TRUE; + return true; } size_t wxFFile::Read(void *pBuf, size_t nCount) @@ -159,20 +171,20 @@ bool wxFFile::Flush() { wxLogSysError(_("failed to flush the file '%s'"), m_name.c_str()); - return FALSE; + return false; } } - return TRUE; + return true; } // ---------------------------------------------------------------------------- // 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") ); + wxCHECK_MSG( IsOpened(), false, wxT("can't seek on closed file") ); int origin; switch ( mode ) @@ -194,38 +206,53 @@ 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; + } +#endif + + if ( wxFseek(m_fp, ofs, origin) != 0 ) { wxLogSysError(_("Seek error on file '%s'"), m_name.c_str()); - return FALSE; + return false; } - return TRUE; + return true; } -size_t wxFFile::Tell() const +wxFileOffset wxFFile::Tell() const { - long rc = ftell(m_fp); - if ( rc == -1 ) + wxCHECK_MSG( IsOpened(), wxInvalidOffset, + _T("wxFFile::Tell(): file is closed!") ); + + 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(), 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); @@ -233,7 +260,7 @@ size_t wxFFile::Length() const } } - return (size_t)-1; + return wxInvalidOffset; } #endif // wxUSE_FFILE