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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <ctype.h>
# IC_SECTION -- Parse an image section into its elements.
# 1. The default values must be set by the caller.
# 2. A null image section is OK.
# 3. The first nonwhitespace character must be '['.
# 4. The last interpreted character must be ']'.
#
# This procedure should be replaced with an IMIO procedure at some
# point.
procedure ic_section (section, x1, x2, xs, ndim)
char section[ARB] # Image section
int x1[ndim] # Starting pixel
int x2[ndim] # Ending pixel
int xs[ndim] # Step
int ndim # Number of dimensions
int i, ip, a, b, c, temp, ctoi()
define error_ 99
begin
# Decode the section string.
ip = 1
while (IS_WHITE(section[ip]))
ip = ip + 1
if (section[ip] == '[')
ip = ip + 1
else if (section[ip] == EOS)
return
else
goto error_
do i = 1, ndim {
while (IS_WHITE(section[ip]))
ip = ip + 1
if (section[ip] == ']')
break
# Default values
a = x1[i]
b = x2[i]
c = xs[i]
# Get a:b:c. Allow notation such as "-*:c"
# (or even "-:c") where the step is obviously negative.
if (ctoi (section, ip, temp) > 0) { # a
a = temp
if (section[ip] == ':') {
ip = ip + 1
if (ctoi (section, ip, b) == 0) # a:b
goto error_
} else
b = a
} else if (section[ip] == '-') { # -*
temp = a
a = b
b = temp
ip = ip + 1
if (section[ip] == '*')
ip = ip + 1
} else if (section[ip] == '*') # *
ip = ip + 1
if (section[ip] == ':') { # ..:step
ip = ip + 1
if (ctoi (section, ip, c) == 0)
goto error_
else if (c == 0)
goto error_
}
if (a > b && c > 0)
c = -c
x1[i] = a
x2[i] = b
xs[i] = c
while (IS_WHITE(section[ip]))
ip = ip + 1
if (section[ip] == ',')
ip = ip + 1
}
if (section[ip] != ']')
goto error_
return
error_
call error (0, "Error in image section specification")
end
|