xref: /plan9/sys/src/ape/lib/ap/stdio/_IO_getc.c (revision d9306527b4a7229dcf0cf3c58aed36bb9da82854)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * pANS stdio -- _IO_getc
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier #include "iolib.h"
_IO_getc(FILE * f)53e12c5d1SDavid du Colombier int _IO_getc(FILE *f){
6*d9306527SDavid du Colombier 	int cnt, n;
73e12c5d1SDavid du Colombier 	switch(f->state){
83e12c5d1SDavid du Colombier 	default:	/* CLOSED, WR, ERR, EOF */
93e12c5d1SDavid du Colombier 		return EOF;
103e12c5d1SDavid du Colombier 	case OPEN:
113e12c5d1SDavid du Colombier 		_IO_setvbuf(f);
123e12c5d1SDavid du Colombier 	case RDWR:
133e12c5d1SDavid du Colombier 	case RD:
143e12c5d1SDavid du Colombier 		if(f->flags&STRING) return EOF;
15*d9306527SDavid du Colombier 		if(f->buf == f->unbuf)
16*d9306527SDavid du Colombier 			n = 1;
17*d9306527SDavid du Colombier 		else
18*d9306527SDavid du Colombier 			n = f->bufl;
19*d9306527SDavid du Colombier 		cnt=read(f->fd, f->buf, n);
203e12c5d1SDavid du Colombier 		switch(cnt){
213e12c5d1SDavid du Colombier 		case -1: f->state=ERR; return EOF;
223e12c5d1SDavid du Colombier 		case 0: f->state=END; return EOF;
233e12c5d1SDavid du Colombier 		default:
243e12c5d1SDavid du Colombier 			f->state=RD;
253e12c5d1SDavid du Colombier 			f->rp=f->buf;
263e12c5d1SDavid du Colombier 			f->wp=f->buf+cnt;
273e12c5d1SDavid du Colombier 			return (*f->rp++)&_IO_CHMASK;
283e12c5d1SDavid du Colombier 		}
293e12c5d1SDavid du Colombier 	}
303e12c5d1SDavid du Colombier }
31