X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2Fstdio%2Ffreopen.c;h=e8cc72a1f2924cba8e56c8acc5947ff2525ed7bf;hb=393020b6e48719d27699dea6b29e53025bbd5123;hp=23c12e01946c94eba1156a18f662b58822c09c08;hpb=34893ecc2200dc7017c36a54cb6c5f4c2378b5ec;p=pdclib diff --git a/functions/stdio/freopen.c b/functions/stdio/freopen.c index 23c12e0..e8cc72a 100644 --- a/functions/stdio/freopen.c +++ b/functions/stdio/freopen.c @@ -1,8 +1,56 @@ -// ---------------------------------------------------------------------------- -// $Id$ -// ---------------------------------------------------------------------------- -// Public Domain C Library - http://pdclib.sourceforge.net -// This code is Public Domain. Use, modify, and redistribute at will. -// ---------------------------------------------------------------------------- - -FILE * freopen( const char * restrict filename, const char * restrict mode, FILE * stream ) { /* TODO */ }; +/* $Id$ */ + +/* freopen( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +#include <_PDCLIB_glue.h> +#include + +/* Close any file currently associated with the given stream. Open the file + identified by the given filename with the given mode (equivalent to fopen()), + and associate it with the given stream. If filename is a NULL pointer, + attempt to change the mode of the given stream. + This implementation allows the following mode changes: TODO + (Primary use of this function is to redirect stdin, stdout, and stderr.) +*/ + +struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, struct _PDCLIB_file_t * stream ) +{ + /* FIXME: This is ad-hoc (to make the vprintf() testdriver work), and must be checked. */ + /* FIXME: If filename is NULL, change mode. */ + /* TODO: This function can change wide orientation of a stream */ + if ( filename == NULL ) return NULL; + if ( stream->status & _PDCLIB_FWRITE ) fflush( stream ); + if ( stream->status & _PDCLIB_LIBBUFFER ) free( stream->buffer ); + _PDCLIB_close( stream->handle ); + clearerr( stream ); + if ( ( mode == NULL ) || ( filename[0] == '\0' ) ) return NULL; + if ( ( stream->status = _PDCLIB_filemode( mode ) ) == 0 ) return NULL; + stream->handle = _PDCLIB_open( filename, stream->status ); + if ( ( stream->buffer = malloc( BUFSIZ ) ) == NULL ) return NULL; + stream->bufsize = BUFSIZ; + stream->bufidx = 0; + stream->status |= _PDCLIB_LIBBUFFER; + /* TODO: Setting mbstate */ + return stream; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif