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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <error.h>
include <ctype.h>
include <pkg/rg.h>
define NRGS 10 # Allocation size
# RG_XRANGES -- Parse a range string corrsponding to a real set of values.
# Return a pointer to the ranges.
pointer procedure rg_xranges$t (rstr, rvals, npts)
char rstr[ARB] # Range string
PIXEL rvals[npts] # Range values (sorted)
int npts # Number of range values
pointer rg # Range pointer
int i, fd, strlen(), open(), getline()
pointer sp, str, ptr
errchk open, rg_xadd$t
begin
# Check for valid arguments
if (npts < 1)
call error (0, "No data points for range determination")
call smark (sp)
call salloc (str, max (strlen (rstr), SZ_LINE), TY_CHAR)
call calloc (rg, LEN_RG, TY_STRUCT)
i = 1
while (rstr[i] != EOS) {
# Find beginning and end of a range and copy it to the work string
while (IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n')
i = i + 1
if (rstr[i] == EOS)
break
ptr = str
while (!(IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n' ||
rstr[i]==EOS)) {
Memc[ptr] = rstr[i]
i = i + 1
ptr = ptr + 1
}
Memc[ptr] = EOS
# Add range(s)
iferr {
if (Memc[str] == '@') {
fd = open (Memc[str+1], READ_ONLY, TEXT_FILE)
while (getline (fd, Memc[str]) != EOF) {
iferr (call rg_xadd$t (rg, Memc[str], rvals, npts))
call erract (EA_WARN)
}
call close (fd)
} else
call rg_xadd$t (rg, Memc[str], rvals, npts)
} then
call erract (EA_WARN)
}
call sfree (sp)
return (rg)
end
# RG_XADD -- Add a range
procedure rg_xadd$t (rg, rstr, rvals, npts)
pointer rg # Range descriptor
char rstr[ARB] # Range string
PIXEL rvals[npts] # Range values (sorted)
int npts # Number of range values
int i, j, k, nrgs, strlen(), cto$t()
PIXEL rval1, rval2, a1, b1, a2, b2
pointer sp, str, ptr
begin
call smark (sp)
call salloc (str, strlen (rstr), TY_CHAR)
i = 1
while (rstr[i] != EOS) {
# Find beginning and end of a range and copy it to the work string
while (IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n')
i = i + 1
if (rstr[i] == EOS)
break
ptr = str
while (!(IS_WHITE(rstr[i]) || rstr[i]==',' || rstr[i]=='\n' ||
rstr[i]==EOS)) {
if (rstr[i] == ':')
Memc[ptr] = ' '
else
Memc[ptr] = rstr[i]
i = i + 1
ptr = ptr + 1
}
Memc[ptr] = EOS
# Parse range
if (Memc[str] == '@')
call error (1, "Cannot nest @files")
else if (Memc[str] == '*') {
rval1 = rvals[1]
rval2 = rvals[npts]
} else {
# Get range
j = 1
if (cto$t (Memc[str], j, rval1) == 0)
call error (1, "Range syntax error")
rval2 = rval1
if (cto$t (Memc[str], j, rval2) == 0)
;
}
# Check limits and find indices into rval array
a1 = min (rval1, rval2)
b1 = max (rval1, rval2)
a2 = min (rvals[1], rvals[npts])
b2 = max (rvals[1], rvals[npts])
if ((b1 >= a2) && (a1 <= b2)) {
a1 = max (a2, min (b2, a1))
b1 = max (a2, min (b2, b1))
if (rvals[1] <= rvals[npts]) {
for (k = 1; (k <= npts) && (rvals[k] < a1); k = k + 1)
;
for (j = k; (j <= npts) && (rvals[j] <= b1); j = j + 1)
;
j = j - 1
} else {
for (k = 1; (k <= npts) && (rvals[k] > b1); k = k + 1)
;
for (j = k; (j <= npts) && (rvals[j] >= a1); j = j + 1)
;
j = j - 1
}
# Add range
if (k <= j) {
nrgs = RG_NRGS(rg)
if (mod (nrgs, NRGS) == 0)
call realloc (rg, LEN_RG+2*(nrgs+NRGS), TY_STRUCT)
nrgs = nrgs + 1
RG_NRGS(rg) = nrgs
RG_X1(rg, nrgs) = k
RG_X2(rg, nrgs) = j
RG_NPTS(rg) = RG_NPTS(rg) +
RG_X1(rg, nrgs) - RG_X2(rg, nrgs) + 1
}
}
}
call sfree (sp)
end
|