1. new wxFFile class - as wxFile but uses fopen/fread/fseek... instead of

open/read/seek...
2. wxTextCtrlBase appears, several bug fixes in MSW wxTextCtrl and made
   LoadFile() behave in the same way under GTK and MSW (fixed it for MSW
   too)
3. Corrected the sash position calculation in sashwin.cpp - seems to work
   now but I wonder how it could ever work before?
4. new, tmake generated, MSW makefiles. They probably don't work - will fix
   them as soon as people start complaining.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3004 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-07-14 22:55:57 +00:00
parent f2071dda0b
commit a1b82138ef
26 changed files with 3585 additions and 3338 deletions

235
src/common/ffile.cpp Normal file
View File

@@ -0,0 +1,235 @@
/////////////////////////////////////////////////////////////////////////////
// Name: ffile.cpp
// Purpose: wxFFile - encapsulates "FILE *" IO stream
// Author: Vadim Zeitlin
// Modified by:
// Created: 14.07.99
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#ifdef __GNUG__
#pragma implementation "ffile.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_FILE
#ifndef WX_PRECOMP
#endif
#include "wx/ffile.h"
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// opening the file
// ----------------------------------------------------------------------------
wxFFile::wxFFile(const wxChar *filename, const char *mode)
{
Detach();
(void)Open(filename, mode);
}
bool wxFFile::Open(const wxChar *filename, const char *mode)
{
wxASSERT_MSG( !m_fp, _T("should close or detach the old file first") );
m_fp = fopen(filename, mode);
if ( !m_fp )
{
wxLogSysError(_("can't open file '%s'"), filename);
return FALSE;
}
m_name = filename;
return TRUE;
}
bool wxFFile::Close()
{
if ( IsOpened() )
{
if ( !fclose(m_fp) )
{
wxLogSysError(_("can't close file '%s'"), m_name.c_str());
return FALSE;
}
Detach();
}
return TRUE;
}
// ----------------------------------------------------------------------------
// read/write
// ----------------------------------------------------------------------------
bool wxFFile::ReadAll(wxString *str)
{
wxCHECK_MSG( str, FALSE, _T("invalid parameter") );
wxCHECK_MSG( IsOpened(), FALSE, _T("can't read from closed file") );
clearerr(m_fp);
str->Empty();
str->Alloc(Length());
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());
return FALSE;
}
//else: just EOF
buf[nRead] = 0;
*str += buf;
}
return TRUE;
}
size_t wxFFile::Read(void *pBuf, size_t nCount)
{
wxCHECK_MSG( pBuf, FALSE, _T("invalid parameter") );
wxCHECK_MSG( IsOpened(), FALSE, _T("can't read from closed file") );
size_t nRead = fread(pBuf, 1, nCount, m_fp);
if ( (nRead < nCount) && Error() )
{
wxLogSysError(_("Read error on file '%s'"), m_name.c_str());
}
return nRead;
}
size_t wxFFile::Write(const void *pBuf, size_t nCount)
{
wxCHECK_MSG( pBuf, FALSE, _T("invalid parameter") );
wxCHECK_MSG( IsOpened(), FALSE, _T("can't write to closed file") );
size_t nWritten = fwrite(pBuf, 1, nCount, m_fp);
if ( nWritten < nCount )
{
wxLogSysError(_("Write error on file '%s'"), m_name.c_str());
}
return nWritten;
}
bool wxFFile::Flush()
{
if ( IsOpened() )
{
if ( !fflush(m_fp) )
{
wxLogSysError(_("failed to flush the file '%s'"), m_name.c_str());
return FALSE;
}
}
return TRUE;
}
// ----------------------------------------------------------------------------
// seeking
// ----------------------------------------------------------------------------
bool wxFFile::Seek(long ofs, wxSeekMode mode)
{
wxCHECK_MSG( IsOpened(), FALSE, _T("can't seek on closed file") );
int origin;
switch ( mode )
{
default:
wxFAIL_MSG(_T("unknown seek mode"));
// still fall through
case wxFromStart:
origin = SEEK_SET;
break;
case wxFromCurrent:
origin = SEEK_CUR;
break;
case wxFromEnd:
origin = SEEK_END;
break;
}
if ( fseek(m_fp, ofs, origin) != 0 )
{
wxLogSysError(_("Seek error on file '%s'"), m_name.c_str());
return FALSE;
}
return TRUE;
}
size_t wxFFile::Tell() const
{
long rc = ftell(m_fp);
if ( rc == -1 )
{
wxLogSysError(_("Can't find current position in file '%s'"),
m_name.c_str());
}
return (size_t)rc;
}
size_t wxFFile::Length() const
{
wxFFile& self = *(wxFFile *)this; // const_cast
size_t posOld = Tell();
if ( posOld != (size_t)-1 )
{
if ( self.SeekEnd() )
{
size_t len = Tell();
(void)self.Seek(posOld);
return len;
}
}
return (size_t)-1;
}
#endif // wxUSE_FILE