|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 2539 (0x9eb)
Types: TextFile
Names: »flsbuf.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Pm/BSD/flsbuf.c«
/*LINTLIBRARY*/
#include <stdio.h>
/*
** It is necessary to count the number of characters that are printed.
** It was decided that the easiest way to do this would be to increment
** a counter variable in _flsbuf().
**
** Note: This source code originated from UNIX version 7 stdio.
**
** [pm by Peter Costantinidis, Jr. @ University of California at Davis]
*/
extern char *malloc();
extern long chcnt; /* counter */
int
_flsbuf(c, iop)
unsigned c;
register FILE *iop;
{
register char *base;
register n = 1, rn;
#ifdef NOSOBUF
static char _sobuf[BUFSIZ];
#else
extern char _sobuf[];
#endif
if (iop->_flag & _IORW) {
iop->_flag |= _IOWRT;
iop->_flag &= ~_IOEOF;
}
tryagain:
if (iop->_flag & _IONBF) {
/*
** hack to fix byte ordering problem
*/
char c1 = (char) c;
iop->_cnt = 0;
if (1 != write(fileno(iop), &c1, 1))
{
iop->_flag |= _IOERR;
return(EOF);
}
chcnt++; /* counter incremented */
return(c);
}
if ((base = iop->_base) == NULL) {
if (iop == stdout) {
if (isatty(fileno(stdout))) {
iop->_flag |= _IONBF;
goto tryagain;
}
iop->_base = _sobuf;
iop->_ptr = _sobuf;
goto tryagain;
}
if ((iop->_base = base = malloc(BUFSIZ)) == NULL) {
iop->_flag |= _IONBF;
goto tryagain;
}
iop->_flag |= _IOMYBUF;
rn = n = 0;
} else if((rn = n = iop->_ptr - base) > 0) {
iop->_ptr = base;
n = write(fileno(iop), base, n);
chcnt += (long) n; /* counter incremented */
}
iop->_cnt = BUFSIZ - 1;
*base++ = c;
iop->_ptr = base;
if (rn != n) {
iop->_flag |= _IOERR;
return(EOF);
}
return(c);
}
#ifndef LINT
int
fflush(iop)
register FILE *iop;
{
register char *base;
register n;
if ((iop->_flag & (_IONBF|_IOWRT)) == _IOWRT
&& (base = iop->_base) != NULL && (n = iop->_ptr - base) > 0) {
iop->_ptr = base;
iop->_cnt = BUFSIZ;
if (write(fileno(iop), base, n) != n) {
iop->_flag |= _IOERR;
return(EOF);
}
}
return(0);
}
/*
* Flush buffers on exit
*/
#ifndef BSD43
_cleanup()
{
register FILE *iop;
extern FILE *_lastbuf;
for(iop = _iob; iop < _lastbuf; iop++)
fclose(iop);
}
#endif
int
fclose(iop)
register FILE *iop;
{
register r;
r = EOF;
if (iop->_flag & (_IOREAD|_IOWRT|_IORW)
&& (iop->_flag & _IOSTRG) == 0) {
r = fflush(iop);
if (close(fileno(iop)) < 0)
r = EOF;
if (iop->_flag & _IOMYBUF)
free(iop->_base);
if (iop->_flag & (_IOMYBUF|_IONBF))
iop->_base = NULL;
}
iop->_flag &=
~(_IOREAD|_IOWRT|_IONBF|_IOMYBUF|_IOERR|_IOEOF|_IOSTRG|_IORW);
iop->_cnt = 0;
return(r);
}
#endif