]> pd.if.org Git - pdclib/blobdiff - functions/stdio/freopen.c
PDCLib includes with quotes, not <>.
[pdclib] / functions / stdio / freopen.c
index 2d900fd510dfeab1cc26ca1ea9d046bef2b10f78..d647d32033110ee6167158774af94cfad5e9a41f 100644 (file)
@@ -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 <stdio.h>
 
 #ifndef REGTEST
-
-#include <_PDCLIB_glue.h>
+#include "_PDCLIB_io.h"
+#include "_PDCLIB_glue.h"
 #include <stdlib.h>
 #include <string.h>
 
-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;
 }