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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <syserr.h>
include "qpoe.h"
# QP_POPEN -- Open a variable-array type parameter as a file. A call to
# fio.close is used to close the file. Note that the varlen parameter, which
# is stored in its own lfile in the datafile, is opened directly as a file
# independently of the FMIO file buffer cache. Most QPOE parameter i/o is
# via the cache, hence mixing QP_POPEN calls with ordinary QPOE i/o on the
# same parameter at the same time could lead to loss of data integrity due
# to the same lfile being opened simultaneously on two different file
# descriptors. We ensure that the lfile is not in the file cache at qp_popen
# time, but no checks are made once the file has been opened. A FIO file
# descriptor is returned as the function value; CLOSE should be called to
# close the file descriptor when it is no longer needed.
int procedure qp_popen (qp, param, mode, type)
pointer qp #I QPOE descriptor
char param[ARB] #I parameter name
int mode #I file(param) access mode
int type #I file type, text or binary
pointer sym
int fm_fopen()
pointer qp_gpsym()
errchk qp_gpsym, qp_addf(), fm_lockout, syserrs
begin
if (QP_ACTIVE(qp) == NO)
call qp_bind (qp)
# Lookup the parameter; make sure it is a varlen parameter.
# Create a new parameter if none exists and the mode is NEW_FILE.
sym = qp_gpsym (qp, param)
if (sym == NULL) {
if (mode != NEW_FILE)
call syserrs (SYS_QPUKNPAR, param)
else {
# Create a new parameter.
if (type == TEXT_FILE)
call qp_addf (qp, param, "c", 0, "", 0)
else
call qp_addf (qp, param, "opaque", 0, "", 0)
sym = qp_gpsym (qp, param)
if (sym == NULL)
call syserrs (SYS_QPUKNPAR, param)
}
} else if (S_MAXELEM(sym) != 0)
call syserrs (SYS_QPPOPEN, param)
# Place a lock on the file and then remove it, to cause an error
# if the lfile is already active in the file cache.
call fm_lockout (QP_FM(qp), S_LFILE(sym))
call fm_unlock (QP_FM(qp), S_LFILE(sym))
# Open the assigned lfile and return the file descriptor.
return (fm_fopen (QP_FM(qp), S_LFILE(sym), mode, type))
end
|