xref: /plan9/sys/src/ape/lib/ap/stdio/sclose.c (revision 316a47aa8d2a41a409cede903ca6a573c5275fe3)
1 /*
2  * pANS stdio -- sclose
3  */
4 #include "iolib.h"
5 #include <stdlib.h>
6 
_IO_sclose(FILE * f)7 char *_IO_sclose(FILE *f){
8 	switch(f->state){
9 	default:	/* ERR CLOSED */
10 		if(f->buf && f->flags&BALLOC)
11 			free(f->buf);
12 		f->state=CLOSED;
13 		f->flags=0;
14 		return NULL;
15 	case OPEN:
16 		f->buf=malloc(1);
17 		f->buf[0]='\0';
18 		break;
19 	case RD:
20 	case END:
21 		f->flags=0;
22 		break;
23 	case RDWR:
24 	case WR:
25 		if(f->wp==f->rp){
26 			if(f->flags&BALLOC)
27 				f->buf=realloc(f->buf, f->bufl+1);
28 			if(f->buf==NULL) return NULL;
29 		}
30 		*f->wp='\0';
31 		f->flags=0;
32 		break;
33 	}
34 	f->state=CLOSED;
35 	f->flags=0;
36 	return f->buf;
37 }
38