annotate packages/language/c/libc/current/src/stdio/common/fflush.cxx @ 34:29bc183297e1 ecos-sw-1999-09-02

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