]> pd.if.org Git - pdclib/blob - functions/stdio/fputs.c
Comment cleanups.
[pdclib] / functions / stdio / fputs.c
1 /* fputs( const char *, FILE * )
2
3    This file is part of the Public Domain C Library (PDCLib).
4    Permission is granted to use, modify, and / or redistribute at will.
5 */
6
7 #include <stdio.h>
8
9 #ifndef REGTEST
10 #include <_PDCLIB_glue.h>
11
12 int fputs( const char * _PDCLIB_restrict s, struct _PDCLIB_file_t * _PDCLIB_restrict stream )
13 {
14     if ( _PDCLIB_prepwrite( stream ) == EOF )
15     {
16         return EOF;
17     }
18     while ( *s != '\0' )
19     {
20         /* Unbuffered and line buffered streams get flushed when fputs() does
21            write the terminating end-of-line. All streams get flushed if the
22            buffer runs full.
23         */
24         stream->buffer[ stream->bufidx++ ] = *s;
25         if ( ( stream->bufidx == stream->bufsize ) ||
26              ( ( stream->status & _IOLBF ) && *s == '\n' )
27            )
28         {
29             if ( _PDCLIB_flushbuffer( stream ) == EOF )
30             {
31                 return EOF;
32             }
33         }
34         ++s;
35     }
36     if ( stream->status & _IONBF )
37     {
38         if ( _PDCLIB_flushbuffer( stream ) == EOF )
39         {
40             return EOF;
41         }
42     }
43     return 0;
44 }
45
46 #endif
47 #ifdef TEST
48 #include <_PDCLIB_test.h>
49
50 int main( void )
51 {
52     char const * const message = "SUCCESS testing fputs()";
53     FILE * fh;
54     TESTCASE( ( fh = tmpfile() ) != NULL );
55     TESTCASE( fputs( message, fh ) >= 0 );
56     rewind( fh );
57     for ( size_t i = 0; i < 23; ++i )
58     {
59         TESTCASE( fgetc( fh ) == message[i] );
60     }
61     TESTCASE( fclose( fh ) == 0 );
62     return TEST_RESULTS;
63 }
64
65 #endif
66