annotate packages/language/c/libc/current/src/stdio/common/stream.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
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 // stream.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 // Implementations of internal C library stdio stream functions
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved.
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 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 // Author(s): jlarmour@cygnus.co.uk
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 // Contributors: jlarmour@cygnus.co.uk
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
34 // Date: 1998-02-13
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
35 // Purpose:
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 // Include the C library? And do we want the stdio stuff?
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 #if defined(CYGPKG_LIBC) && defined(CYGPKG_LIBC_STDIO)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 // INCLUDES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 #include <cyg/infra/cyg_type.h> // Common project-wide type definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 #include <stddef.h> // NULL and size_t from compiler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <errno.h> // Error codes
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include "clibincl/stringsupp.hxx" // _memcpy()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 #include "clibincl/stream.hxx" // Header for this file
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 #include <cyg/devs/common/iorb.h> // Cyg_IORB
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/devs/common/table.h> // Device table
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 // FUNCTIONS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 Cyg_StdioStream::Cyg_StdioStream(Cyg_Device_Table_t *dev,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 OpenMode open_mode,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 cyg_bool append, cyg_bool binary,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 int buffer_mode, cyg_ucount32 buffer_size,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 cyg_uint8 *buffer_addr )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 : io_buf( buffer_size, buffer_addr )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 magic_validity_word = 0xbadbad;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 my_device = dev;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 // Clear all flags
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 _memset( &flags, 0, sizeof(flags) );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 switch (open_mode) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 case CYG_STREAM_READ:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 flags.opened_for_read = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 case CYG_STREAM_WRITE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 flags.opened_for_write = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 case CYG_STREAM_READWRITE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 flags.opened_for_read = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 flags.opened_for_write = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 error=EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 } // switch
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 if (flags.opened_for_write) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 if (!my_device->write_blocking) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 error = EDEVNOSUPP;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 flags.last_buffer_op_was_read = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 if (flags.opened_for_read) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 if (!my_device->read_blocking) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 error = EDEVNOSUPP;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 // NB also if opened for read AND write, then say last op was read
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 flags.last_buffer_op_was_read = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 #endif
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 flags.binary = binary ? 1 : 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 error = ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 // in due course we would do an equivalent to fseek(...,0, SEEK_END);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 // when appending. for now, there's nothing, except set eof
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 flags.at_eof = append ? 1 : 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 position = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 switch (buffer_mode) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 case _IONBF:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 CYG_ASSERT( (buffer_size == 0) && (buffer_addr == NULL),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 "No buffering wanted but size/address specified!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 flags.buffering = flags.line_buffering = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 case _IOLBF:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 flags.buffering = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 flags.line_buffering = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 case _IOFBF:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 flags.buffering = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 flags.line_buffering = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 error = EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 } // switch
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 // one way of checking the buffer was set up correctly
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157 if (io_buf.get_buffer_size()==-1) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158 error = ENOMEM;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164 if (my_device->open) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 error = (*my_device->open)( my_device->cookie,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166 binary ? CYG_DEVICE_OPEN_MODE_RAW
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 : CYG_DEVICE_OPEN_MODE_TEXT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 if (error != ENOERR)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 return; // keep error code the same
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 magic_validity_word = 0x7b4321ce;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 } // Cyg_StdioStream constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 Cyg_ErrNo
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 Cyg_StdioStream::refill_read_buffer( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 Cyg_ErrNo read_err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 Cyg_IORB iorb;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 CYG_ASSERTCLASS( this, "Stream object is not a valid stream!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 if (!lock_me())
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 return EBADF; // assume file is now invalid
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 // first just check that we _can_ read this device!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 if (!flags.opened_for_read) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 return EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 // If there is pending output to write, then this will check and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 // write it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 if (flags.buffering) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 read_err = flush_output_unlocked();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204 if (read_err != ENOERR) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 return read_err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212 // we're now reading
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 flags.last_buffer_op_was_read = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 if (flags.buffering) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 iorb.buffer_length =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 io_buf.get_buffer_addr_to_write( (cyg_uint8**)&iorb.buffer );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222 if (!flags.readbuf_char_in_use) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 iorb.buffer_length = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 iorb.buffer = &readbuf_char;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 iorb.buffer_length = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 if (!iorb.buffer_length) { // no buffer space available
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 return ENOERR; // isn't an error, just needs user to read out data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234 read_err = (*my_device->read_blocking)( my_device->cookie, &iorb );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
236
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
237 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238 if (flags.buffering)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 io_buf.set_bytes_written( iorb.xferred_length );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
242 flags.readbuf_char_in_use = iorb.xferred_length ? 1 : 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
243
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246 if (read_err == ENOERR) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247 if (iorb.xferred_length == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248 read_err = EAGAIN;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 return read_err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252 } // refill_read_buffer()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255 Cyg_ErrNo
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
256 Cyg_StdioStream::read( cyg_uint8 *user_buffer, cyg_ucount32 buffer_length,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 cyg_ucount32 *bytes_read )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259 CYG_ASSERTCLASS( this, "Stream object is not a valid stream!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261 *bytes_read = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 if (!lock_me())
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 return EBADF; // assume file is now invalid
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 if (!flags.opened_for_read) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 return EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 #ifdef CYGFUN_LIBC_STDIO_ungetc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272 if (flags.unread_char_buf_in_use && buffer_length) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 *user_buffer++ = unread_char_buf;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 ++*bytes_read;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 flags.unread_char_buf_in_use = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
276 --buffer_length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279 #endif // ifdef CYGFUN_LIBC_STDIO_ungetc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 if (flags.buffering) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 cyg_uint8 *buff_to_read_from;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 cyg_ucount32 bytes_available;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
285 Cyg_ErrNo err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287 // this should really only be called after refill_read_buffer, but
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
288 // just in case
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289 err = flush_output_unlocked();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291 if (err != ENOERR) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 return err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 // we're now reading
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297 flags.last_buffer_op_was_read = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 bytes_available = io_buf.get_buffer_addr_to_read(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
300 (cyg_uint8 **)&buff_to_read_from );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 *bytes_read += (bytes_available < buffer_length) ? bytes_available
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303 : buffer_length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 if (*bytes_read) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 memcpy( user_buffer, buff_to_read_from, *bytes_read );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306 io_buf.set_bytes_read( *bytes_read );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 if (flags.readbuf_char_in_use && buffer_length) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 *user_buffer = readbuf_char;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 *bytes_read = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 flags.readbuf_char_in_use = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 return ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323 } // read()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
324
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
325
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326 Cyg_ErrNo
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
327 Cyg_StdioStream::read_byte( cyg_uint8 *c )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 Cyg_ErrNo err=ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
331 CYG_ASSERTCLASS( this, "Stream object is not a valid stream!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
332
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333 if (!lock_me())
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334 return EBADF; // assume file is now invalid
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 if (!flags.opened_for_read) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338 return EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
340
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341 // this should really only be called after refill_read_buffer, but just
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342 // in case
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
344 if (flags.buffering)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
345 err = flush_output_unlocked();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347 if (err != ENOERR)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
348 return err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
349
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
350 // we're now reading
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
351 flags.last_buffer_op_was_read = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
352 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
353
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354 # ifdef CYGFUN_LIBC_STDIO_ungetc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355 if (flags.unread_char_buf_in_use) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
356 *c = unread_char_buf;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357 flags.unread_char_buf_in_use = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
359 return ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
360 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
361 # endif // ifdef CYGFUN_LIBC_STDIO_ungetc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
362
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364 if (flags.buffering) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365 cyg_uint8 *buff_to_read_from;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366 cyg_ucount32 bytes_available;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368 bytes_available=io_buf.get_buffer_addr_to_read(&buff_to_read_from);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370 if (bytes_available) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371 *c = *buff_to_read_from;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372 io_buf.set_bytes_read(1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 err = EAGAIN;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382 if (flags.readbuf_char_in_use) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383 *c = readbuf_char;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384 flags.readbuf_char_in_use = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
386 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387 err = EAGAIN;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391 return err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392 } // read_byte()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395 Cyg_ErrNo
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
396 Cyg_StdioStream::peek_byte( cyg_uint8 *c )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398 Cyg_ErrNo err=ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
399
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400 CYG_ASSERTCLASS( this, "Stream object is not a valid stream!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402 if (!lock_me())
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403 return EBADF; // assume file is now invalid
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 if (!flags.opened_for_read) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
407 return EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 // this should really only be called after refill_read_buffer, but just
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 // in case
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 if (flags.buffering)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 err = flush_output_unlocked();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416 if (err != ENOERR)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417 return err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
418
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419 // we're now reading
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420 flags.last_buffer_op_was_read = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423 # ifdef CYGFUN_LIBC_STDIO_ungetc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424 if (flags.unread_char_buf_in_use) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425 *c = unread_char_buf;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427 return ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429 # endif // ifdef CYGFUN_LIBC_STDIO_ungetc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 if (flags.buffering) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433 cyg_uint8 *buff_to_read_from;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434 cyg_ucount32 bytes_available;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436 bytes_available=io_buf.get_buffer_addr_to_read(&buff_to_read_from);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438 if (bytes_available) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 *c = *buff_to_read_from;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 err = EAGAIN;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
448
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
449 if (flags.readbuf_char_in_use) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450 *c = readbuf_char;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
451 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453 err = EAGAIN;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
454
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
456
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
457 return err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
458 } // peek_byte()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461 Cyg_ErrNo
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462 Cyg_StdioStream::flush_output_unlocked( void )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465 Cyg_IORB iorb;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 Cyg_ErrNo write_err=ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
468 CYG_ASSERTCLASS( this, "Stream object is not a valid stream!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
469
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
470 if ( flags.last_buffer_op_was_read )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
471 return ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
472
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
473 // first just check that we _can_ write to the device!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474 if ( !flags.opened_for_write )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
475 return EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
476
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
477 // shortcut if nothing to do
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
478 if (io_buf.get_buffer_space_used() == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
479 return ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
481 iorb.buffer_length =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482 io_buf.get_buffer_addr_to_read( (cyg_uint8 **)&iorb.buffer );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484 CYG_ASSERT( iorb.buffer_length > 0,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485 "There should be data to read but there isn't!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
486
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
487 write_err = (*my_device->write_blocking)( my_device->cookie, &iorb );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489 // we've just read it all, so just wipe it out
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
490 io_buf.drain_buffer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492 return write_err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
493
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
494 #else // ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
495
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
496 CYG_ASSERTCLASS( this, "Stream object is not a valid stream!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
497
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
498 return ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
499
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
500 #endif // ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
501 } // flush_output_unlocked()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
502
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
503
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
504
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
505 Cyg_ErrNo
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
506 Cyg_StdioStream::write( const cyg_uint8 *buffer,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
507 cyg_ucount32 buffer_length,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
508 cyg_ucount32 *bytes_written )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
509 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
510 Cyg_ErrNo write_err = ENOERR;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
511
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
512 CYG_ASSERTCLASS( this, "Stream object is not a valid stream!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
513
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
514 *bytes_written = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
515
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516 if (!lock_me())
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
517 return EBADF; // assume file is now invalid
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
518
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
519 // first just check that we _can_ write to the device!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
520 if ( !flags.opened_for_write ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
521 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
522 return EINVAL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
523 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
524
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
525 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
526 if (flags.last_buffer_op_was_read == true)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
527 io_buf.drain_buffer(); // nuke input bytes to prevent confusion
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
528
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
529 flags.last_buffer_op_was_read = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
530
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
531 if (!flags.buffering) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
532 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
533 Cyg_IORB iorb;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
534 iorb.buffer = (char *)buffer;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
535 iorb.buffer_length = buffer_length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
536
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
537 write_err = (*my_device->write_blocking)( my_device->cookie,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
538 &iorb );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
539
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
540 *bytes_written = iorb.xferred_length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
541
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
542 #ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
543 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
544 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
545 cyg_ucount32 bytes_available;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
546 cyg_ucount32 bytes_to_write;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
547 cyg_ucount32 newline_pos;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
548 cyg_uint8 *write_addr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
549 cyg_bool must_flush = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
550
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551 while ( buffer_length > 0 ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
552 bytes_available =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553 io_buf.get_buffer_addr_to_write( &write_addr );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
554
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 // we need to flush if we've no room or the buffer has an up
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556 // and coming newline
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
557 if ( !bytes_available || must_flush ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 write_err = flush_output_unlocked();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
560 // harmless even if there was an error
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
561 bytes_available =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562 io_buf.get_buffer_addr_to_write( &write_addr );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
564 CYG_ASSERT( bytes_available > 0,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
565 "Help! still no bytes available in "
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
566 "write buffer" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
568
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
569 if (write_err) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
571 return write_err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
572 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
573
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574 // choose the lower of the buffer available and the length
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
575 // to write
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
576 bytes_to_write=(bytes_available < buffer_length)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
577 ? bytes_available
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578 : buffer_length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
579
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
580 // if we're line buffered, we may want want to flush if there's
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
581 // a newline character, so lets find out
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
583 if (flags.line_buffering) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
584 for (newline_pos=0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
585 newline_pos<bytes_to_write;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
586 newline_pos++) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
587 if (buffer[newline_pos] == '\n') {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
588 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
589 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
590 } // for
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
591 // if we didn't reach the end
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
592 if (newline_pos != bytes_to_write) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
593 // shrink bytes_to_write down to the bit we need to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594 // flush including the newline itself
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 bytes_to_write = newline_pos + 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596 must_flush = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
597 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
598 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
599
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600 _memcpy( write_addr, buffer, bytes_to_write );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
602 *bytes_written += bytes_to_write;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603 buffer += bytes_to_write;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
604 buffer_length -= bytes_to_write;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605 io_buf.set_bytes_written( bytes_to_write );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607 } // while
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609 if ( must_flush ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610 write_err = flush_output_unlocked();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 } // if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612 } // else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613 #endif // ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
614
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
615 unlock_me();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617 return write_err;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
618 } // write()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
619
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621 #endif // if defined(CYGPKG_LIBC) && defined(CYGPKG_LIBC_STDIO)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
623 // EOF stream.cxx