1*3163Stoy /* @(#)wbuf.c 4.2 (Berkeley) 03/09/81 */ 22003Swnj #include <stdio.h> 32003Swnj 42003Swnj char *malloc(); 52003Swnj 62003Swnj _flsbuf(c, iop) 72003Swnj register FILE *iop; 82003Swnj { 92003Swnj register char *base; 102003Swnj register n, rn; 112003Swnj char c1; 122003Swnj extern char _sobuf[]; 132003Swnj 14*3163Stoy if (iop->_flag & _IORW) { 15*3163Stoy iop->_flag |= _IOWRT; 16*3163Stoy iop->_flag &= ~_IOEOF; 17*3163Stoy } 18*3163Stoy 192003Swnj if ((iop->_flag&_IOWRT)==0) 202003Swnj return(EOF); 212003Swnj tryagain: 222003Swnj if (iop->_flag&_IOLBF) { 232003Swnj base = iop->_base; 242003Swnj *iop->_ptr++ = c; 252003Swnj if (iop->_ptr >= base+BUFSIZ || c == '\n') { 262003Swnj n = write(fileno(iop), base, rn = iop->_ptr - base); 272003Swnj iop->_ptr = base; 282003Swnj } else 292003Swnj rn = n = 0; 302003Swnj iop->_cnt = 0; 312003Swnj } else if (iop->_flag&_IONBF) { 322003Swnj c1 = c; 332003Swnj rn = 1; 342003Swnj n = write(fileno(iop), &c1, rn); 352003Swnj iop->_cnt = 0; 362003Swnj } else { 372003Swnj if ((base=iop->_base)==NULL) { 382003Swnj if (iop==stdout) { 392003Swnj if (isatty(fileno(stdout))) 402003Swnj iop->_flag |= _IOLBF; 412003Swnj iop->_base = _sobuf; 422003Swnj iop->_ptr = _sobuf; 432003Swnj goto tryagain; 442003Swnj } 452003Swnj if ((iop->_base=base=malloc(BUFSIZ)) == NULL) { 462003Swnj iop->_flag |= _IONBF; 472003Swnj goto tryagain; 482003Swnj } 492003Swnj iop->_flag |= _IOMYBUF; 502003Swnj rn = n = 0; 512003Swnj } else if ((rn = n = iop->_ptr - base) > 0) { 522003Swnj iop->_ptr = base; 532003Swnj n = write(fileno(iop), base, n); 542003Swnj } 552003Swnj iop->_cnt = BUFSIZ-1; 562003Swnj *base++ = c; 572003Swnj iop->_ptr = base; 582003Swnj } 592003Swnj if (rn != n) { 602003Swnj iop->_flag |= _IOERR; 612003Swnj return(EOF); 622003Swnj } 632003Swnj return(c); 642003Swnj } 652003Swnj 662003Swnj fflush(iop) 672003Swnj register struct _iobuf *iop; 682003Swnj { 692003Swnj register char *base; 702003Swnj register n; 712003Swnj 722003Swnj if ((iop->_flag&(_IONBF|_IOWRT))==_IOWRT 732003Swnj && (base=iop->_base)!=NULL && (n=iop->_ptr-base)>0) { 742003Swnj iop->_ptr = base; 752003Swnj iop->_cnt = (iop->_flag&(_IOLBF|_IONBF)) ? 0 : BUFSIZ; 762003Swnj if (write(fileno(iop), base, n)!=n) { 772003Swnj iop->_flag |= _IOERR; 782003Swnj return(EOF); 792003Swnj } 802003Swnj } 812003Swnj return(0); 822003Swnj } 832003Swnj 842003Swnj /* 852003Swnj * Flush buffers on exit 862003Swnj */ 872003Swnj 882003Swnj _cleanup() 892003Swnj { 902003Swnj register struct _iobuf *iop; 912003Swnj extern struct _iobuf *_lastbuf; 922003Swnj 932003Swnj for (iop = _iob; iop < _lastbuf; iop++) 942003Swnj fclose(iop); 952003Swnj } 962003Swnj 972003Swnj fclose(iop) 982003Swnj register struct _iobuf *iop; 992003Swnj { 1002003Swnj register r; 1012003Swnj 1022003Swnj r = EOF; 103*3163Stoy if (iop->_flag&(_IOREAD|_IOWRT|_IORW) && (iop->_flag&_IOSTRG)==0) { 1042003Swnj r = fflush(iop); 1052003Swnj if (close(fileno(iop)) < 0) 1062003Swnj r = EOF; 1072003Swnj if (iop->_flag&_IOMYBUF) 1082003Swnj free(iop->_base); 1092003Swnj if (iop->_flag&(_IOMYBUF|_IONBF|_IOLBF)) 1102003Swnj iop->_base = NULL; 1112003Swnj } 112*3163Stoy iop->_flag &= ~(_IOREAD|_IOWRT|_IOLBF|_IONBF|_IOMYBUF|_IOERR|_IOEOF|_IOSTRG|_IORW); 1132003Swnj iop->_cnt = 0; 1142003Swnj return(r); 1152003Swnj } 116