1 /* Copyright (C) 1991 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA. */
25 /* Write NMEMB chunks of SIZE bytes each from PTR onto STREAM. */
27 DEFUN(fwrite, (ptr, size, nmemb, stream),
28 CONST PTR ptr AND size_t size AND
29 size_t nmemb AND register FILE *stream)
31 register CONST char *p = (CONST char *) ptr;
32 register size_t to_write = size * nmemb;
33 register size_t written = 0;
38 if (!__validfp(stream) || !stream->__mode.__write)
46 if (p == NULL || to_write == 0)
49 if (!stream->__seen || stream->__put_limit == stream->__buffer)
51 /* This stream has never been seen before.
52 Calling __flshfp will give it a buffer
53 and I/O functions if it needs them. */
54 if (__flshfp(stream, *p++) == EOF)
63 = stream->__room_funcs.__output == __default_room_functions.__output;
65 if (__stdio_check_offset (stream) == EOF)
71 if (stream->__buffer == NULL && default_func &&
72 stream->__offset == stream->__target)
74 /* This is an unbuffered stream using the standard output
75 buffer-flushing function, so we just do a straight write. */
77 int count = (stream->__io_funcs.__write == NULL ? to_write :
78 (*stream->__io_funcs.__write)(stream->__cookie, p,
83 stream->__offset += count;
84 stream->__target = stream->__offset;
93 /* We ignore the end pointer here since we want to find out how much space
94 is really in the buffer, even for a line-buffered stream. */
95 buffer_space = stream->__bufsize - (stream->__bufp - stream->__buffer);
97 newlinep = (stream->__linebuf &&
98 memchr((CONST PTR) p, '\n', to_write) != NULL);
100 if (newlinep && stream->__bufp == stream->__buffer &&
101 stream->__offset == stream->__target)
102 /* The buffer's empty, and we want to write our data
103 out soon anyway, so just write it straight out. */
106 if (stream->__bufsize == 0 && !default_func)
108 /* No buffer, and a special function.
109 We can't do much better than putc. */
110 while (to_write-- > 0)
112 if (__flshfp(stream, *p++) == EOF)
118 else if (!default_func || buffer_space >= to_write)
120 /* There is enough room in the buffer for everything we
121 want to write or the user has specified his own output
122 buffer-flushing/expanding function. */
125 register size_t n = to_write;
127 if (n > buffer_space)
137 *stream->__bufp++ = *p++;
140 memcpy((PTR) stream->__bufp, (PTR) p, n);
145 if (buffer_space == 0 || (to_write == 0 && newlinep))
147 /* We've filled the buffer, so flush it. */
148 if (fflush(stream) == EOF)
154 /* It won't all fit in the buffer. */
156 if (stream->__bufp != stream->__buffer)
158 /* There are characters in the buffer. Flush them. */
159 if (__flshfp(stream, EOF) == EOF)
163 /* The buffer has been flushed.
164 Now either fill it or write directly. */
166 buffer_space = stream->__put_limit - stream->__bufp;
168 if (stream->__offset == stream->__target &&
169 (buffer_space < to_write || newlinep))
170 /* What we have to write is bigger than the buffer,
171 or it contains a newline and we're line-buffered,
175 /* It will fit in the buffer. */
180 return (size_t) written / size;