1 /* stdio on a Mach device port.
2 Translates \n to \r\n on output.
4 Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
5 This file is part of the GNU C Library.
7 The GNU C Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public License as
9 published by the Free Software Foundation; either version 2 of the
10 License, or (at your option) any later version.
12 The GNU C Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
17 You should have received a copy of the GNU Library General Public
18 License along with the GNU C Library; see the file COPYING.LIB. If
19 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
20 Cambridge, MA 02139, USA. */
24 #include <device/device.h>
34 mach_msg_type_size_t nread;
37 if (f->__buffer == NULL)
45 to_read = f->__bufsize;
51 if (err = device_read_inband ((device_t) f->__cookie, 0, f->__target,
52 to_read, buffer, &nread))
55 f->__bufp = f->__get_limit = f->__put_limit = f->__buffer;
60 if (f->__buffer == NULL)
61 return (unsigned char) c;
63 f->__get_limit = f->__buffer + nread;
64 f->__bufp = f->__buffer;
65 f->__put_limit = f->__buffer + (f->__mode.__write ? f->__bufsize : 0);
66 return (unsigned char) *f->__bufp++;
71 output (FILE *f, int c)
73 inline void write_some (const char *p, size_t to_write)
79 if (err = device_write ((device_t) f->__cookie, 0,
80 f->__target, (char *)p,
93 if (f->__buffer != NULL)
95 if (f->__put_limit == f->__buffer)
97 /* Prime the stream for writing. */
98 f->__put_limit = f->__buffer + f->__bufsize;
99 f->__bufp = f->__buffer;
102 *f->__bufp++ = (unsigned char) c;
108 /* Write out the buffer. */
110 write_some (f->__buffer, f->__bufp - f->__buffer);
112 f->__bufp = f->__buffer;
115 if (c != EOF && !ferror (f))
117 if (f->__linebuf && (unsigned char) c == '\n')
119 static const char nl = '\n';
123 *f->__bufp++ = (unsigned char) c;
129 #if 0 /* Translates \n to \r\n. */
131 output (FILE *f, int c)
133 void write_some (const char *p, size_t to_write)
139 if (err = device_write_inband ((device_t) f->__cookie, 0,
140 f->__target, p, to_write, &wrote))
148 f->__target += wrote;
151 void write_crlf (void)
153 static const char crlf[] = "\r\n";
154 write_some (crlf, 2);
157 if (f->__buffer == NULL)
159 /* The stream is unbuffered. */
165 char cc = (unsigned char) c;
172 if (f->__put_limit == f->__buffer)
174 /* Prime the stream for writing. */
175 f->__put_limit = f->__buffer + f->__bufsize;
176 f->__bufp = f->__buffer;
179 *f->__bufp++ = (unsigned char) c;
185 /* Search for newlines (LFs) in the buffer. */
187 char *start = f->__buffer, *p = start;
189 while (!ferror (f) && (p = memchr (p, '\n', f->__bufp - start)))
191 /* Found one. Replace it with a CR and write out through that CR. */
194 write_some (start, p + 1 - start);
196 /* Change it back to an LF; the next iteration will write it out
197 first thing. Start the next searching iteration one char later. */
203 /* Write the remainder of the buffer. */
206 write_some (start, f->__bufp - start);
209 f->__bufp = f->__buffer;
211 if (c != EOF && !ferror (f))
213 if (f->__linebuf && (unsigned char) c == '\n')
216 *f->__bufp++ = (unsigned char) c;
222 mach_open_devstream (mach_port_t dev, const char *mode)
224 FILE *stream = fopencookie ((void *) dev, mode, __default_io_functions);
228 stream->__room_funcs.__input = input;
229 stream->__room_funcs.__output = output;
230 stream->__io_funcs.__close = (__io_close_fn *) device_close;