]> pd.if.org Git - pdclib/blob - functions/stdio/clearerr.c
PDCLIB-16: Add _unlocked variations of all I/O routines; move work into these versions
[pdclib] / functions / stdio / clearerr.c
1 /* $Id$ */
2
3 /* clearerr( FILE * )
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
11 #ifndef REGTEST
12
13 void clearerr_unlocked( struct _PDCLIB_file_t * stream )
14 {
15     stream->status &= ~( _PDCLIB_ERRORFLAG | _PDCLIB_EOFFLAG );
16 }
17
18 void clearerr( struct _PDCLIB_file_t * stream )
19 {
20     flockfile( stream );
21     clearerr_unlocked( stream );
22     funlockfile( stream );
23 }
24
25 #endif
26
27 #ifdef TEST
28 #include <_PDCLIB_test.h>
29
30 int main( void )
31 {
32     FILE * fh;
33     TESTCASE( ( fh = tmpfile() ) != NULL );
34     /* Flags should be clear */
35     TESTCASE( ! ferror( fh ) );
36     TESTCASE( ! feof( fh ) );
37     /* Reading from input stream - should provoke error */
38     /* FIXME: Apparently glibc disagrees on this assumption. How to provoke error on glibc? */
39     TESTCASE( fgetc( fh ) == EOF );
40     TESTCASE( ferror( fh ) );
41     TESTCASE( ! feof( fh ) );
42     /* clearerr() should clear flags */
43     clearerr( fh );
44     TESTCASE( ! ferror( fh ) );
45     TESTCASE( ! feof( fh ) );
46     /* Reading from empty stream - should provoke EOF */
47     rewind( fh );
48     TESTCASE( fgetc( fh ) == EOF );
49     TESTCASE( ! ferror( fh ) );
50     TESTCASE( feof( fh ) );
51     /* clearerr() should clear flags */
52     clearerr( fh );
53     TESTCASE( ! ferror( fh ) );
54     TESTCASE( ! feof( fh ) );
55     TESTCASE( fclose( fh ) == 0 );
56     return TEST_RESULTS;
57 }
58
59 #endif
60