cosmopolitan/third_party/f2c/close.c

59 lines
1.1 KiB
C

#include "libc/calls/calls.h"
#include "libc/mem/mem.h"
#include "third_party/f2c/f2c.h"
#include "third_party/f2c/fio.h"
integer f_clos(cllist *a) {
unit *b;
if (a->cunit >= MXUNIT) return (0);
b = &f__units[a->cunit];
if (b->ufd == NULL) goto done;
if (b->uscrtch == 1) goto Delete;
if (!a->csta) goto Keep;
switch (*a->csta) {
default:
Keep:
case 'k':
case 'K':
if (b->uwrt == 1) t_runc((alist *)a);
if (b->ufnm) {
fclose(b->ufd);
free(b->ufnm);
}
break;
case 'd':
case 'D':
Delete:
fclose(b->ufd);
if (b->ufnm) {
unlink(b->ufnm); /*SYSDEP*/
free(b->ufnm);
}
}
b->ufd = NULL;
done:
b->uend = 0;
b->ufnm = NULL;
return (0);
}
void f_exit(void) {
int i;
static cllist xx;
if (!xx.cerr) {
xx.cerr = 1;
xx.csta = NULL;
for (i = 0; i < MXUNIT; i++) {
xx.cunit = i;
(void)f_clos(&xx);
}
}
}
int flush_(void) {
int i;
for (i = 0; i < MXUNIT; i++)
if (f__units[i].ufd != NULL && f__units[i].uwrt) fflush(f__units[i].ufd);
return 0;
}