Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_FS_1_19910112 - c/lib/stdio/fflush.c
There are 9 other files named fflush.c in the archive. Click here to see a list.
/*
**	FFLUSH - flush out any output waiting in buffer
**
**	(c) Copyright Ken Harrenstien 1989
**		for all changes after v., 27-Jul-1989
**	Copyright (c) 1986 by Ian Macky, SRI International
*/

#include <stdio.h>
#include <errno.h>
#include <sys/file.h>

extern long lseek();	/* Syscalls */
extern int write();

static int flushall();

int fflush(f)
register FILE *f;
{
    int n;

    if (f == NULL) return flushall();

    if (f->siocheck != _SIOF_OPEN)		/* validate FILE block */
	return EOF;
    switch (f->sioflgs & (_SIOF_READ | _SIOF_WRITE)) {
	case _SIOF_READ:
	    _prime(f);				/* prime for i/o */
	    if (f->sioflgs & _SIOF_UPDATE)	/* enter quiescent state */
		f->sioflgs &= ~_SIOF_READ;
	    f->sioflgs &= ~_SIOF_PBC;	    	/* undo any push-back */
	    return 0;
	case _SIOF_WRITE:
	    if (f->sioflgs & _SIOF_LINEBUF)
		n = (f->siolcnt <= 0) ? f->siolbuf : f->siolbuf - f->siolcnt;
	    else
		n = (f->siocnt <= 0) ? f->siolbuf : f->siolbuf - f->siocnt;

	    if (n > 0) {
		if (write(f->siofd, f->siopbuf, n) == -1) {
		    f->sioerr = errno;		/* error during write */
		    n = -1;			/* Relay error to caller */
		} else {
		    /* Update our FD file position */
		    if (f->sioflgs & _SIOF_CONVERTED)
			f->siofdoff = lseek(f->siofd, (long)0, L_INCR);
		    else f->siofdoff += n;
		}
	    }
	    if (f->sioflgs & _SIOF_UPDATE)	/* enter quiescent state */
		f->sioflgs &= ~_SIOF_WRITE;
	    _prime(f);
	    return (n == -1) ? EOF : 0;		/* 0 on win, EOF on lose */

	default:
	    return 0;				/* must be quiescent */
    }
}

_prime(f)
FILE *f;
{
    switch (f->sioflgs & (_SIOF_READ | _SIOF_WRITE)) {
	case 0:				/* neither read or write.  must be */
	    if (f->sioflgs & _SIOF_UPDATE)
		f->siocnt = 0;		/* quiescent mode; reset count... */
	    break;
	case _SIOF_READ:
	    if (f->siocnt < 0)		/* This is often -1 */
		f->siocnt = 0;

	    /* Update our FD file position */
	    if (f->sioflgs & _SIOF_CONVERTED)
		f->siofdoff = lseek(f->siofd, (long)0, L_INCR);
	    else f->siofdoff += (f->sioocnt - f->siocnt);

	    f->sioocnt = f->siocnt = 0;
	    break;
	case _SIOF_WRITE:
	    f->siocp = f->siopbuf - 1;
	    if (f->sioflgs & _SIOF_LINEBUF) {
		f->siolcnt = f->siolbuf;
		f->siocnt = 0;
	    } else
		f->siocnt = f->sioocnt = f->siolbuf;
    }
}

static int flushall()
{
    register FILE *f;

    for (f = &_sios[0]; f < &_sios[FOPEN_MAX]; f++)
	if (f->sioflgs & _SIOF_OPEN)		/* Check static FILEs */
	    fflush(f);
    for (f = _FILE_head; f; f = f->sionFILE)	/* Then dynamic FILEs */
	fflush(f);
}