]> pd.if.org Git - pdclib/blob - functions/stdio/fopen.c
Improved testdrivers.
[pdclib] / functions / stdio / fopen.c
1 /* $Id$ */
2
3 /* fopen( const char *, const char * )
4
5    This file is part of the Public Domain C Library (PDCLib).
6    Permission is granted to use, modify, and / or redistribute at will.
7 */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11
12 #ifndef REGTEST
13 #include <_PDCLIB_glue.h>
14
15 /* FIXME: This approach is a possible attack vector. */
16 struct _PDCLIB_file_t * _PDCLIB_filelist = NULL;
17
18 struct _PDCLIB_file_t * fopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode )
19 {
20     struct _PDCLIB_file_t * rc;
21     if ( mode == NULL || filename == NULL || filename[0] == '\0' )
22     {
23         /* Mode or filename invalid */
24         return NULL;
25     }
26     if ( ( rc = calloc( 1, sizeof( struct _PDCLIB_file_t ) ) ) == NULL )
27     {
28         /* no memory for another FILE */
29         return NULL;
30     }
31     if ( ( rc->status = _PDCLIB_filemode( mode ) ) == 0 ) goto fail; /* invalid mode */
32     rc->handle = _PDCLIB_open( filename, rc->status );
33     if ( rc->handle == _PDCLIB_NOHANDLE ) goto fail; /* OS open() failed */
34     /* Adding to list of open files */
35     rc->next = _PDCLIB_filelist;
36     _PDCLIB_filelist = rc;
37     /* Setting buffer, and mark as internal. TODO: Check for unbuffered */
38     if ( ( rc->buffer = malloc( BUFSIZ ) ) == NULL ) goto fail;
39     rc->bufsize = BUFSIZ;
40     rc->bufidx = 0;
41     rc->status |= ( _PDCLIB_LIBBUFFER | _PDCLIB_VIRGINSTR );
42     /* TODO: Setting mbstate */
43     return rc;
44 fail:
45     free( rc );
46     return NULL;
47 }
48
49 #endif
50
51 #ifdef TEST
52 #include <_PDCLIB_test.h>
53
54 int main( void )
55 {
56     TESTCASE( fopen( NULL, NULL ) == NULL );
57     TESTCASE( fopen( NULL, "w" ) == NULL );
58     TESTCASE( fopen( "", NULL ) == NULL );
59     TESTCASE( fopen( "", "w" ) == NULL );
60     TESTCASE( fopen( "foo", "" ) == NULL );
61     TESTCASE( fopen( "testfile", "wq" ) == NULL ); /* Illegal mode */
62     TESTCASE( fopen( "testfile", "wr" ) == NULL ); /* Illegal mode */
63     TESTCASE( fopen( "testfile", "w" ) != NULL );
64     system( "rm testfile" );
65     return TEST_RESULTS;
66 }
67
68 #endif