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