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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <config.h>
include <imhdr.h>
include <mach.h>
include "imfort.h"
include "oif.h"
# IMOPNX -- Open an existing imagefile. Only host system filenames are
# permitted, image sections are not permitted, no out of bounds references,
# and so on.
procedure imopnx (image, acmode, im, ier)
char image[ARB] #I HOST name of image header file
int acmode #I image access mode (RO, WO)
pointer im #O receives image descriptor pointer
int ier #O receives error status
pointer sp, pix_fp, hdr_fp
pointer pixfile, hdrfile, root, extn, envvar, valstr
int len_hdrmem, len_ua, status, ip
pointer bfopnx()
long clktime()
int imrdhdr(), sizeof(), stridxs(), ctoi()
errchk calloc
begin
call smark (sp)
call salloc (hdrfile, SZ_FNAME, TY_CHAR)
call salloc (pixfile, SZ_PATHNAME, TY_CHAR)
call salloc (envvar, SZ_FNAME, TY_CHAR)
call salloc (valstr, SZ_FNAME, TY_CHAR)
call salloc (root, SZ_FNAME, TY_CHAR)
call salloc (extn, SZ_FNAME, TY_CHAR)
# Construct name of image header file.
call imf_parse (image, Memc[root], Memc[extn])
if (Memc[extn] == EOS)
call strcpy ("imh", Memc[extn], SZ_FNAME)
call strcpy (Memc[root], Memc[hdrfile], SZ_FNAME)
call strcat (".", Memc[hdrfile], SZ_FNAME)
call strcat (Memc[extn], Memc[hdrfile], SZ_FNAME)
# Open image header file.
hdr_fp = bfopnx (Memc[hdrfile], acmode, RANDOM)
if (hdr_fp == ERR) {
call sfree (sp)
ier = IE_OPEN
call im_seterrop (ier, Memc[hdrfile])
return
}
# Determine the user area size.
len_ua = -1
call strpak ("min_lenuserarea", Memc[envvar], SZ_FNAME)
call zgtenv (Memc[envvar], Memc[valstr], SZ_FNAME, status)
if (status > 0) {
ip = 1
call strupk (Memc[valstr], Memc[valstr], SZ_FNAME)
if (ctoi (Memc[valstr], ip, len_ua) <= 0)
len_ua = -1
}
if (len_ua < 0)
len_ua = LEN_USERAREA
# Allocate image descriptor.
len_hdrmem = LEN_IMHDR + (len_ua / SZ_MII_INT)
call calloc (im, LEN_IMDES + len_hdrmem, TY_STRUCT)
IM_ACMODE(im) = acmode
# Read image header into descriptor. Close the file after reading in
# the header if we are opening the image read only.
if (imrdhdr (hdr_fp, im, len_ua, TY_IMHDR) == ERR) {
call bfclos (hdr_fp, status)
call mfree (im, TY_STRUCT)
call sfree (sp)
ier = IE_NOTIMH
call im_seterrop (ier, Memc[hdrfile])
return
} else if (acmode == RO) {
call bfclos (hdr_fp, status)
hdr_fp = NULL
}
# Get the name of the pixel storage file from the image header,
# strip any node name prefix, and open the file. Quit if the
# file cannot be opened.
call strcpy (Memc[hdrfile], IM_HDRFILE(im), SZ_IMHDRFILE)
call imf_gpixfname (IM_PIXFILE(im), IM_HDRFILE(im), Memc[pixfile],
SZ_PATHNAME)
ip = pixfile + stridxs ("!", Memc[pixfile])
pix_fp = bfopnx (Memc[ip], acmode, SEQUENTIAL)
if (pix_fp == ERR) {
call mfree (im, TY_STRUCT)
call sfree (sp)
ier = IE_OPNPIX
call im_seterrop (ier, Memc[ip])
return
}
# Initialize the runtime image descriptor and return.
IM_HDRFP(im) = hdr_fp
IM_PIXFP(im) = pix_fp
IM_LINESIZE(im) = IM_PHYSLEN(im,1) * sizeof (IM_PIXTYPE(im))
IM_SZPIXEL(im) = sizeof (IM_PIXTYPE(im))
IM_LENHDRMEM(im) = len_hdrmem
IM_LINEBUFP(im) = NULL
IM_UABLOCKED(im) = -1
# If opening the image with write permission, assume that the image
# data will be modified (invalidating datamin/datamax).
if (acmode != RO)
IM_MTIME(im) = clktime (long(0))
ier = OK
call sfree (sp)
end
|