int fflush(FILE *stream) { int count, c1, i, retval = 0; if (!stream) { for(i= 0; i < FOPEN_MAX; i++) if (__iotab[i] && fflush(__iotab[i])) retval = EOF; return retval; } if (!stream->_buf || (!io_testflag(stream, _IOREADING) && !io_testflag(stream, _IOWRITING))) return 0; if (io_testflag(stream, _IOREADING)) { /* (void) fseek(stream, 0L, SEEK_CUR); */ int adjust = 0; if (stream->_buf && !io_testflag(stream,_IONBF)) adjust = -stream->_count; stream->_count = 0; if (_lseek(fileno(stream), (off_t) adjust, SEEK_CUR) == -1) { stream->_flags |= _IOERR; return EOF; } if (io_testflag(stream, _IOWRITE)) stream->_flags &= ~(_IOREADING | _IOWRITING); stream->_ptr = stream->_buf; return 0; } else if (io_testflag(stream, _IONBF)) return 0; if (io_testflag(stream, _IOREAD)) /* "a" or "+" mode */ stream->_flags &= ~_IOWRITING; count = stream->_ptr - stream->_buf; stream->_ptr = stream->_buf; if ( count <= 0 ) return 0; if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } c1 = _write(stream->_fd, (char *)stream->_buf, count); stream->_count = 0; if ( count == c1 ) return 0; stream->_flags |= _IOERR; return EOF; }
void __cleanup(void) { register int i; for(i= 0; i < FOPEN_MAX; i++) if (__iotab[i] && io_testflag(__iotab[i], _IOWRITING)) (void) fflush(__iotab[i]); }
off_t ftello(FILE *stream) { long result; int adjust = 0; if (io_testflag(stream,_IOREADING)) adjust = -stream->_count; else if (io_testflag(stream,_IOWRITING) && stream->_buf && !io_testflag(stream,_IONBF)) adjust = stream->_ptr - stream->_buf; else adjust = 0; result = _lseek(fileno(stream), (off_t)0, SEEK_CUR); if ( result == -1 ) return result; result += (long) adjust; return result; }
int __fillbuf(register FILE *stream) { static unsigned char ch[FOPEN_MAX]; register int i; stream->_count = 0; if (fileno(stream) < 0) return EOF; if (io_testflag(stream, (_IOEOF | _IOERR ))) return EOF; if (!io_testflag(stream, _IOREAD)) { stream->_flags |= _IOERR; return EOF; } if (io_testflag(stream, _IOWRITING)) { stream->_flags |= _IOERR; return EOF; } if (!io_testflag(stream, _IOREADING)) stream->_flags |= _IOREADING; if (!io_testflag(stream, _IONBF) && !stream->_buf) { stream->_buf = (unsigned char *) malloc(BUFSIZ); if (!stream->_buf) { stream->_flags |= _IONBF; } else { stream->_flags |= _IOMYBUF; stream->_bufsiz = BUFSIZ; } } /* flush line-buffered output when filling an input buffer */ for (i = 0; i < FOPEN_MAX; i++) { if (__iotab[i] && io_testflag(__iotab[i], _IOLBF)) if (io_testflag(__iotab[i], _IOWRITING)) (void) fflush(__iotab[i]); } if (!stream->_buf) { stream->_buf = &ch[fileno(stream)]; stream->_bufsiz = 1; } stream->_ptr = stream->_buf; stream->_count = _read(stream->_fd, (char *)stream->_buf, stream->_bufsiz); if (stream->_count <= 0){ if (stream->_count == 0) { stream->_flags |= _IOEOF; } else stream->_flags |= _IOERR; return EOF; } stream->_count--; return *stream->_ptr++; }
int ungetc(int ch, FILE *stream) { unsigned char *p; if (ch == EOF || !io_testflag(stream,_IOREADING)) return EOF; if (stream->_ptr == stream->_buf) { if (stream->_count != 0) return EOF; stream->_ptr++; } stream->_count++; p = --(stream->_ptr); /* ??? Bloody vax assembler !!! */ /* ungetc() in sscanf() shouldn't write in rom */ if (*p != (unsigned char) ch) *p = (unsigned char) ch; return ch; }
int fclose(FILE *fp) { register int i, retval = 0; for (i=0; i<FOPEN_MAX; i++) if (fp == __iotab[i]) { __iotab[i] = 0; break; } if (i >= FOPEN_MAX) return EOF; if (fflush(fp)) retval = EOF; if (_close(fileno(fp))) retval = EOF; if ( io_testflag(fp,_IOMYBUF) && fp->_buf ) free((void *)fp->_buf); if (fp != stdin && fp != stdout && fp != stderr) free((void *)fp); return retval; }
int setvbuf(register FILE *stream, char *buf, int mode, size_t size) { int retval = 0; _clean = __cleanup; if (mode != _IOFBF && mode != _IOLBF && mode != _IONBF) return EOF; if (stream->_buf && io_testflag(stream,_IOMYBUF) ) free((void *)stream->_buf); stream->_flags &= ~(_IOMYBUF | _IONBF | _IOLBF); if (buf && size <= 0) retval = EOF; if (!buf && (mode != _IONBF)) { if (size <= 0 || (buf = (char *) malloc(size)) == NULL) { retval = EOF; } else { stream->_flags |= _IOMYBUF; } } stream->_buf = (unsigned char *) buf; stream->_count = 0; stream->_flags |= mode; stream->_ptr = stream->_buf; if (!buf) { stream->_bufsiz = 1; } else { stream->_bufsiz = size; } return retval; }
int __flushbuf(int c, FILE * stream) { _clean = __cleanup; if (fileno(stream) < 0) return (unsigned char) c; if (!io_testflag(stream, _IOWRITE)) return EOF; if (io_testflag(stream, _IOREADING) && !feof(stream)) return EOF; stream->_flags &= ~_IOREADING; stream->_flags |= _IOWRITING; if (!io_testflag(stream, _IONBF)) { if (!stream->_buf) { if (stream == stdout && _isatty(fileno(stdout))) { if (!(stream->_buf = (unsigned char *) malloc(BUFSIZ))) { stream->_flags |= _IONBF; } else { stream->_flags |= _IOLBF|_IOMYBUF; stream->_bufsiz = BUFSIZ; stream->_count = -1; } } else { if (!(stream->_buf = (unsigned char *) malloc(BUFSIZ))) { stream->_flags |= _IONBF; } else { stream->_flags |= _IOMYBUF; stream->_bufsiz = BUFSIZ; if (!io_testflag(stream, _IOLBF)) stream->_count = BUFSIZ - 1; else stream->_count = -1; } } stream->_ptr = stream->_buf; } } if (io_testflag(stream, _IONBF)) { char c1 = c; stream->_count = 0; if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } if (_write(fileno(stream), &c1, 1) != 1) { stream->_flags |= _IOERR; return EOF; } return (unsigned char) c; } else if (io_testflag(stream, _IOLBF)) { *stream->_ptr++ = c; /* stream->_count has been updated in putc macro. */ if (c == '\n' || stream->_count == -stream->_bufsiz) { int count = -stream->_count; stream->_ptr = stream->_buf; stream->_count = 0; if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } if (! do_write(fileno(stream), (char *)stream->_buf, count)) { stream->_flags |= _IOERR; return EOF; } } } else { int count = stream->_ptr - stream->_buf; stream->_count = stream->_bufsiz - 1; stream->_ptr = stream->_buf + 1; if (count > 0) { if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } if (! do_write(fileno(stream), (char *)stream->_buf, count)) { *(stream->_buf) = c; stream->_flags |= _IOERR; return EOF; } } *(stream->_buf) = c; } return (unsigned char) c; }