xref: /plan9-contrib/sys/src/ape/lib/ap/stdio/setvbuf.c (revision 22df390c30710ddd2119f3e7bb6c92dc399cabb9)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * pANS stdio -- setvbuf
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier #include "iolib.h"
setvbuf(FILE * f,char * buf,int mode,size_t size)53e12c5d1SDavid du Colombier int setvbuf(FILE *f, char *buf, int mode, size_t size){
63e12c5d1SDavid du Colombier 	if(f->state!=OPEN){
73e12c5d1SDavid du Colombier 		f->state=ERR;
83e12c5d1SDavid du Colombier 		return -1;
93e12c5d1SDavid du Colombier 	}
103e12c5d1SDavid du Colombier 	f->state=RDWR;
113e12c5d1SDavid du Colombier 	switch(mode){
123e12c5d1SDavid du Colombier 	case _IOLBF:
133e12c5d1SDavid du Colombier 		f->flags|=LINEBUF;
143e12c5d1SDavid du Colombier 	case _IOFBF:
153e12c5d1SDavid du Colombier 		if(buf==0){
163e12c5d1SDavid du Colombier 			buf=malloc(size);
173e12c5d1SDavid du Colombier 			if(buf==0){
183e12c5d1SDavid du Colombier 				f->state=ERR;
193e12c5d1SDavid du Colombier 				return -1;
203e12c5d1SDavid du Colombier 			}
213e12c5d1SDavid du Colombier 			f->flags|=BALLOC;
223e12c5d1SDavid du Colombier 		}
233e12c5d1SDavid du Colombier 		f->bufl=size;
243e12c5d1SDavid du Colombier 		break;
253e12c5d1SDavid du Colombier 	case _IONBF:
26*22df390cSDavid du Colombier 		buf=(char *)f->unbuf;
273e12c5d1SDavid du Colombier 		f->bufl=0;
283e12c5d1SDavid du Colombier 		break;
293e12c5d1SDavid du Colombier 	}
30*22df390cSDavid du Colombier 	f->rp=f->wp=f->lp=f->buf=(unsigned char *)buf;
313e12c5d1SDavid du Colombier 	f->state=RDWR;
323e12c5d1SDavid du Colombier 	return 0;
333e12c5d1SDavid du Colombier }
_IO_setvbuf(FILE * f)343e12c5d1SDavid du Colombier int _IO_setvbuf(FILE *f){
353e12c5d1SDavid du Colombier 	if(f==stderr || (f==stdout && isatty(1)))
364b348146SDavid du Colombier 		return setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
374b348146SDavid du Colombier 	return setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
383e12c5d1SDavid du Colombier }
39