3 /* setvbuf( FILE *, char *, int, size_t )
5 This file is part of the Public Domain C Library (PDCLib).
6 Permission is granted to use, modify, and / or redistribute at will.
15 int setvbuf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf, int mode, size_t size )
20 /* When unbuffered I/O is requested, we keep the buffer anyway, as
21 we don't want to e.g. flush the stream for every character of a
27 if ( size > INT_MAX || size == NULL )
29 /* PDCLib only supports buffers up to INT_MAX in size. A size
30 of zero doesn't make sense.
36 /* User requested buffer size, but leaves it to library to
39 if ( ( stream->bufsize < size ) || ( stream->bufsize > ( size << 1 ) ) )
41 /* If current buffer is big enough for requested size, but
42 not over twice as big (and wasting memory space), we use
43 the current buffer (i.e., do nothing), to save the
44 malloc() / free() overhead.
46 /* Free the buffer allocated by fopen(), and allocate a new
49 if ( ( buf = (char *) malloc( size ) ) == NULL )
51 /* Out of memory error. */
58 /* User provided buffer -> set flag to not free() the buffer
61 stream->status &= ~ _PDCLIB_LIBBUFFER;
63 free( stream->buffer );
65 stream->bufsize = size;
68 /* If mode is something else than _IOFBF, _IOLBF or _IONBF -> exit */
71 /* Deleting current buffer mode */
72 stream->status &= ~( _IOFBF | _IOLBF | _IONBF );
73 /* Set user-defined mode */
74 stream->status |= mode;
81 #include <_PDCLIB_test.h>
85 #define BUFFERSIZE 500
90 char const * const filename = "testfile";
91 char buffer[ BUFFERSIZE ];
94 /* full buffered, user-supplied buffer */
95 TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL );
96 TESTCASE( setvbuf( fh, buffer, _IOFBF, BUFFERSIZE ) == 0 );
97 TESTCASE( fh->buffer == buffer );
98 TESTCASE( fh->bufsize == BUFFERSIZE );
99 TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOFBF );
100 TESTCASE( fclose( fh ) == 0 );
101 TESTCASE( remove( filename ) == 0 );
102 /* line buffered, lib-supplied buffer */
103 TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL );
104 TESTCASE( setvbuf( fh, NULL, _IOLBF, BUFFERSIZE ) == 0 );
105 TESTCASE( fh->buffer != NULL );
106 TESTCASE( fh->bufsize == BUFFERSIZE );
107 TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOLBF );
108 TESTCASE( fclose( fh ) == 0 );
109 TESTCASE( remove( filename ) == 0 );
110 /* not buffered, user-supplied buffer */
111 TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL );
112 TESTCASE( setvbuf( fh, buffer, _IONBF, BUFFERSIZE ) == 0 );
113 TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IONBF );
114 TESTCASE( fclose( fh ) == 0 );
115 TESTCASE( remove( filename ) == 0 );
117 puts( " NOTEST setvbuf() test driver is PDCLib-specific." );