comparison packages/language/c/libc/current/src/stdio/common/fflush.cxx @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
comparison
equal deleted inserted replaced
-1:000000000000 0:3111d98ba7b3
1 //========================================================================
2 //
3 // fflush.cxx
4 //
5 // Implementation of C library file flush function as per ANSI 7.9.5.2
6 //
7 //========================================================================
8 //####COPYRIGHTBEGIN####
9 //
10 // -------------------------------------------
11 // The contents of this file are subject to the Cygnus eCos Public License
12 // Version 1.0 (the "License"); you may not use this file except in
13 // compliance with the License. You may obtain a copy of the License at
14 // http://sourceware.cygnus.com/ecos
15 //
16 // Software distributed under the License is distributed on an "AS IS"
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
18 // License for the specific language governing rights and limitations under
19 // the License.
20 //
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
22 // September 30, 1998.
23 //
24 // The Initial Developer of the Original Code is Cygnus. Portions created
25 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved.
26 // -------------------------------------------
27 //
28 //####COPYRIGHTEND####
29 //========================================================================
30 //#####DESCRIPTIONBEGIN####
31 //
32 // Author(s): jlarmour@cygnus.co.uk
33 // Contributors: jlarmour@cygnus.co.uk
34 // Date: 1998-02-13
35 // Purpose:
36 // Description:
37 // Usage:
38 //
39 //####DESCRIPTIONEND####
40 //
41 //========================================================================
42
43 // CONFIGURATION
44
45 #include <pkgconf/libc.h> // Configuration header
46
47
48 // Include the C library? And do we want the stdio stuff?
49 #if defined(CYGPKG_LIBC) && defined(CYGPKG_LIBC_STDIO)
50
51 // INCLUDES
52
53 #include <cyg/infra/cyg_type.h> // Common project-wide type definitions
54 #include <stddef.h> // NULL and size_t from compiler
55 #include <errno.h> // Error codes
56 #include <stdio.h> // header for fflush()
57 #include "clibincl/stream.hxx" // C library streams
58 #include "clibincl/clibdata.hxx" // C library private data
59 #include "clibincl/stdiosupp.hxx" // support for stdio
60
61
62 // EXPORTED SYMBOLS
63
64 externC int
65 fflush( FILE * ) CYGPRI_LIBC_WEAK_ALIAS("_fflush");
66
67
68 // FUNCTIONS
69
70
71 externC int
72 _fflush( FILE *stream )
73 {
74 Cyg_StdioStream *real_stream = (Cyg_StdioStream *)stream;
75 int i;
76 Cyg_ErrNo err=ENOERR;
77
78 if (stream == NULL) { // tells us to flush ALL streams
79 cyg_bool files_flushed[FOPEN_MAX] = { false }; // sets all to 0
80 cyg_bool loop_again;
81
82 do {
83 loop_again = false;
84
85 for (i=0; (i<FOPEN_MAX) && !err; i++) {
86 if (files_flushed[i] == false) {
87
88 real_stream = Cyg_CLibInternalData::get_file_stream(i);
89
90 if (real_stream == NULL) {
91 // if it isn't a valid stream, set its entry in the
92 // list of files flushed since we don't want to
93 // flush it
94
95 files_flushed[i] = true;
96 } // if
97 else {
98 // valid stream
99
100 if ( real_stream->trylock_me() ) {
101 err = real_stream->flush_output_unlocked();
102 real_stream->unlock_me();
103 files_flushed[i] = true;
104 } // if
105 else
106 loop_again = true;
107 } // else
108 } // if
109 } // for
110 } // do
111 while(loop_again && !err);
112
113 } // if
114 else {
115 err = real_stream->flush_output();
116 } // else
117
118 if (err) {
119 errno = err;
120 return EOF;
121 } // if
122
123 return 0;
124
125 } // _fflush()
126
127 #endif // if defined(CYGPKG_LIBC) && defined(CYGPKG_LIBC_STDIO)
128
129 // EOF fflush.cxx