aboutsummaryrefslogtreecommitdiff
path: root/pkg/images/imcoords/src/rgstr.gx
blob: 3647f80bea0c5d59d149c9b0ed24de880d4b8469 (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
include <ctype.h>

$for (rd)

# RG_APACK_LINE -- Fields are packed into the output buffer. Transformed
# fields are converted to strings; other fields are copied from the input
# line to the output buffer.

procedure rg_apack_line$t (inbuf, outbuf, maxch, field_pos, nfields,
    cinfields, ncin, coords, laxno, formats, nsdig, ncout, min_sigdigits)

char	inbuf[ARB]		#I the input string buffer
char	outbuf[maxch]		#O the output string buffer
int	maxch			#I the maximum size of the output buffer
int	field_pos[ARB]		#I starting positions for the fields
int	nfields			#I the number of fields
int	cinfields[ARB]		#I fields to be replaced
int	ncin			#I the number of input fields
PIXEL	coords[ARB]		#I the transformed coordinates
int	laxno[ARB]		#I the logical axis mapping
pointer	formats[ARB]		#I array of format pointers
int	nsdig[ARB]		#I array of numbers of significant digits
int	ncout			#I the number of coordinates	
int	min_sigdigits		#I the minimum number of signficant digits

int	op, num_field, width, cf, cfptr
pointer	sp, field
int	gstrcpy()

begin
	call smark (sp)
	call salloc (field, SZ_LINE, TY_CHAR)

	# Initialize output pointer.
	op = 1

	# Copy the file replacing fields as one goes.
	do num_field = 1, nfields {

	    # Find the width of the field.
	    width = field_pos[num_field + 1] - field_pos[num_field]

	    # Find the field to be replaced.
	    cfptr = 0
	    do cf = 1, ncin {
		if (cinfields[cf] != num_field)
		    next
		cfptr = cf
		    break
	    }

	    # Replace the field.
	    if (cfptr != 0) {
		if (laxno[cfptr] == 0) {
		    Memc[field] = EOS
		    next
	            #call li_format_field$t ($INDEF$T, Memc[field], maxch,
		        #Memc[formats[cfptr]], nsdig[cfptr], width,
			#min_sigdigits)
		} else
	            call li_format_field$t (coords[laxno[cfptr]], Memc[field],
		        maxch, Memc[formats[laxno[cfptr]]], nsdig[laxno[cfptr]],
		        width, min_sigdigits)
	    } else {
	        # Put "width" characters from inbuf into field
		call strcpy (inbuf[field_pos[num_field]], Memc[field], width)
	    }

	    # Fields must be delimited by at least one blank.
	    if (num_field > 1 && !IS_WHITE (Memc[field])) {
		outbuf[op] = ' '
		op = op + 1
	    }

	    # Copy "field" to output buffer.
	    op = op + gstrcpy (Memc[field], outbuf[op], maxch)
	}

	do cfptr = ncin + 1, ncout {

	    # Copy out the extra fields if any.
	    if (laxno[cfptr] == 0) {
		Memc[field] = EOS
		next
	        #call li_format_field$t ($INDEF$T, Memc[field], maxch, "%g",
		    #min_sigdigits, width, min_sigdigits)
	    } else
	        call li_format_field$t (coords[laxno[cfptr]], Memc[field],
		    maxch, Memc[formats[laxno[cfptr]]], nsdig[laxno[cfptr]],
		    width, min_sigdigits)

	    # Fields must be delimited by at least one blank.
	    if (!IS_WHITE (Memc[field])) {
		outbuf[op] = ' '
		op = op + 1
	    }

	    # Copy "field" to output buffer.
	    op = op + gstrcpy (Memc[field], outbuf[op], maxch)
	}

	outbuf[op] = '\n'
	outbuf[op+1] = EOS

	call sfree (sp)
end


$endfor