X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=functions%2Fstdio%2Ffreopen.c;h=d647d32033110ee6167158774af94cfad5e9a41f;hp=2d900fd510dfeab1cc26ca1ea9d046bef2b10f78;hb=da0f3f353d417fed71f358a48d5d5394145e460d;hpb=d451ae8a715aa5fe6f2fb6f4d2494b11f4d11f2f diff --git a/functions/stdio/freopen.c b/functions/stdio/freopen.c index 2d900fd..d647d32 100644 --- a/functions/stdio/freopen.c +++ b/functions/stdio/freopen.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /* freopen( const char *, const char *, FILE * ) This file is part of the Public Domain C Library (PDCLib). @@ -9,14 +7,23 @@ #include #ifndef REGTEST - -#include <_PDCLIB_glue.h> +#include "_PDCLIB_io.h" +#include "_PDCLIB_glue.h" #include #include -struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, struct _PDCLIB_file_t * _PDCLIB_restrict stream ) +FILE * freopen( + const char * _PDCLIB_restrict filename, + const char * _PDCLIB_restrict mode, + FILE * _PDCLIB_restrict stream +) { - unsigned int status = stream->status & ( _IONBF | _IOLBF | _IOFBF | _PDCLIB_FREEBUFFER | _PDCLIB_DELONCLOSE ); + _PDCLIB_flockfile( stream ); + + unsigned int status = stream->status & + ( _IONBF | _IOLBF | _IOFBF | _PDCLIB_FREEBUFFER + | _PDCLIB_DELONCLOSE | _PDCLIB_STATIC ); + /* TODO: This function can change wide orientation of a stream */ if ( stream->status & _PDCLIB_FWRITE ) { @@ -25,14 +32,16 @@ struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const c if ( ( filename == NULL ) && ( stream->filename == NULL ) ) { /* TODO: Special handling for mode changes on std-streams */ + _PDCLIB_funlockfile( stream ); return NULL; } - _PDCLIB_close( stream->handle ); + stream->ops->close(stream->handle); + /* TODO: It is not nice to do this on a stream we just closed. It does not matter with the current implementation of clearerr(), but it might start to matter if someone replaced that implementation. */ - clearerr( stream ); + _PDCLIB_clearerr_unlocked( stream ); /* The new filename might not fit the old buffer */ if ( filename == NULL ) { @@ -49,16 +58,19 @@ struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const c /* Allocate new buffer */ if ( ( stream->filename = (char *)malloc( strlen( filename ) ) ) == NULL ) { + _PDCLIB_funlockfile( stream ); return NULL; } strcpy( stream->filename, filename ); } if ( ( mode == NULL ) || ( filename[0] == '\0' ) ) { + _PDCLIB_funlockfile( stream ); return NULL; } if ( ( stream->status = _PDCLIB_filemode( mode ) ) == 0 ) { + _PDCLIB_funlockfile( stream ); return NULL; } /* Re-add the flags we saved above */ @@ -67,17 +79,20 @@ struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const c stream->bufend = 0; stream->ungetidx = 0; /* TODO: Setting mbstate */ - if ( ( stream->handle = _PDCLIB_open( filename, stream->status ) ) == _PDCLIB_NOHANDLE ) + if ( ! _PDCLIB_open( &stream->handle, &stream->ops, filename, + stream->status ) ) { + _PDCLIB_funlockfile( stream ); return NULL; } + _PDCLIB_funlockfile( stream ); return stream; } #endif #ifdef TEST -#include <_PDCLIB_test.h> +#include "_PDCLIB_test.h" int main( void ) { @@ -96,8 +111,8 @@ int main( void ) TESTCASE( fclose( fin ) == 0 ); TESTCASE( fclose( fout ) == 0 ); - remove( testfile1 ); - remove( testfile2 ); + TESTCASE( remove( testfile1 ) == 0 ); + TESTCASE( remove( testfile2 ) == 0 ); return TEST_RESULTS; }