which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			168 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* f4flush.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| 
 | |
| #ifdef S4WIN32
 | |
| #include <windows.h>
 | |
| #endif
 | |
| 
 | |
| #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
 | |
| #ifndef S4MACINTOSH
 | |
| #define S4USE_DUP
 | |
| #endif
 | |
| #else
 | |
| #ifndef S4WIN32
 | |
| #include <dos.h>
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| /* returns 1 if no handles available */
 | |
| int S4FUNCTION file4low_flush( FILE4 *file, int do_free )
 | |
| {
 | |
|   int rc ;
 | |
| #ifndef S4OPTIMIZE_OFF
 | |
|   long real_len ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4USE_DUP
 | |
|   int handle ;
 | |
| #else
 | |
| #ifndef S4MACINTOSH
 | |
| #ifndef S4WIN32
 | |
|   union REGS dos_flush ;
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifdef S4MACINTOSH
 | |
|   short vRefNum ;
 | |
| #endif
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( file == 0 || do_free < 0 || do_free > 1 )
 | |
|     e4severe( e4parm, E4_F4LOW_FLUSH ) ;
 | |
| #endif
 | |
| 
 | |
| #ifndef S4OPTIMIZE_OFF
 | |
|   if ( file->do_buffer == 1 )
 | |
|   {
 | |
|     rc = opt4file_flush_list( file, opt4file_find_list( file ), do_free ) ;
 | |
|     if ( file->code_base->opt.write_file == file )  /* flush out the final file changes */
 | |
|       if ( opt4flush_write_buffer( &file->code_base->opt ) < 0 )
 | |
|         rc = -1 ;
 | |
|     if ( file->len != -1 )
 | |
|     {
 | |
|       file->do_buffer = 0 ;
 | |
|       real_len = file->len ;
 | |
|       if ( file->file_created == 0 )
 | |
|       {
 | |
| #ifdef S4DEBUG
 | |
|         if ( real_len != 0 )
 | |
|           e4severe( e4opt, "file4low_flush() uncreate file attempted flush" ) ;
 | |
| #endif
 | |
|       }
 | |
|       else
 | |
|         if ( file4len( file ) != real_len )   /* make sure the length is updated */
 | |
|           file4len_set( file, real_len ) ;
 | |
|       file->do_buffer = 1 ;
 | |
|     }
 | |
|     if ( rc )
 | |
|       return rc ;
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   if ( file->hand < 0 )  /* file not open */
 | |
|     return 0 ;
 | |
| 
 | |
| #ifdef S4USE_DUP
 | |
| #ifndef S4NO_DUP
 | |
|   handle = dup( file->hand ) ;
 | |
|   if ( handle < 0 )  /* means that there are no available handles */
 | |
|     return e4( file->code_base, e4opt_flush, 0 ) ;
 | |
|   if ( close( handle ) < 0 )
 | |
|     return e4( file->code_base, e4opt_flush, 0 ) ;
 | |
| #endif
 | |
| #else
 | |
| #ifdef S4MACINTOSH
 | |
|   if (GetVRefNum( file->hand, &vRefNum ) != 0 )
 | |
|     return e4( file->code_base, e4opt_flush, 0 ) ;
 | |
| 
 | |
|   if (FlushVol( 0, vRefNum ) != 0 )
 | |
|     return e4( file->code_base, e4opt_flush, 0 ) ;
 | |
| #else
 | |
| #ifdef S4WIN32
 | |
|   if ( !FlushFileBuffers( (HANDLE) file->hand ) )
 | |
|     return e4( file->code_base, e4opt_flush, 0 ) ;
 | |
| #else
 | |
|   dos_flush.h.ah = 0x68 ;
 | |
| #ifdef S4USE_EBX
 | |
|   dos_flush.x.ebx = file->hand ;
 | |
| #else
 | |
|   dos_flush.x.bx = file->hand ;
 | |
| #endif
 | |
|   intdos( &dos_flush, &dos_flush ) ;
 | |
|   if ( dos_flush.x.cflag != 0 )
 | |
|     return e4( file->code_base, e4opt_flush, 0 ) ;
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION file4flush( FILE4 *file )
 | |
| {
 | |
|   int rc, err ;
 | |
| 
 | |
|   err = e4set( file->code_base, 0 ) ;
 | |
| #ifdef S4DEBUG
 | |
|   if ( file == 0 )
 | |
|     e4severe( e4parm, E4_F4FLUSH ) ;
 | |
| #endif
 | |
|   rc = file4low_flush( file, 0 ) ;
 | |
|   if ( err != 0 )
 | |
|     e4set( file->code_base, err ) ;
 | |
| 
 | |
|   return rc ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION file4refresh( FILE4 *file )
 | |
| {
 | |
| #ifndef S4OPTIMIZE_OFF
 | |
| #ifndef S4SINGLE
 | |
|   int rc ;
 | |
| #ifdef S4DEBUG
 | |
|   if ( file == 0 )
 | |
|     e4severe( e4parm, E4_F4REFRESH ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( file->do_buffer == 0 || file->is_exclusive == 1 || file->is_read_only == 1 )
 | |
|     return 0 ;
 | |
| 
 | |
|   rc = file4low_flush( file, 1 ) ;
 | |
|   if ( rc < 0 )
 | |
|     return rc ;
 | |
|   file->len = -1 ;
 | |
| #endif
 | |
| #endif
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| 
 |