1 /* stdlib is needed for the abs function */
2 #include <stdlib.h>
3 /*
4    The following prototype code was provided by Doug Tody, NRAO, for
5    performing conversion between pixel arrays and line lists.  The
6    compression technique is used in IRAF.
7 */
8 int pl_p2li (int *pxsrc, int xs, short *lldst, int npix);
9 int pl_l2pi (short *ll_src, int xs, int *px_dst, int npix);
10 
11 
12 /*
13  * PL_P2L -- Convert a pixel array to a line list.  The length of the list is
14  * returned as the function value.
15  *
16  * Translated from the SPP version using xc -f, f2c.  8Sep99 DCT.
17  */
18 
19 #ifndef min
20 #define min(a,b)        (((a)<(b))?(a):(b))
21 #endif
22 #ifndef max
23 #define max(a,b)        (((a)>(b))?(a):(b))
24 #endif
25 
pl_p2li(int * pxsrc,int xs,short * lldst,int npix)26 int pl_p2li (int *pxsrc, int xs, short *lldst, int npix)
27 /* int *pxsrc;                      input pixel array */
28 /* int xs;                          starting index in pxsrc (?) */
29 /* short *lldst;                    encoded line list */
30 /* int npix;                        number of pixels to convert */
31 {
32     /* System generated locals */
33     int ret_val, i__1, i__2, i__3;
34 
35     /* Local variables */
36     int zero, v, x1, hi, ip, dv, xe, np, op, iz, nv = 0, pv, nz;
37 
38     /* Parameter adjustments */
39     --lldst;
40     --pxsrc;
41 
42     /* Function Body */
43     if (! (npix <= 0)) {
44         goto L110;
45     }
46     ret_val = 0;
47     goto L100;
48 L110:
49     lldst[3] = -100;
50     lldst[2] = 7;
51     lldst[1] = 0;
52     lldst[6] = 0;
53     lldst[7] = 0;
54     xe = xs + npix - 1;
55     op = 8;
56     zero = 0;
57 /* Computing MAX */
58     i__1 = zero, i__2 = pxsrc[xs];
59     pv = max(i__1,i__2);
60     x1 = xs;
61     iz = xs;
62     hi = 1;
63     i__1 = xe;
64     for (ip = xs; ip <= i__1; ++ip) {
65         if (! (ip < xe)) {
66             goto L130;
67         }
68 /* Computing MAX */
69         i__2 = zero, i__3 = pxsrc[ip + 1];
70         nv = max(i__2,i__3);
71         if (! (nv == pv)) {
72             goto L140;
73         }
74         goto L120;
75 L140:
76         if (! (pv == 0)) {
77             goto L150;
78         }
79         pv = nv;
80         x1 = ip + 1;
81         goto L120;
82 L150:
83         goto L131;
84 L130:
85         if (! (pv == 0)) {
86             goto L160;
87         }
88         x1 = xe + 1;
89 L160:
90 L131:
91         np = ip - x1 + 1;
92         nz = x1 - iz;
93         if (! (pv > 0)) {
94             goto L170;
95         }
96         dv = pv - hi;
97         if (! (dv != 0)) {
98             goto L180;
99         }
100         hi = pv;
101         if (! (abs(dv) > 4095)) {
102             goto L190;
103         }
104         lldst[op] = (short) ((pv & 4095) + 4096);
105         ++op;
106         lldst[op] = (short) (pv / 4096);
107         ++op;
108         goto L191;
109 L190:
110         if (! (dv < 0)) {
111             goto L200;
112         }
113         lldst[op] = (short) (-dv + 12288);
114         goto L201;
115 L200:
116         lldst[op] = (short) (dv + 8192);
117 L201:
118         ++op;
119         if (! (np == 1 && nz == 0)) {
120             goto L210;
121         }
122         v = lldst[op - 1];
123         lldst[op - 1] = (short) (v | 16384);
124         goto L91;
125 L210:
126 L191:
127 L180:
128 L170:
129         if (! (nz > 0)) {
130             goto L220;
131         }
132 L230:
133         if (! (nz > 0)) {
134             goto L232;
135         }
136         lldst[op] = (short) min(4095,nz);
137         ++op;
138 /* L231: */
139         nz += -4095;
140         goto L230;
141 L232:
142         if (! (np == 1 && pv > 0)) {
143             goto L240;
144         }
145         lldst[op - 1] = (short) (lldst[op - 1] + 20481);
146         goto L91;
147 L240:
148 L220:
149 L250:
150         if (! (np > 0)) {
151             goto L252;
152         }
153         lldst[op] = (short) (min(4095,np) + 16384);
154         ++op;
155 /* L251: */
156         np += -4095;
157         goto L250;
158 L252:
159 L91:
160         x1 = ip + 1;
161         iz = x1;
162         pv = nv;
163 L120:
164         ;
165     }
166 /* L121: */
167     lldst[4] = (short) ((op - 1) % 32768);
168     lldst[5] = (short) ((op - 1) / 32768);
169     ret_val = op - 1;
170     goto L100;
171 L100:
172     return ret_val;
173 } /* plp2li_ */
174 
175 /*
176  * PL_L2PI -- Translate a PLIO line list into an integer pixel array.
177  * The number of pixels output (always npix) is returned as the function
178  * value.
179  *
180  * Translated from the SPP version using xc -f, f2c.  8Sep99 DCT.
181  */
182 
pl_l2pi(short * ll_src,int xs,int * px_dst,int npix)183 int pl_l2pi (short *ll_src, int xs, int *px_dst, int npix)
184 /* short *ll_src;                   encoded line list */
185 /* int xs;                          starting index in ll_src */
186 /* int *px_dst;                    output pixel array */
187 /* int npix;                       number of pixels to convert */
188 {
189     /* System generated locals */
190     int ret_val, i__1, i__2;
191 
192     /* Local variables */
193     int data, sw0001, otop, i__, lllen, i1, i2, x1, x2, ip, xe, np,
194              op, pv, opcode, llfirt;
195     int skipwd;
196 
197     /* Parameter adjustments */
198     --px_dst;
199     --ll_src;
200 
201     /* Function Body */
202     if (! (ll_src[3] > 0)) {
203         goto L110;
204     }
205     lllen = ll_src[3];
206     llfirt = 4;
207     goto L111;
208 L110:
209     lllen = (ll_src[5] << 15) + ll_src[4];
210     llfirt = ll_src[2] + 1;
211 L111:
212     if (! (npix <= 0 || lllen <= 0)) {
213         goto L120;
214     }
215     ret_val = 0;
216     goto L100;
217 L120:
218     xe = xs + npix - 1;
219     skipwd = 0;
220     op = 1;
221     x1 = 1;
222     pv = 1;
223     i__1 = lllen;
224     for (ip = llfirt; ip <= i__1; ++ip) {
225         if (! skipwd) {
226             goto L140;
227         }
228         skipwd = 0;
229         goto L130;
230 L140:
231         opcode = ll_src[ip] / 4096;
232         data = ll_src[ip] & 4095;
233         sw0001 = opcode;
234         goto L150;
235 L160:
236         x2 = x1 + data - 1;
237         i1 = max(x1,xs);
238         i2 = min(x2,xe);
239         np = i2 - i1 + 1;
240         if (! (np > 0)) {
241             goto L170;
242         }
243         otop = op + np - 1;
244         if (! (opcode == 4)) {
245             goto L180;
246         }
247         i__2 = otop;
248         for (i__ = op; i__ <= i__2; ++i__) {
249             px_dst[i__] = pv;
250 /* L190: */
251         }
252 /* L191: */
253         goto L181;
254 L180:
255         i__2 = otop;
256         for (i__ = op; i__ <= i__2; ++i__) {
257             px_dst[i__] = 0;
258 /* L200: */
259         }
260 /* L201: */
261         if (! (opcode == 5 && i2 == x2)) {
262             goto L210;
263         }
264         px_dst[otop] = pv;
265 L210:
266 L181:
267         op = otop + 1;
268 L170:
269         x1 = x2 + 1;
270         goto L151;
271 L220:
272         pv = (ll_src[ip + 1] << 12) + data;
273         skipwd = 1;
274         goto L151;
275 L230:
276         pv += data;
277         goto L151;
278 L240:
279         pv -= data;
280         goto L151;
281 L250:
282         pv += data;
283         goto L91;
284 L260:
285         pv -= data;
286 L91:
287         if (! (x1 >= xs && x1 <= xe)) {
288             goto L270;
289         }
290         px_dst[op] = pv;
291         ++op;
292 L270:
293         ++x1;
294         goto L151;
295 L150:
296         ++sw0001;
297         if (sw0001 < 1 || sw0001 > 8) {
298             goto L151;
299         }
300         switch ((int)sw0001) {
301             case 1:  goto L160;
302             case 2:  goto L220;
303             case 3:  goto L230;
304             case 4:  goto L240;
305             case 5:  goto L160;
306             case 6:  goto L160;
307             case 7:  goto L250;
308             case 8:  goto L260;
309         }
310 L151:
311         if (! (x1 > xe)) {
312             goto L280;
313         }
314         goto L131;
315 L280:
316 L130:
317         ;
318     }
319 L131:
320     i__1 = npix;
321     for (i__ = op; i__ <= i__1; ++i__) {
322         px_dst[i__] = 0;
323 /* L290: */
324     }
325 /* L291: */
326     ret_val = npix;
327     goto L100;
328 L100:
329     return ret_val;
330 } /* pll2pi_ */
331 
332