231 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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 ;
 | |
| }
 | |
| 
 | |
| 
 |