]> pd.if.org Git - pdclib/blobdiff - functions/stdio/fopen.c
PDCLib includes with quotes, not <>.
[pdclib] / functions / stdio / fopen.c
index 04020d94645a1f52dee6f3bd88da52c0e91f4850..3d9f95ab1a205917d4ec2b0424b6866a248bc99d 100644 (file)
@@ -1,8 +1,67 @@
-// ----------------------------------------------------------------------------
-// $Id$
-// ----------------------------------------------------------------------------
-// Public Domain C Library - http://pdclib.sourceforge.net
-// This code is Public Domain. Use, modify, and redistribute at will.
-// ----------------------------------------------------------------------------
-
-FILE * fopen( const char * restrict filename, const char * restrict mode ) { /* TODO */ };
+/* fopen( 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 <stdio.h>
+#include <stdlib.h>
+
+#ifndef REGTEST
+#include "_PDCLIB_io.h"
+#include "_PDCLIB_glue.h"
+#include <string.h>
+#include <errno.h>
+
+extern FILE * _PDCLIB_filelist;
+
+FILE * fopen( const char * _PDCLIB_restrict filename, 
+              const char * _PDCLIB_restrict mode )
+{
+    int imode = _PDCLIB_filemode( mode );
+    
+    if( imode == 0 || filename == NULL )
+        return NULL;
+
+    _PDCLIB_fd_t              fd;
+    const _PDCLIB_fileops_t * ops;
+    if(!_PDCLIB_open( &fd, &ops, filename, imode )) {
+        return NULL;
+    }
+
+    FILE * f = _PDCLIB_fvopen( fd, ops, imode, filename );
+    if(!f) {
+        int saveErrno = errno;
+        ops->close(fd);
+        errno = saveErrno;
+    }
+    return f;
+}
+
+#endif
+
+#ifdef TEST
+#include "_PDCLIB_test.h"
+
+int main( void )
+{
+    /* Some of the tests are not executed for regression tests, as the libc on
+       my system is at once less forgiving (segfaults on mode NULL) and more
+       forgiving (accepts undefined modes).
+    */
+    FILE * fh;
+    remove( testfile );
+    TESTCASE_NOREG( fopen( NULL, NULL ) == NULL );
+    TESTCASE( fopen( NULL, "w" ) == NULL );
+    TESTCASE_NOREG( fopen( "", NULL ) == NULL );
+    TESTCASE( fopen( "", "w" ) == NULL );
+    TESTCASE( fopen( "foo", "" ) == NULL );
+    TESTCASE_NOREG( fopen( testfile, "wq" ) == NULL ); /* Undefined mode */
+    TESTCASE_NOREG( fopen( testfile, "wr" ) == NULL ); /* Undefined mode */
+    TESTCASE( ( fh = fopen( testfile, "w" ) ) != NULL );
+    TESTCASE( fclose( fh ) == 0 );
+    TESTCASE( remove( testfile ) == 0 );
+    return TEST_RESULTS;
+}
+
+#endif