/* 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 ; }