194 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* f4close.c   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifdef __TURBOC__
 | |
|    #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #ifdef S4TEMP
 | |
|    #include "t4test.h"
 | |
| #endif
 | |
| 
 | |
| #ifdef S4WINTEL
 | |
|    #ifndef S4IBMOS2
 | |
|       #ifndef __TURBOC__
 | |
|          #include <sys\locking.h>
 | |
|          #define S4LOCKING
 | |
|       #endif
 | |
|       #ifdef _MSC_VER
 | |
|          #include <sys\types.h>
 | |
|          #include <sys\locking.h>
 | |
|       #endif
 | |
|    #endif
 | |
| 
 | |
| /*   #include <sys\stat.h>*/
 | |
| /*   #include <share.h>*/
 | |
| #endif
 | |
| 
 | |
| /*#include <fcntl.h>*/
 | |
| 
 | |
| #ifdef S4TRACK_FILES
 | |
|    unsigned int numFiles ;
 | |
|    int f4print = 0 ; /* if f4print == 0 then stdout, else stdprn, no output if -1 */
 | |
|    #ifndef S4TESTING
 | |
|       extern FILE4 s4test ;
 | |
| void S4FUNCTION u4writeErr( const char * err_str, int newLine )
 | |
| {
 | |
|    int errCode, flushCode ;
 | |
|    long len ;
 | |
| 
 | |
|    if (s4test.hand > 0 && err_str != 0 )
 | |
|    {
 | |
|       errCode = error4code( s4test.codeBase ) ;
 | |
|       error4set( s4test.codeBase, 0 ) ;
 | |
| 
 | |
|       len = file4len( &s4test ) ;
 | |
|       if( len >= 0 )
 | |
|       {
 | |
|          if ( newLine == 1 )
 | |
|          {
 | |
|             file4write( &s4test, len, "\r\n", 2 ) ;
 | |
|             len += 2 ;
 | |
|          }
 | |
|          flushCode = s4test.codeBase->fileFlush ;
 | |
|          s4test.codeBase->fileFlush = 1 ;
 | |
|          file4lenSet( &s4test, len + strlen(err_str) ) ;
 | |
|          file4write( &s4test, len, (void *)err_str, strlen(err_str) ) ;
 | |
|          file4flush( &s4test ) ;
 | |
|          s4test.codeBase->fileFlush = flushCode ;
 | |
|       }
 | |
| 
 | |
|       s4test.codeBase->errorCode = errCode ;
 | |
| 
 | |
|    }
 | |
| }
 | |
| #endif  /* S4TESTING */
 | |
| #endif
 | |
| 
 | |
| int S4FUNCTION file4close( FILE4 *file )
 | |
| {
 | |
|    int rc ;
 | |
|    CODE4 *c4 ;
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
| 
 | |
|    #ifdef E4PARM_HIGH
 | |
|       if ( file == 0 )
 | |
|          return error4( 0, e4parm_null, E90601 ) ;
 | |
|    #endif
 | |
| 
 | |
|    if ( file->hand < 0 )
 | |
|       return 0 ;
 | |
| 
 | |
|    c4 = file->codeBase ;
 | |
| 
 | |
|    #ifndef S4OPTIMIZE_OFF
 | |
|       if ( file->fileCreated == 0 )
 | |
|       {
 | |
|          file4lenSet( file, 0L ) ;
 | |
|          file4optimize( file, 0, 0 ) ;
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|          file4optimize( file, 0, 0 ) ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4ADVANCE_READ
 | |
|       /* just cancel any oustanding reads */
 | |
|       if ( l4numNodes( &file->advanceReadFileList ) != 0 )
 | |
|          file4advanceCancel( file ) ;
 | |
|       if ( file->advanceReadBuf != 0 )
 | |
|       {
 | |
|          u4free( file->advanceReadBuf ) ;
 | |
|          file->advanceReadBuf = 0 ;
 | |
|       }
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4WRITE_DELAY
 | |
|       /* ensure that there are no outstanding file-writes delaying */
 | |
|       if ( l4numNodes( &file->delayWriteFileList ) != 0 )
 | |
|          file4writeDelayFlush( file, (file->isTemp ? 0 : 1 ) ) ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4MULTI_THREAD
 | |
|       DeleteCriticalSection( &file->critical4file ) ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef S4WIN32
 | |
|       rc = (int) CloseHandle( (HANDLE)file->hand ) ;
 | |
|    #else
 | |
|       #ifdef S4WINDOWS
 | |
|          rc = _lclose( file->hand ) ;
 | |
|       #else
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
| /* */
 | |
|             rc = close( file->hand ) ;
 | |
| /* */
 | |
|       #endif
 | |
|    #endif
 | |
| 
 | |
|       if ( rc < 0 )
 | |
|       {
 | |
|          if ( file->name == 0 )
 | |
|             return error4( c4, e4close, E90601 ) ;
 | |
|          else
 | |
|             return error4describe( c4, e4close, E90601, file->name, 0, 0 ) ;
 | |
|       }
 | |
| 
 | |
|       #ifndef S4OPTIMIZE_OFF
 | |
|          if ( file->fileCreated == 1 )
 | |
|       #endif
 | |
|          if ( file->isTemp )
 | |
|             u4remove( file->name ) ;
 | |
| 
 | |
|    #ifndef S4OPTIMIZE_OFF
 | |
|       }
 | |
|    #endif
 | |
| 
 | |
|    if ( file->doAllocFree )
 | |
|    {
 | |
|       u4free( file->nameBuf ) ;
 | |
|       file->name = 0 ;
 | |
|    }
 | |
| 
 | |
|    memset( (void *)file, 0, sizeof( FILE4 ) ) ;
 | |
|    file->hand = -1 ;
 | |
| 
 | |
|    #ifdef S4TRACK_FILES
 | |
|       numFiles-- ;
 | |
|       if ( f4print != -1 )
 | |
|       {
 | |
|           #ifdef S4WINDOWS
 | |
|              #ifdef S4TESTING
 | |
|                 if ( mem4displayPtr == 0 )
 | |
|                    error4( c4, e4info, E50101 ) ;
 | |
|                 d4display_str( mem4displayPtr, "\r\nfile closed: ", 1 ) ;
 | |
|                 d4display_str( mem4displayPtr, f4print, file->name ) ;
 | |
|              #else
 | |
|                 u4writeErr( "file closed: ", 1 ) ;
 | |
|                 u4writeErr( file->name, 0 ) ;
 | |
|              #endif
 | |
|           #else
 | |
|              if ( f4print )
 | |
|                 fprintf( stdprn, "\r\nfile closed: %s", file->name ) ;
 | |
|              else
 | |
|                 printf( "\r\nfile closed: %s", file->name ) ;
 | |
|           #endif
 | |
|        }
 | |
|    #endif
 | |
| 
 | |
|    if ( c4 != 0 )
 | |
|       if ( error4code( c4 ) < 0 )
 | |
|          return -1 ;
 | |
| 
 | |
|    return 0 ;
 | |
| }
 |