aboutsummaryrefslogtreecommitdiff
path: root/pkg/xtools/mef/mefwrpl.x
blob: 1eef1cc24c59086d51b0de654cc7de0704ffdf74 (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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
include <error.h>
include <pkg/mef.h>

define MEF_PLSIZE  MEF_CGROUP
# MEF_WRPL -- 

procedure mef_wrpl (mef, title, ctime,mtime, limtime, minval, 
   	      maxval,plbuf, naxis, axlen)

char    title[ARB]
int	ctime, mtime, limtime
real	minval, maxval
pointer	mef		#I input mef descriptor
short   plbuf		#I Pixel list buffer
int	naxis, axlen[ARB]

pointer sp, ln, mii, hb
char    blank[1]
int	output_lines, npad, i 
int	pcount, fd, nlines
bool    endk, new_outf
errchk  open, fcopyo

begin
	call smark (sp)
	call salloc (ln, LEN_CARDNL, TY_CHAR)

	# Output file descriptor
	fd  = MEF_FD(mef)

	new_outf = false
	if (MEF_ACMODE(mef) == NEW_IMAGE)
	   new_outf = true

	output_lines = 0
	endk = false

	# Create a PHU
	if (new_outf) {
	    # Must create a dummy header if input extension is not image
	    Memc[ln] = EOS
	    call mef_dummyhdr (fd, Memc[ln])
	    new_outf = false
	} 

	call mef_wcardc ("XTENSION", "BINTABLE", "Extension type", fd)
	call mef_wcardi ("BITPIX", 8, "Default value", fd)
	call mef_wcardi ("NAXIS", 2, "Lines and cols", fd)
	call mef_wcardi ("NAXIS1", 8, "Nbytes per line", fd)
	call mef_wcardi ("NAXIS2", 1, "Nlines", fd)
	
	# Calculate the number of 2880 bytes block the heap will
	# occupy.

	pcount = ((MEF_PLSIZE(mef)+1439)/1440)*2880
	call mef_wcardi ("PCOUNT", pcount, "Heap size in bytes", fd)
	call mef_wcardi ("GCOUNT", 1, "1 Group", fd)
	call mef_wcardi ("TFIELDS", 1, "1 Column field", fd)
	call sprintf (Memc[ln], LEN_CARD, "PI(%d)")
	    call pargi(MEF_PLSIZE(mef))
	call mef_wcardc ("TFORM1", Memc[ln], "Variable word array", fd)
	call mef_wcardb ("INHERIT", NO, "No Inherit", fd)
        call mef_wcardc ("ORIGIN", FITS_ORIGIN, "FITS file originator", fd)
	call mef_wcardc ("EXTNAME", MEF_EXTNAME(mef), "", fd)
	call mef_wcardi ("EXTVER", MEF_EXTVER(mef), "", fd)
	call mef_wcardi ("CTIME", ctime, "", fd)
	call mef_wcardi ("MTIME", mtime, "", fd)
	call mef_wcardi ("LIMTIME", limtime, "", fd)
	call mef_wcardr ("DATAMIN", minval, "", fd)
	call mef_wcardr ("DATAMAX", maxval, "", fd)
	call mef_wcardc ("OBJECT", title, "", fd)

	call mef_wcardb ("CMPIMAGE", YES, "Is a compressed image", fd)
	call mef_wcardc ("CMPTYPE", "PLIO_1", "IRAF image masks", fd)
	call mef_wcardi ("CBITPIX", 32, "BITPIX for uncompressed image", fd)
	call mef_wcardi ("CNAXIS", naxis, "NAXIS for uncompressed image", fd)
	do i = 1, naxis {
	    call sprintf (Memc[ln], LEN_CARD, "NAXIS%d")
		call pargi(i)
	    call mef_wcardi ("CNAXIS", axlen[i], "axis length", fd)
	}
	
	hb = MEF_HDRP(mef)	
	output_lines = 23
	nlines = MEF_HSIZE(mef) / LEN_CARDNL

	for (i=1; i<= nlines; i=i+1) {
	    call mef_pakwr (fd, Memc[hb])
	    hb = hb + LEN_CARDNL
	}

        blank[1] = ' '
	call amovkc (blank, Memc[ln], 80)
	call strcpy ("END", Memc[ln], 3)
	Memc[ln+3] = ' '                           # Clear EOS mark
	call mef_pakwr (fd, Memc[ln])

	output_lines = output_lines + nlines + 1 + naxis
	call mef_wrblank (fd, output_lines)

	call salloc (mii, 1400, TY_INT)

	# Now write 2 integers as table data (nelem,offset)
	Memi[mii] = MEF_PLSIZE(mef)	 # Number of words in pl buff (2bytes)
	Memi[mii+1] = 0			 # Offset from start of heap

	npad = 1438
	call amovki (0, Memi[mii+2], npad)
	call write (fd, Memi[mii], 1440)

	# Write mask in heap area
	call write (fd, plbuf, MEF_PLSIZE(mef)*SZ_SHORT)

	# Pad to 1440 characters block in case we want to append another
	# extension

	npad = 1440 - mod (MEF_PLSIZE(mef), 1440)

	call amovki (0, Memi[mii], npad)
	call write (fd, Memi[mii], npad)
							 

	call sfree(sp)
end

procedure mef_wcardi (kname, kvalue, kcomm, fd)

char	kname[ARB]	#I Keyword name
int	kvalue	        #I Keyword value
char 	kcomm[ARB]	#I Card comment
int	fd	        #I file descriptor

pointer sp, ln

begin

	call smark (sp)
	call salloc (ln, LEN_CARDNL, TY_CHAR)

	call mef_encodei (kname, kvalue, Memc[ln], kcomm)
	call mef_pakwr (fd, Memc[ln])

	call sfree (sp)

end


procedure mef_wcardc (kname, kvalue, kcomm, fd)

char	kname[ARB]	#I Keyword name
char	kvalue[ARB]	#I Keyword value
char 	kcomm[ARB]	#I Card comment
int	fd   	        #I file descriptor

pointer sp, ln
int     slen, strlen()

begin

	call smark (sp)
	call salloc (ln, LEN_CARDNL, TY_CHAR)

	slen = strlen(kvalue)
	call mef_encodec (kname, kvalue, slen, Memc[ln], kcomm)
	call mef_pakwr (fd, Memc[ln])

	call sfree(sp)

end


procedure mef_wcardb (kname, kvalue, kcomm, fd)

char	kname[ARB]	#I Keyword name
int	kvalue	        #I Keyword value
char 	kcomm[ARB]	#I Card comment
int	fd	        #I file descriptor

pointer sp, ln

begin

	call smark (sp)
	call salloc (ln, LEN_CARDNL, TY_CHAR)

	call mef_encodeb (kname, kvalue, Memc[ln], kcomm)
	call mef_pakwr (fd, Memc[ln])

	call sfree(sp)

end

procedure mef_wcardr (kname, kvalue, kcomm, fd)

char	kname[ARB]	#I Keyword name
real	kvalue		#I Keyword value
char 	kcomm[ARB]	#I Card comment
int	fd	        #I file descriptor

pointer sp, ln

begin

	call smark (sp)
	call salloc (ln, LEN_CARDNL, TY_CHAR)

	call mef_encoder (kname, kvalue, Memc[ln], kcomm, 6)
	call mef_pakwr (fd, Memc[ln])

	call sfree(sp)

end