#include #include "stdio.h" extern int __fflush(FILE *); int __swbuf(int c, FILE *stream) /* Get next output block */ { int out, lbs; short flags = stream->_flags; __STDIO_LOCK(stream); if (flags & (__SSTR | __SERR | __SRD)) { if (flags & (__SSTR | __SERR)) /* sprintf buffer | error on stream */ { stream->_w = 0; errno = EPERM; __STDIO_UNLOCK(stream); return EOF; } if (flags & __SRD) { /* was in read mode */ stream->_r = 0; /* throw away input buffer */ stream->tmpp = NULL; stream->_flags = flags &= ~__SRD; } } lbs = flags & __SLBF ? -stream->_bf._size : 0; out = (flags & __SNBF ? 0 : stream->_bf._size - 1) + lbs; if (!(flags & __SWR)) /* File wasn't in write mode */ { stream->_p = stream->_bf._base; /* set buffer */ stream->_w = --out; /* and buffercount */ stream->_flags = flags |= __SWR; } /* and write mode */ *stream->_p++ = c; /* put this character */ if (stream->_w < 0 && (stream->_w < lbs || (char) c == '\n')) { if (__fflush(stream)) /* Buffer full */ { __STDIO_UNLOCK(stream); return EOF; } stream->_p = stream->_bf._base; /* reset buffer */ stream->_flags = flags; /* set again - __fflush cleared it. */ } stream->linebufsize = lbs; stream->_w = out; __STDIO_UNLOCK(stream); return c; }