13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * pANS stdio -- sclose 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier #include "iolib.h" 53e12c5d1SDavid du Colombier #include <stdlib.h> 6*7dd7cddfSDavid du Colombier 7*7dd7cddfSDavid 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); 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; 353e12c5d1SDavid du Colombier return f->buf; 363e12c5d1SDavid du Colombier } 37