1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <syserr.h>
include <config.h>
include <fio.h>
# CLOSE -- Close a file, after possibly flushing the output buffer, and
# returning the file buffer (if any) and file descriptor.
procedure close (fd_arg)
int fd_arg, fd
int status
errchk flush, mfree, frtnfd
include <fio.com>
begin
fp = fiodes[fd_arg]
if (fp == NULL)
return
else
call fcanpb (fd_arg) # cancel any pushback
if (redir_fd[fd_arg] > 0) {
# If the stream was redirected locally onto a new file by FREDIR,
# swap streams back to their original order and close the redir
# file.
fd = redir_fd[fd_arg]
call flush (fd_arg)
call fswapfd (fd, fd_arg)
redir_fd[fd_arg] = 0
} else
fd = fd_arg
switch (fd) {
case STDIN, CLIN:
return
case STDOUT, STDERR, CLOUT, STDGRAPH, STDIMAGE, STDPLOT:
call flush (fd)
default:
call flush (fd)
status = OK
switch (FTYPE(fp)) {
case TEXT_FILE:
call zcall2 (ZCLSTX(fp), FCHAN(fp), status)
call frtnfd (fd)
case STRING_FILE:
call strclose (fd)
case SPOOL_FILE:
call frtnfd (fd)
default:
FREFCNT(fp) = FREFCNT(fp) - 1
if (FREFCNT(fp) <= 0) {
if (FCHAN(fp) != ERR)
call zcall2 (ZCLSBF(fp), FCHAN(fp), status)
if (FCD(fp) != FLCD(fp)) # separate chandes?
call mfree (FCD(fp), TY_STRUCT)
}
call frtnfd (fd)
}
if (status == ERR)
call filerr (FNAME(fp), SYS_FCLOSE)
}
end
|