campo-sirio/cb/source/f4flush.c
alex af15e0698b Codebase
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-16 13:01:08 +00:00

231 lines
5.3 KiB
C
Executable File

/* f4flush.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
#include "d4all.h"
#ifndef S4UNIX
#ifdef __TURBOC__
#pragma hdrstop
#endif
#endif
#ifdef __WATCOMC__
#ifdef M_I386
#define S4USE_EBX
#endif
#endif
#ifdef S4OS2
#define S4USE_DUP
#else
#ifdef S4UNIX
/* */
#define S4USE_DUP
/* */
#endif
#endif
/* returns 1 if no handles available */
static int file4lowFlush( FILE4 *file )
{
int rc ;
#ifdef S4USE_DUP
#ifndef S4NO_DUP
int handle ;
#endif
#else
/* */
#ifndef S4WIN32
union REGS dosFlush ;
#endif
/* */
#endif
/* */
/* */
/* */
#ifdef E4PARM_LOW
if ( file == 0 )
return error4( 0, e4parm, E90610 ) ;
#endif
#ifndef S4OFF_OPTIMIZE
if ( file->fileCreated == 0 ) /* file not open */
return 0 ;
#endif
if ( file->hand < 0 ) /* file not open */
return 0 ;
#ifdef S4WRITE_DELAY
if ( l4numNodes( &file->delayWriteFileList ) != 0 )
{
/* for now, just flush out any changed data. Later allow reading
of delay-write data */
file4writeDelayFlush( file, 1 ) ;
}
EnterCriticalSection( &file->critical4file ) ;
#endif
rc = 0 ;
#ifdef S4USE_DUP
#ifndef S4NO_DUP
handle = dup( file->hand ) ;
if ( handle < 0 ) /* means that there are no available handles */
rc = error4( file->codeBase, e4optFlush, E90610 ) ;
else
if ( close( handle ) < 0 )
rc = error4( file->codeBase, e4optFlush, E90610 ) ;
#endif
#else
/* */
/* */
/* */
/* */
/* */
/* */
/* */
#ifdef S4WIN32
if ( !FlushFileBuffers( (HANDLE) file->hand ) )
rc = error4( file->codeBase, e4optFlush, E90610 ) ;
#else
dosFlush.h.ah = 0x68 ;
#ifdef S4USE_EBX
dosFlush.x.ebx = (unsigned int)file->hand ;
#else
dosFlush.x.bx = (unsigned int)file->hand ;
#endif
intdos( &dosFlush, &dosFlush ) ;
if ( dosFlush.x.cflag != 0 )
rc = error4( file->codeBase, e4optFlush, E90610 ) ;
#endif
/* */
#endif
#ifdef S4WRITE_DELAY
LeaveCriticalSection( &file->critical4file ) ;
#endif
return rc ;
}
#ifndef S4OFF_OPTIMIZE
int opt4fileFlush( FILE4 *file, const int doFree )
{
long realLen ;
int saveRc, rc ;
#ifdef E4PARM_LOW
if ( file == 0 || doFree < 0 || doFree > 1 )
return error4( 0, e4parm, E90610 ) ;
#endif
if ( file->doBuffer == 1 )
{
switch( file->type )
{
case OPT4DBF:
rc = opt4fileFlushList( &file->codeBase->opt, file, &file->codeBase->opt.dbfLo.list, doFree ) ;
rc = opt4fileFlushList( &file->codeBase->opt, file, &file->codeBase->opt.dbfHi.list, doFree ) ;
break ;
case OPT4INDEX:
rc = opt4fileFlushList( &file->codeBase->opt, file, &file->codeBase->opt.indexLo.list, doFree ) ;
rc = opt4fileFlushList( &file->codeBase->opt, file, &file->codeBase->opt.indexHi.list, doFree ) ;
break ;
default:
rc = opt4fileFlushList( &file->codeBase->opt, file, &file->codeBase->opt.other.list, doFree ) ;
break ;
}
if ( file->codeBase->opt.writeFile == file ) /* flush out the final file changes */
{
saveRc = opt4flushWriteBuffer( &file->codeBase->opt ) ;
if ( saveRc < 0 )
rc = saveRc ;
}
if ( file->len != -1 )
{
file->doBuffer = 0 ;
realLen = file->len ;
#ifdef S4OFF_OPTIMIZE
if ( file->fileCreated == 0 )
{
#ifdef E4ANALYZE
if ( realLen != 0 )
return error4( file->codeBase, e4opt, E80603 ) ;
#endif
}
else /* for file4len lines below */
#endif
if ( file4len( file ) != realLen ) /* make sure the length is updated */
file4lenSet( file, realLen ) ;
file->doBuffer = 1 ;
}
if ( rc )
return rc ;
}
return 0 ;
}
#endif /* S4OFF_OPTIMIZE */
int S4FUNCTION file4flush( FILE4 *file )
{
int rc, err ;
#ifdef E4PARM_HIGH
if ( file == 0 )
return error4( 0, e4parm_null, E90611 ) ;
#endif
if ( file->isReadOnly == 1 )
return 0 ;
#ifndef S4OFF_OPTIMIZE
opt4fileFlush( file, 0 ) ;
#endif
err = error4set( file->codeBase, 0 ) ;
rc = file4lowFlush( file ) ;
if ( err != 0 )
error4set( file->codeBase, (short)err ) ;
if ( rc < 0 )
return error4stack( file->codeBase, (short)rc, E90611 ) ;
return 0 ;
}
#ifndef _MSC_VER
#ifdef P4ARGS_USED
#pragma argsused
#endif
#endif
int S4FUNCTION file4refresh( FILE4 *file )
{
#ifndef S4OPTIMIZE_OFF
#ifndef S4SINGLE
int rc ;
#ifdef E4PARM_HIGH
if ( file == 0 )
return error4( 0, e4parm_null, E90612 ) ;
#endif
if ( file->doBuffer == 0 || file->lowAccessMode != OPEN4DENY_NONE )
return 0 ;
rc = opt4fileFlush( file, 1 ) ;
if ( rc < 0 )
return error4stack( file->codeBase, rc, E90612 ) ;
file->len = -1 ;
#endif
#endif
return 0 ;
}