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