xref: /plan9/sys/src/ape/lib/ap/stdio/setvbuf.c (revision 4b348146ee41394218745eb875dd9cbef009ee68)
1 /*
2  * pANS stdio -- setvbuf
3  */
4 #include "iolib.h"
5 #include <stdlib.h>
setvbuf(FILE * f,char * buf,int mode,size_t size)6 int setvbuf(FILE *f, char *buf, int mode, size_t size){
7 	if(f->state!=OPEN){
8 		f->state=ERR;
9 		return -1;
10 	}
11 	f->state=RDWR;
12 	switch(mode){
13 	case _IOLBF:
14 		f->flags|=LINEBUF;
15 	case _IOFBF:
16 		if(buf==0){
17 			buf=malloc(size);
18 			if(buf==0){
19 				f->state=ERR;
20 				return -1;
21 			}
22 			f->flags|=BALLOC;
23 		}
24 		f->bufl=size;
25 		break;
26 	case _IONBF:
27 		buf=f->unbuf;
28 		f->bufl=0;
29 		break;
30 	}
31 	f->rp=f->wp=f->lp=f->buf=buf;
32 	f->state=RDWR;
33 	return 0;
34 }
_IO_setvbuf(FILE * f)35 int _IO_setvbuf(FILE *f){
36 	if(f==stderr || (f==stdout && isatty(1)))
37 		return setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
38 	return setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
39 }
40