xref: /plan9-contrib/sys/src/libstdio/sclose.c (revision 22df390c30710ddd2119f3e7bb6c92dc399cabb9)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * pANS stdio -- sclose
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier #include "iolib.h"
sclose(FILE * f)53e12c5d1SDavid du Colombier char *sclose(FILE *f){
63e12c5d1SDavid du Colombier 	switch(f->state){
73e12c5d1SDavid du Colombier 	default:	/* ERR CLOSED */
83e12c5d1SDavid du Colombier 		if(f->buf && f->flags&BALLOC)
93e12c5d1SDavid du Colombier 			free(f->buf);
103e12c5d1SDavid du Colombier 		f->flags=0;
113e12c5d1SDavid du Colombier 		return NULL;
123e12c5d1SDavid du Colombier 	case OPEN:
133e12c5d1SDavid du Colombier 		f->buf=malloc(1);
143e12c5d1SDavid du Colombier 		f->buf[0]='\0';
153e12c5d1SDavid du Colombier 		break;
163e12c5d1SDavid du Colombier 	case RD:
173e12c5d1SDavid du Colombier 	case END:
183e12c5d1SDavid du Colombier 		f->flags=0;
193e12c5d1SDavid du Colombier 		break;
203e12c5d1SDavid du Colombier 	case RDWR:
213e12c5d1SDavid du Colombier 	case WR:
223e12c5d1SDavid du Colombier 		if(f->wp==f->rp){
233e12c5d1SDavid du Colombier 			if(f->flags&BALLOC)
243e12c5d1SDavid du Colombier 				f->buf=realloc(f->buf, f->bufl+1);
253e12c5d1SDavid du Colombier 			if(f->buf==NULL) return NULL;
263e12c5d1SDavid du Colombier 		}
273e12c5d1SDavid du Colombier 		*f->wp='\0';
283e12c5d1SDavid du Colombier 		f->flags=0;
293e12c5d1SDavid du Colombier 		break;
303e12c5d1SDavid du Colombier 	}
313e12c5d1SDavid du Colombier 	f->state=CLOSED;
323e12c5d1SDavid du Colombier 	f->flags=0;
33*22df390cSDavid du Colombier 	return (char *)f->buf;
343e12c5d1SDavid du Colombier }
35