xref: /plan9/sys/src/libstdio/fflush.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * pANS stdio -- fflush
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier #include "iolib.h"
53e12c5d1SDavid du Colombier /*
63e12c5d1SDavid du Colombier  * pANS stdio -- data (put here, since loader won't load a separate file)
73e12c5d1SDavid du Colombier  */
83e12c5d1SDavid du Colombier FILE _IO_stream[]={
93e12c5d1SDavid du Colombier /*	fd	flags	state	buf	rp	wp	lp	bufl	unbuf */
103e12c5d1SDavid du Colombier 	0,	0,	OPEN,	0,	0,	0,	0,	0,	0,
113e12c5d1SDavid du Colombier 	1,	0,	OPEN,	0,	0,	0,	0,	0,	0,
123e12c5d1SDavid du Colombier 	2,	0,	OPEN,	0,	0,	0,	0,	0,	0,
133e12c5d1SDavid du Colombier };
14*7dd7cddfSDavid du Colombier 
_fflush(FILE * f)15*7dd7cddfSDavid du Colombier int _fflush(FILE *f){
163e12c5d1SDavid du Colombier 	int error, cnt;
17*7dd7cddfSDavid du Colombier 
183e12c5d1SDavid du Colombier 	if(f==NULL){
193e12c5d1SDavid du Colombier 		error=0;
203e12c5d1SDavid du Colombier 		for(f=_IO_stream;f!=&_IO_stream[FOPEN_MAX];f++)
21*7dd7cddfSDavid du Colombier 			if(f->state==WR && _fflush(f)==EOF)
223e12c5d1SDavid du Colombier 				error=EOF;
233e12c5d1SDavid du Colombier 		return error;
243e12c5d1SDavid du Colombier 	}
253e12c5d1SDavid du Colombier 	if(f->flags&STRING) return EOF;
263e12c5d1SDavid du Colombier 	switch(f->state){
273e12c5d1SDavid du Colombier 	default:	/* OPEN RDWR EOF RD */
283e12c5d1SDavid du Colombier 		return 0;
293e12c5d1SDavid du Colombier 	case CLOSED:
303e12c5d1SDavid du Colombier 	case ERR:
313e12c5d1SDavid du Colombier 		return EOF;
323e12c5d1SDavid du Colombier 	case WR:
333e12c5d1SDavid du Colombier 		cnt=(f->flags&LINEBUF?f->lp:f->wp)-f->buf;
343e12c5d1SDavid du Colombier 		if(cnt && write(f->fd, f->buf, cnt)!=cnt){
353e12c5d1SDavid du Colombier 			f->state=ERR;
363e12c5d1SDavid du Colombier 			return EOF;
373e12c5d1SDavid du Colombier 		}
383e12c5d1SDavid du Colombier 		f->rp=f->wp=f->buf;
393e12c5d1SDavid du Colombier 		f->state=RDWR;
403e12c5d1SDavid du Colombier 		return 0;
413e12c5d1SDavid du Colombier 	}
423e12c5d1SDavid du Colombier }
43*7dd7cddfSDavid du Colombier 
fflush(FILE * f)44*7dd7cddfSDavid du Colombier int fflush(FILE *f)
45*7dd7cddfSDavid du Colombier {
46*7dd7cddfSDavid du Colombier 	int r;
47*7dd7cddfSDavid du Colombier 
48*7dd7cddfSDavid du Colombier 	qlock(&_stdiolk);
49*7dd7cddfSDavid du Colombier 	r = _fflush(f);
50*7dd7cddfSDavid du Colombier 	qunlock(&_stdiolk);
51*7dd7cddfSDavid du Colombier 	return r;
52*7dd7cddfSDavid du Colombier }
53