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
|
include <mach.h>
# GET_NEXT_IMAGE -- Use root filename and ranges string (if any) to
# generate the next image filename. Return EOF
# when image list is exhausted.
int procedure get_next_image (infile, records, nrecs, image, sz_name)
int infile, records[ARB], nrecs, sz_name
char image[sz_name]
int next_num, stat
int flag1, flag2, flag3
char image_0[SZ_FNAME]
int clgfil(), get_next_entry(), strlen()
common /gnicom/ flag1, flag2
data flag3/YES/
begin
# Reset initializer, record counter, and get root name
if ((flag1 == YES) || (flag3 == YES)) {
next_num = -1
call rst_get_entry ()
}
# If no ranges specified, act like template expander
if (nrecs == MAX_INT) {
stat = clgfil (infile, image, sz_name)
# Otherwise append record numbers to first template expansion
} else {
if (flag1 == YES) {
stat = clgfil (infile, image_0, sz_name)
if (stat == EOF)
return (stat)
}
stat = get_next_entry (records, next_num)
if (stat != EOF) {
call strcpy (image_0, image, sz_name)
call sprintf (image[strlen(image)+1], sz_name, ".%04d")
call pargi (next_num)
}
}
flag1 = NO
flag3 = NO
return (stat)
end
# Reset the initialization parameter to TRUE
procedure reset_next_image ()
int flag1, flag2
common /gnicom/ flag1, flag2
begin
flag1 = YES
end
# GET_NEXT_ENTRY -- Given a list of ranges and the current file number,
# find and return the next file number in order of entry.
# EOF is returned at the end of the list.
int procedure get_next_entry (ranges, number)
int ranges[ARB] # Range array
int number # Both input and output parameter
int ip, first, last, step, next_number, remainder
int flag1, flag2, flag3
common /gnicom/ flag1, flag2
data flag3/YES/
begin
number = number + 1
next_number = MAX_INT
if ((flag2 == YES) || (flag3 == YES)) {
ip = 1
flag2 = NO
flag3 = NO
}
first = min (ranges[ip], ranges[ip+1])
last = max (ranges[ip], ranges[ip+1])
step = ranges[ip+2]
if (number >= first && number <= last) {
remainder = mod (number - first, step)
if (remainder == 0)
return (number)
if (number - remainder + step <= last)
next_number = number - remainder + step
else
go to 10
} else if (first > number)
next_number = min (next_number, first)
else {
10 ip = ip + 3
if (ranges[ip] != -1 && ranges[ip+1] !=0 && ranges[ip+2] !=0)
next_number = min (ranges[ip], ranges[ip+1])
}
if (next_number == MAX_INT) {
ip = 1
flag2 = YES
return (EOF)
} else {
number = next_number
return (number)
}
end
procedure rst_get_entry ()
int first, flag2
common /gnicom/ first, flag2
begin
flag2 = YES
end
|