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