]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libstdio/sclose.c
kernel: avoid selecting the boot process in killbig()
[plan9front.git] / sys / src / libstdio / sclose.c
1 /*
2  * pANS stdio -- sclose
3  */
4 #include "iolib.h"
5 char *sclose(FILE *f){
6         switch(f->state){
7         default:        /* ERR CLOSED */
8         Error:
9                 if(f->buf && f->flags&BALLOC)
10                         free(f->buf);
11                 f->buf=0;
12                 break;
13         case OPEN:
14                 f->buf=malloc(1);
15                 f->buf[0]='\0';
16                 break;
17         case RD:
18         case END:
19                 break;
20         case RDWR:
21         case WR:
22                 f->rp=f->buf+f->bufl;
23                 if(f->wp==f->rp){
24                         if(f->flags&BALLOC){
25                                 char *t = realloc(f->buf, f->bufl+1);
26                                 if(t==NULL)
27                                         goto Error;
28                                 f->buf=t;
29                                 f->wp=t+f->bufl;
30                         } else {
31                                 if(f->wp > f->buf)
32                                         *(f->wp-1) = '\0';
33                                 goto Error;
34                         }
35                 }
36                 *f->wp='\0';
37                 break;
38         }
39         f->state=CLOSED;
40         f->flags=0;
41         return f->buf;
42 }