1 /* Copyright (C) 2004 Manuel Novoa III <mjn3@codepoet.org>
3 * GNU Library General Public License (LGPL) version 2 or later.
5 * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details.
10 libc_hidden_proto(memchr)
11 libc_hidden_proto(memcpy)
12 libc_hidden_proto(memrchr)
14 #ifdef __STDIO_BUFFERS
16 /* Either buffer data or (commit buffer if necessary and) write. */
18 size_t attribute_hidden __stdio_fwrite(const unsigned char * __restrict buffer,
20 register FILE * __restrict stream)
23 const unsigned char *p;
25 __STDIO_STREAM_VALIDATE(stream);
26 assert(__STDIO_STREAM_IS_WRITING(stream));
30 if (!__STDIO_STREAM_IS_NBF(stream)) { /* FBF or LBF. */
31 #ifdef __UCLIBC_MJN3_ONLY__
32 #warning CONSIDER: Try to consolidate some of the code?
34 if (__STDIO_STREAM_IS_FAKE_VSNPRINTF(stream)) {
35 pending = __STDIO_STREAM_BUFFER_WAVAIL(stream);
36 if (pending > bytes) {
39 memcpy(stream->__bufpos, buffer, pending);
40 stream->__bufpos += pending;
41 __STDIO_STREAM_VALIDATE(stream);
46 if (bytes <= __STDIO_STREAM_BUFFER_WAVAIL(stream)) {
47 memcpy(stream->__bufpos, buffer, bytes);
48 stream->__bufpos += bytes;
49 if (__STDIO_STREAM_IS_LBF(stream)
50 && memrchr(buffer, '\n', bytes) /* Search backwards. */
52 if ((pending = __STDIO_COMMIT_WRITE_BUFFER(stream)) > 0) {
53 if (pending > bytes) {
56 buffer += (bytes - pending);
57 if ((p = memchr(buffer, '\n', pending)) != NULL) {
58 pending = (buffer + pending) - p;
60 stream->__bufpos -= pending;
64 __STDIO_STREAM_VALIDATE(stream);
67 /* FBF or LBF and not enough space in buffer. */
68 if (__STDIO_STREAM_BUFFER_WUSED(stream)) { /* Buffered data. */
69 if (__STDIO_COMMIT_WRITE_BUFFER(stream)) { /* Commit failed! */
72 #ifdef __UCLIBC_MJN3_ONLY__
73 #warning CONSIDER: Do we want to try again if data now fits in buffer?
79 return __stdio_WRITE(stream, buffer, bytes);