|
|
1.1 ! root 1: /* @(#)flsbuf.c 4.6 (Berkeley) 6/30/83 */ ! 2: #include <stdio.h> ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: ! 6: char *malloc(); ! 7: ! 8: _flsbuf(c, iop) ! 9: register FILE *iop; ! 10: { ! 11: register char *base; ! 12: register n, rn; ! 13: char c1; ! 14: int size; ! 15: struct stat stbuf; ! 16: extern char _sobuf[]; ! 17: ! 18: if (iop->_flag & _IORW) { ! 19: iop->_flag |= _IOWRT; ! 20: iop->_flag &= ~(_IOEOF|_IOREAD); ! 21: } ! 22: ! 23: if ((iop->_flag&_IOWRT)==0) ! 24: return(EOF); ! 25: tryagain: ! 26: if (iop->_flag&_IOLBF) { ! 27: base = iop->_base; ! 28: *iop->_ptr++ = c; ! 29: if (iop->_ptr >= base+iop->_bufsiz || c == '\n') { ! 30: n = write(fileno(iop), base, rn = iop->_ptr - base); ! 31: iop->_ptr = base; ! 32: } else ! 33: rn = n = 0; ! 34: iop->_cnt = 0; ! 35: } else if (iop->_flag&_IONBF) { ! 36: c1 = c; ! 37: rn = 1; ! 38: n = write(fileno(iop), &c1, rn); ! 39: iop->_cnt = 0; ! 40: } else { ! 41: if ((base=iop->_base)==NULL) { ! 42: if (fstat(fileno(iop), &stbuf) < 0 || ! 43: stbuf.st_blksize <= NULL) ! 44: size = BUFSIZ; ! 45: else ! 46: size = stbuf.st_blksize; ! 47: if (iop==stdout) { ! 48: if (isatty(fileno(stdout))) ! 49: iop->_flag |= _IOLBF; ! 50: iop->_base = _sobuf; ! 51: iop->_ptr = _sobuf; ! 52: iop->_bufsiz = size; ! 53: goto tryagain; ! 54: } ! 55: if ((iop->_base=base=malloc(size)) == NULL) { ! 56: iop->_flag |= _IONBF; ! 57: goto tryagain; ! 58: } ! 59: iop->_flag |= _IOMYBUF; ! 60: iop->_bufsiz = size; ! 61: rn = n = 0; ! 62: } else if ((rn = n = iop->_ptr - base) > 0) { ! 63: iop->_ptr = base; ! 64: n = write(fileno(iop), base, n); ! 65: } ! 66: iop->_cnt = iop->_bufsiz-1; ! 67: *base++ = c; ! 68: iop->_ptr = base; ! 69: } ! 70: if (rn != n) { ! 71: iop->_flag |= _IOERR; ! 72: return(EOF); ! 73: } ! 74: return(c); ! 75: } ! 76: ! 77: fflush(iop) ! 78: register struct _iobuf *iop; ! 79: { ! 80: register char *base; ! 81: register n; ! 82: ! 83: if ((iop->_flag&(_IONBF|_IOWRT))==_IOWRT ! 84: && (base=iop->_base)!=NULL && (n=iop->_ptr-base)>0) { ! 85: iop->_ptr = base; ! 86: iop->_cnt = (iop->_flag&(_IOLBF|_IONBF)) ? 0 : iop->_bufsiz; ! 87: if (write(fileno(iop), base, n)!=n) { ! 88: iop->_flag |= _IOERR; ! 89: return(EOF); ! 90: } ! 91: } ! 92: return(0); ! 93: } ! 94: ! 95: /* ! 96: * Flush buffers on exit ! 97: */ ! 98: ! 99: _cleanup() ! 100: { ! 101: register struct _iobuf *iop; ! 102: extern struct _iobuf *_lastbuf; ! 103: ! 104: for (iop = _iob; iop < _lastbuf; iop++) ! 105: fclose(iop); ! 106: } ! 107: ! 108: fclose(iop) ! 109: register struct _iobuf *iop; ! 110: { ! 111: register int r; ! 112: ! 113: r = EOF; ! 114: if (iop->_flag&(_IOREAD|_IOWRT|_IORW) && (iop->_flag&_IOSTRG)==0) { ! 115: r = fflush(iop); ! 116: if (close(fileno(iop)) < 0) ! 117: r = EOF; ! 118: if (iop->_flag&_IOMYBUF) ! 119: free(iop->_base); ! 120: } ! 121: iop->_cnt = 0; ! 122: iop->_base = (char *)NULL; ! 123: iop->_ptr = (char *)NULL; ! 124: iop->_bufsiz = 0; ! 125: iop->_flag = 0; ! 126: iop->_file = 0; ! 127: return(r); ! 128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.