ack/lang/cem/libcc.ansi/stdio/flushbuf.c

110 lines
2.5 KiB
C
Raw Normal View History

1989-05-30 13:34:25 +00:00
/*
* flushbuf.c - flush a buffer
*/
/* $Header$ */
#include <stdio.h>
#include <stdlib.h>
#include "loc_incl.h"
1989-12-18 15:04:14 +00:00
#include <sys/types.h>
off_t _lseek(int fildes, off_t offset, int whence);
int _write(int d, const char *buf, int nbytes);
int _isatty(int d);
extern void (*_clean)(void);
1989-05-30 13:34:25 +00:00
int
1989-12-18 15:04:14 +00:00
__flushbuf(int c, FILE * stream)
1989-05-30 13:34:25 +00:00
{
_clean = __cleanup;
1989-05-30 13:34:25 +00:00
if (fileno(stream) < 0) return EOF;
1989-06-26 10:37:05 +00:00
if (!io_testflag(stream, _IOWRITE)) return EOF;
if (io_testflag(stream, _IOREADING) && !feof(stream)) return EOF;
stream->_flags &= ~_IOREADING;
stream->_flags |= _IOWRITING;
1989-05-30 13:34:25 +00:00
if (!io_testflag(stream, _IONBF)) {
if (!stream->_buf) {
if (stream == stdout && _isatty(fileno(stdout))) {
1989-05-30 13:34:25 +00:00
if (!(stream->_buf =
(unsigned char *) malloc(BUFSIZ))) {
stream->_flags |= _IONBF;
1989-12-18 15:04:14 +00:00
} else {
1989-05-30 13:34:25 +00:00
stream->_flags |= _IOLBF;
stream->_bufsiz = BUFSIZ;
stream->_count = -1;
}
1989-12-18 15:04:14 +00:00
} else {
1989-05-30 13:34:25 +00:00
if (!(stream->_buf =
(unsigned char *) malloc(BUFSIZ))) {
stream->_flags |= _IONBF;
1989-12-18 15:04:14 +00:00
} else {
1989-05-30 13:34:25 +00:00
stream->_flags |= _IOMYBUF;
stream->_bufsiz = BUFSIZ;
1989-12-18 15:04:14 +00:00
if (!io_testflag(stream, _IOLBF))
stream->_count = BUFSIZ - 1;
1989-05-30 13:34:25 +00:00
}
}
stream->_ptr = stream->_buf;
}
}
if (io_testflag(stream, _IONBF)) {
char c1 = c;
stream->_count = 0;
1989-12-18 15:04:14 +00:00
if (io_testflag(stream, _IOAPPEND)) {
if (_lseek(fileno(stream), 0L, SEEK_END) == -1) {
1989-12-18 15:04:14 +00:00
stream->_flags |= _IOERR;
return EOF;
}
}
if (_write(fileno(stream), &c1, 1) != 1) {
1989-05-30 13:34:25 +00:00
stream->_flags |= _IOERR;
return EOF;
}
return c;
1989-12-18 15:04:14 +00:00
} else if (io_testflag(stream, _IOLBF)) {
1989-05-30 13:34:25 +00:00
*stream->_ptr++ = c;
if (c == '\n' || stream->_count == -stream->_bufsiz) {
1989-12-18 15:04:14 +00:00
if (io_testflag(stream, _IOAPPEND)) {
if (_lseek(fileno(stream), 0L, SEEK_END) == -1) {
1989-12-18 15:04:14 +00:00
stream->_flags |= _IOERR;
return EOF;
}
}
if (_write(fileno(stream), (char *)stream->_buf,
1989-05-30 13:34:25 +00:00
-stream->_count) != -stream->_count) {
stream->_flags |= _IOERR;
return EOF;
1989-12-18 15:04:14 +00:00
} else {
1989-05-30 13:34:25 +00:00
stream->_ptr = stream->_buf;
stream->_count = 0;
}
}
1989-12-18 15:04:14 +00:00
} else {
1989-05-30 13:34:25 +00:00
int count = stream->_ptr - stream->_buf;
stream->_count = stream->_bufsiz - 1;
stream->_ptr = stream->_buf + 1;
if (count > 0) {
1989-12-18 15:04:14 +00:00
if (io_testflag(stream, _IOAPPEND)) {
if (_lseek(fileno(stream), 0L, SEEK_END) == -1) {
1989-12-18 15:04:14 +00:00
stream->_flags |= _IOERR;
return EOF;
}
}
if (_write(fileno(stream), (char *)stream->_buf, count)
1989-05-30 13:34:25 +00:00
!= count) {
*(stream->_buf) = c;
stream->_flags |= _IOERR;
return EOF;
}
}
*(stream->_buf) = c;
}
return c;
}