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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <syserr.h>
include <error.h>
include <imhdr.h>
include <imio.h>
include "stf.h"
# STF_OPEN -- Open/create an STF group format image.
procedure stf_open (kernel, im, o_im,
root, extn, ksection, gr_arg, gc_arg, acmode, status)
int kernel #I IKI kernel
pointer im #I image descriptor
pointer o_im #I other descriptor for NEW_COPY image
char root[ARB] #I root image name
char extn[ARB] #I extension, if any
char ksection[ARB] #I NOT USED
int gr_arg #I index of group to be accessed
int gc_arg #I number of groups in STF image
int acmode #I access mode
int status #O return value
bool subimage
pointer sp, fname, stf, stf_extn, ua, o_stf
int group, gcount, newimage, gpb, hdr, o_stflen
bool fnullfile(), envgetb()
int open(), stropen(), access()
errchk stf_initwcs, fmkcopy, calloc, realloc, syserrs
define err_ 91
begin
call smark (sp)
call salloc (fname, SZ_PATHNAME, TY_CHAR)
call salloc (stf_extn, MAX_LENEXTN, TY_CHAR)
ua = IM_USERAREA(im)
# Allocate internal STF image descriptor.
call calloc (stf, LEN_STFDES, TY_STRUCT)
IM_KDES(im) = stf
group = max (1, gr_arg)
gcount = max (group, gc_arg)
STF_GRARG(stf) = max (0, gr_arg)
STF_GROUP(stf) = group
STF_GCOUNT(stf) = gcount
STF_ACMODE(stf) = acmode
STF_PFD(stf) = NULL
# If a nonzero gcount is specified when a new-image or new-copy image
# is opened (e.g., [1/10] we assume that an entire new group format
# image is to be created with the given group count. If neither the
# group or gcount values are specified we assume that a new image is
# to be created. If the gcount field is zero (e.g., [1/0] or just [1])
# then we assume that the image already exists and that we are being
# asked to rewrite the indexed image.
newimage = NO
if (acmode == NEW_IMAGE || acmode == NEW_COPY)
if (gc_arg > 0 || (gr_arg <= 0 && gc_arg <= 0))
newimage = YES
STF_NEWIMAGE(stf) = newimage
# Generate full header file name.
if (extn[1] == EOS) {
call stf_gethdrextn (im, o_im, acmode, Memc[stf_extn], MAX_LENEXTN)
call iki_mkfname (root, Memc[stf_extn], Memc[fname], SZ_PATHNAME)
call strcpy (Memc[stf_extn], extn, MAX_LENEXTN)
} else
call iki_mkfname (root, extn, Memc[fname], SZ_PATHNAME)
call strcpy (Memc[fname], IM_HDRFILE(im), SZ_IMHDRFILE)
# Generate full pixel file name.
call stf_mkpixfname (root, extn, Memc[fname], SZ_PATHNAME)
call strcpy (Memc[fname], IM_PIXFILE(im), SZ_IMPIXFILE)
# Create and open the image header file if create a new physical
# image. If opening an existing image we do not open the header file
# here since the header may already be in the STF header cache.
# Since STF header files have a weird file type on some systems (VMS)
# we must create a new header file with FMKCOPY rather than OPEN.
if (STF_NEWIMAGE(stf) == YES && !fnullfile (IM_HDRFILE(im))) {
if (access (IM_HDRFILE(im), 0,0) == YES) {
subimage = (gr_arg > 0 && gr_arg <= gc_arg)
if (subimage || envgetb ("imclobber")) {
iferr (call delete (IM_PIXFILE(im)))
goto err_
iferr (call delete (IM_HDRFILE(im)))
goto err_
} else {
call mfree (stf, TY_STRUCT)
call syserrs (SYS_IKICLOB, IM_HDRFILE(im))
}
}
iferr (call fmkcopy (HDR_TEMPLATE, IM_HDRFILE(im)))
goto err_
iferr (IM_HFD(im) = open (IM_HDRFILE(im), READ_WRITE, TEXT_FILE))
goto err_
}
# If opening an existing image, read the image header into the STF
# image descriptor.
switch (acmode) {
case NEW_IMAGE:
# For group formatted images, open NEW_IMAGE can mean either
# creating a new group format image, or opening a new group
# within an existing group format image. The latter case is
# indicated by a group index greater than 1. If we are creating
# a new group format image, wait until the user has set up the
# dimension parameters before doing anything further (in stfopix).
if (STF_NEWIMAGE(stf) == NO)
iferr (call stf_rdheader (im, group, acmode))
goto err_
case NEW_COPY:
# Make sure the FITS encoded user area we inherited is blocked.
### For now, always reblock the old header as the blocked flag
### does not seem to be reliable and a header with variable length
### lines can cause the header update to fail. This should be
### fixed as a reblock of the full header is expensive.
### if (IM_UABLOCKED(o_im) != YES)
call stf_reblock (im)
if (STF_NEWIMAGE(stf) == NO) {
# Open new group within existing GF image. The FITS header and
# GPB structure of the image being opened must be used, but the
# default data values for the GPB parameters are inherited from
# the image being copied.
# Filter the copied user area to retain only the GPB cards.
# Opening the user area on two string file descriptors is a
# bit tricky, but will work since fixed size cards are copied,
# and the EOS isn't written until close time.
if (IM_KDES(o_im) != NULL && IM_KERNEL(o_im) == IM_KERNEL(im)) {
hdr = stropen (Memc[ua], ARB, READ_ONLY)
gpb = stropen (Memc[ua], ARB, NEW_FILE)
call stf_copyfits (IM_KDES(o_im), hdr, gpb, NULL)
call close (gpb)
call close (hdr)
}
# Read in the FITS header of the new image after the inherited
# GPB data cards, and set up the STF descriptor for the new GPB
# as defined in the new FITS header.
iferr (call stf_rdheader (im, group, acmode))
goto err_
# Initialize the WCS description if this is not done by the
# inherited user header.
call stf_initwcs (im)
} else {
# Completely new copy of an existing image, which may or may
# not be an STF format image. IMIO has already copied the
# size parameters of the old image as well as the cards in the
# user area of the old image (but without leaving space for
# the GPB cards if not an STF image). Copy old STF descriptor
# if the old image is also an STF format image, to inherit
# GPB structure. Wait until opix time to init the rest of the
# descriptor.
if (IM_KDES(o_im) != NULL && IM_KERNEL(o_im) == IM_KERNEL(im)) {
o_stf = IM_KDES(o_im)
o_stflen = LEN_STFBASE + STF_PCOUNT(o_stf) * LEN_PDES
call amovi (Memi[o_stf], Memi[stf], o_stflen)
STF_ACMODE(stf) = acmode
STF_GROUP(stf) = group
STF_GCOUNT(stf) = gcount
STF_NEWIMAGE(stf) = newimage
STF_PFD(stf) = NULL
if (gcount > 1)
STF_GROUPS(stf) = YES
} else
STF_GROUPS(stf) = YES
# Inherit datatype of input template image if specified,
# otherwise default datatype to real.
if (IM_PIXTYPE(o_im) != NULL)
IM_PIXTYPE(im) = IM_PIXTYPE(o_im)
else
IM_PIXTYPE(im) = TY_REAL
}
default:
# Open an existing group within an existing image.
iferr (call stf_rdheader (im, group, acmode))
goto err_
}
# Set group number and count for the external world if this is a group
# format image.
if (STF_GROUPS(stf) == YES) {
IM_CLINDEX(im) = STF_GROUP(stf)
IM_CLSIZE(im) = STF_GCOUNT(stf)
}
# Free any unneeded space in the STF descriptor.
if (STF_PCOUNT(stf) > 0)
call realloc (stf,
LEN_STFBASE + STF_PCOUNT(stf)*LEN_PDES, TY_STRUCT)
IM_KDES(im) = stf
status = OK
call sfree (sp)
return
err_
status = ERR
call mfree (stf, TY_STRUCT)
call sfree (sp)
end
|