campo-sirio/cb/source/f4close.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

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