aboutsummaryrefslogtreecommitdiff
path: root/pkg/proto/t_mkglbhdr.x
blob: 7840403b5b2bcf08dfa9545e0d562ae66c21321a (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
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
163
164
165
166
167
include	<error.h>
include	<imhdr.h>

# T_MKGLBHDR -- Make a global header from common image and reference keywords.

procedure t_mkglbhdr ()

pointer	input			# Input image list
char	oname[SZ_FNAME]		# Output global image
char	rname[SZ_FNAME]		# Reference image
pointer	exclude			# Exclusion keyword list

int	i
char	iname[SZ_FNAME], key[8]
pointer	im, refim, recs, ptr, ptr1

bool	matchcard()
int	clpopnu(), clgfil(), imtgetim(), strncmp(), nowhite()
pointer	imtopenp(), immap()

errchk	immap

begin
	# Get parameters.
	input = imtopenp ("input")
	call clgstr ("output", oname, SZ_FNAME)
	call clgstr ("reference", rname, SZ_FNAME)
	exclude = clpopnu ("exclude")

	# Use the first image in the input list if no reference is specified.
	if (nowhite (rname, rname, SZ_FNAME) == 0)
	    i = imtgetim (input, rname, SZ_FNAME)

	iferr {
	    im = NULL; refim = NULL; recs = NULL

	    # Make list of reference cards.
	    ptr = immap (rname, READ_ONLY, 0); refim = ptr
	    ptr = IM_USERAREA(refim)
	    do i = 0, ARB {
		if (Memc[ptr] == EOS)
		    break
		if (i == 0)
		    call malloc (recs, 1000, TY_POINTER)
		else if (mod (i, 1000) == 0)
		    call realloc (recs, i+1000, TY_POINTER)
		#Memc[ptr+80] = EOS
	        Memi[recs+i] = ptr
	        ptr = ptr + 81
	    }
	    Memi[recs+i] = EOF

	    # Exclude specified keywords.
	    while (clgfil (exclude, iname, SZ_FNAME) != EOF) {
	        call sprintf (key, 8, "%-8.8s")
		    call pargstr (iname)
		call strupr (key)
		for (i=0; Memi[recs+i]!=EOF; i=i+1) {
		    ptr = Memi[recs+i]
		    if (ptr == NULL)
		        next
		    if (Memc[ptr] == ' ')
		        next
		    if (strncmp (key, Memc[ptr], 8) == 0)
		        Memi[recs+i] = NULL
		}
	    }
	        
	    # Loop through input images eliminating reference cards.
	    while (imtgetim (input, iname, SZ_FNAME) != EOF) {
	        ptr = immap (iname, READ_ONLY, 0); im = ptr
		ptr = IM_USERAREA(im)
		for (i=0; Memi[recs+i]!=EOF; i=i+1) {
		    ptr = Memi[recs+i]
		    if (ptr == NULL)
		        next
		    if (Memc[ptr] == ' ')
		        next
		    if (!matchcard (Memc[IM_USERAREA(im)], Memc[ptr]))
		        Memi[recs+i] = NULL
		}
		call imunmap (im)
	    }

	    # Eliminate multiple blank lines.
	    for (i=0; Memi[recs+i]!=EOF; i=i+1) {
		ptr1 = Memi[recs+i]
	        if (ptr == NULL)
		    next
		if (Memc[ptr] != ' ')
		    break
		Memi[recs+i] = NULL
	    }
	    ptr1 = ptr
	    for (; Memi[recs+i]!=EOF; i=i+1) {
		ptr = Memi[recs+i]
	        if (ptr == NULL)
		    next
		if (Memc[ptr] == ' ' && Memc[ptr1] == ' ')
		    Memi[recs+i] = NULL
		else
		    ptr1 = ptr
	    }

	    # Write the output global header.
	    ptr = immap (oname, NEW_COPY, refim); im = ptr
	    IM_PIXTYPE(im) = TY_SHORT
	    IM_NDIM(im) = 0
	    ptr1 = IM_USERAREA(im)
	    for (i=0; Memi[recs+i]!=EOF; i=i+1) {
		ptr = Memi[recs+i]
		if (ptr == NULL)
		    next
		call strcpy (Memc[ptr], Memc[ptr1], 81)
		ptr1 = ptr1 + 81
	    }
	    Memc[ptr1] = EOS
	    call imunmap (im)

	} then
	    call erract (EA_WARN)


	# Finish up.
	if (im != NULL)
	    call imunmap (im)
	if (refim != NULL)
	    call imunmap (refim)
	call mfree (recs, TY_POINTER)

	call clpcls (exclude)
	call imtclose (input)
end


# MATCHCARD -- Match a card given by pat to a string which is a user area.
# This is a simple version of gstrmatch.

bool procedure matchcard (str, pat)

char	str[ARB]		# String to search
char	pat[ARB]		# String to match
char	ch, pch
int	i, ip, pp

begin
	do ip = 1, ARB {
	    if (str[ip] == EOS)
		break

	    i = ip
	    for (pp=1;  pp < 81;  pp=pp+1) {
		pch = pat[pp]
		ch = str[i]
		i = i + 1
		if (pch != ch)
		    break
	    }

	    if (pp == 81)
		return (true)
	    else if (str[i] == EOS)
		break
	}

	return (false)
end