aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/irsiids/getnimage.x
blob: c232a85c328bf7a86b8add96dae965aec45ae828 (plain) (blame)
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