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