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