xref: /plan9/sys/src/cmd/postscript/postgif/postgif.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier 
2*219b2ee8SDavid du Colombier #include <stdio.h>
3*219b2ee8SDavid du Colombier #include <string.h>
4*219b2ee8SDavid du Colombier #include <signal.h>
5*219b2ee8SDavid du Colombier #include <ctype.h>
6*219b2ee8SDavid du Colombier #ifdef plan9
7*219b2ee8SDavid du Colombier #define	isascii(c)	((unsigned char)(c)<=0177)
8*219b2ee8SDavid du Colombier #endif
9*219b2ee8SDavid du Colombier #include <sys/types.h>
10*219b2ee8SDavid du Colombier #include <fcntl.h>
11*219b2ee8SDavid du Colombier 
12*219b2ee8SDavid du Colombier #include "comments.h"
13*219b2ee8SDavid du Colombier #include "gen.h"
14*219b2ee8SDavid du Colombier #include "path.h"
15*219b2ee8SDavid du Colombier #include "ext.h"
16*219b2ee8SDavid du Colombier 
17*219b2ee8SDavid du Colombier #define dbprt	if (debug) fprintf
18*219b2ee8SDavid du Colombier 
19*219b2ee8SDavid du Colombier char	*optnames = "a:c:fglm:n:o:p:x:y:C:E:DG:IL:P:";
20*219b2ee8SDavid du Colombier char    *prologue = POSTGIF;		/* default PostScript prologue */
21*219b2ee8SDavid du Colombier char    *formfile = FORMFILE;           /* stuff for multiple pages per sheet */
22*219b2ee8SDavid du Colombier int     formsperpage = 1;               /* page images on each piece of paper */
23*219b2ee8SDavid du Colombier int	copies = 1;                     /* and this many copies of each sheet */
24*219b2ee8SDavid du Colombier int     page = 0;                       /* last page we worked on */
25*219b2ee8SDavid du Colombier int     printed = 0;                    /* and the number of pages printed */
26*219b2ee8SDavid du Colombier 
27*219b2ee8SDavid du Colombier extern char *malloc();
28*219b2ee8SDavid du Colombier extern void free();
29*219b2ee8SDavid du Colombier extern double atof(), pow();
30*219b2ee8SDavid du Colombier 
31*219b2ee8SDavid du Colombier unsigned char ibuf[BUFSIZ];
32*219b2ee8SDavid du Colombier unsigned char *cmap, *gcmap, *lcmap;
33*219b2ee8SDavid du Colombier unsigned char *gmap, *ggmap, *lgmap;
34*219b2ee8SDavid du Colombier unsigned char *pmap;
35*219b2ee8SDavid du Colombier double gamma;
36*219b2ee8SDavid du Colombier float cr = 0.3, cg = 0.59, cb = 0.11;
37*219b2ee8SDavid du Colombier int maplength, gmaplength, lmaplength;
38*219b2ee8SDavid du Colombier int scrwidth, scrheight;
39*219b2ee8SDavid du Colombier int gcolormap, lcolormap;
40*219b2ee8SDavid du Colombier int bitperpixel, background;
41*219b2ee8SDavid du Colombier int imageleft, imagetop;
42*219b2ee8SDavid du Colombier int imagewidth, imageheight;
43*219b2ee8SDavid du Colombier int interlaced, lbitperpixel;
44*219b2ee8SDavid du Colombier int gray = 0;
45*219b2ee8SDavid du Colombier int gammaflag = 0;
46*219b2ee8SDavid du Colombier int negative = 0;
47*219b2ee8SDavid du Colombier int terminate = 0;
48*219b2ee8SDavid du Colombier int codesize, clearcode, endcode, curstblsize, pmindex, byteinibuf, bitsleft;
49*219b2ee8SDavid du Colombier int prefix[4096], suffix[4096], cstbl[4096];
50*219b2ee8SDavid du Colombier int bburx = -32767, bbury = -32767;
51*219b2ee8SDavid du Colombier FILE *fp_in = NULL;
52*219b2ee8SDavid du Colombier FILE *fp_out = stdout;
53*219b2ee8SDavid du Colombier 
54*219b2ee8SDavid du Colombier char *
allocate(size)55*219b2ee8SDavid du Colombier allocate(size)
56*219b2ee8SDavid du Colombier     int size;
57*219b2ee8SDavid du Colombier {
58*219b2ee8SDavid du Colombier     char *p;
59*219b2ee8SDavid du Colombier 
60*219b2ee8SDavid du Colombier     if ((p = malloc(size)) == NULL) error(FATAL, "not enough memory");
61*219b2ee8SDavid du Colombier     return(p);
62*219b2ee8SDavid du Colombier }
63*219b2ee8SDavid du Colombier 
64*219b2ee8SDavid du Colombier void
puthex(c,fp)65*219b2ee8SDavid du Colombier puthex(c, fp)
66*219b2ee8SDavid du Colombier     unsigned char c;
67*219b2ee8SDavid du Colombier     FILE *fp;
68*219b2ee8SDavid du Colombier {
69*219b2ee8SDavid du Colombier     static char hextbl[16] = {
70*219b2ee8SDavid du Colombier 	'0', '1', '2', '3', '4', '5', '6', '7',
71*219b2ee8SDavid du Colombier 	'8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
72*219b2ee8SDavid du Colombier     };
73*219b2ee8SDavid du Colombier 
74*219b2ee8SDavid du Colombier     putc(hextbl[(c >> 4) & 017], fp);
75*219b2ee8SDavid du Colombier     putc(hextbl[c & 017], fp);
76*219b2ee8SDavid du Colombier }
77*219b2ee8SDavid du Colombier 
78*219b2ee8SDavid du Colombier void
setcolormap(bp)79*219b2ee8SDavid du Colombier setcolormap(bp)
80*219b2ee8SDavid du Colombier     int bp;
81*219b2ee8SDavid du Colombier {
82*219b2ee8SDavid du Colombier     int i, entries = 1, scale = 1;
83*219b2ee8SDavid du Colombier     unsigned char *p, *q;
84*219b2ee8SDavid du Colombier 
85*219b2ee8SDavid du Colombier     for (i = 0; i < bp; i++) entries *= 2;
86*219b2ee8SDavid du Colombier     for (i = 0; i < 8 - bp; i++) scale *= 2;
87*219b2ee8SDavid du Colombier     gcmap = (unsigned char *) allocate(entries*3);
88*219b2ee8SDavid du Colombier     ggmap = (unsigned char *) allocate(entries);
89*219b2ee8SDavid du Colombier     gmaplength = entries;
90*219b2ee8SDavid du Colombier     for (i = 0, p = gcmap, q = ggmap; i < 256; i += scale, p += 3, q++) {
91*219b2ee8SDavid du Colombier 	if (negative) {
92*219b2ee8SDavid du Colombier 	    *p = 255 - i; p[1] = *p; p[2] = *p;
93*219b2ee8SDavid du Colombier 	    *q = *p;
94*219b2ee8SDavid du Colombier 	}
95*219b2ee8SDavid du Colombier 	else {
96*219b2ee8SDavid du Colombier 	    *p = i; p[1] = i; p[2] = i;
97*219b2ee8SDavid du Colombier 	    *q = i;
98*219b2ee8SDavid du Colombier 	}
99*219b2ee8SDavid du Colombier     }
100*219b2ee8SDavid du Colombier     if (gammaflag)
101*219b2ee8SDavid du Colombier     	for (i = 0, p = gcmap; i < 256; i += scale, p += 3) {
102*219b2ee8SDavid du Colombier 	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
103*219b2ee8SDavid du Colombier 	    p[1] = *p; p[2] = *p;
104*219b2ee8SDavid du Colombier 	}
105*219b2ee8SDavid du Colombier dbprt(stderr,"default color map:\n");
106*219b2ee8SDavid du Colombier for (i = 0; i < entries*3; i += 3)
107*219b2ee8SDavid du Colombier dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
108*219b2ee8SDavid du Colombier }
109*219b2ee8SDavid du Colombier 
110*219b2ee8SDavid du Colombier void
readgcolormap(bp)111*219b2ee8SDavid du Colombier readgcolormap(bp)
112*219b2ee8SDavid du Colombier     int bp;
113*219b2ee8SDavid du Colombier {
114*219b2ee8SDavid du Colombier     int i, entries = 1;
115*219b2ee8SDavid du Colombier     unsigned char *p, *q;
116*219b2ee8SDavid du Colombier 
117*219b2ee8SDavid du Colombier     for (i = 0; i < bp; i++) entries *= 2;
118*219b2ee8SDavid du Colombier     gcmap = (unsigned char *) allocate(entries*3);
119*219b2ee8SDavid du Colombier     ggmap = (unsigned char *) allocate(entries);
120*219b2ee8SDavid du Colombier     gmaplength = entries;
121*219b2ee8SDavid du Colombier     fread(gcmap, sizeof(*gcmap), entries*3, fp_in);
122*219b2ee8SDavid du Colombier     if (negative)
123*219b2ee8SDavid du Colombier 	for (i = 0, p = gcmap; i < entries*3; i++, p++) *p = 255 - *p;
124*219b2ee8SDavid du Colombier     for (i = 0, p = gcmap, q = ggmap; i < entries; i++, p += 3, q++)
125*219b2ee8SDavid du Colombier 	*q = cr*(int)p[0] + cg*(int)p[1] + cb*(int)p[2] + 0.5;
126*219b2ee8SDavid du Colombier     if (gammaflag)
127*219b2ee8SDavid du Colombier     	for (i = 0, p = gcmap; i < entries*3; i++, p++)
128*219b2ee8SDavid du Colombier 	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
129*219b2ee8SDavid du Colombier dbprt(stderr,"global color map:\n");
130*219b2ee8SDavid du Colombier for (i = 0; i < entries*3; i += 3)
131*219b2ee8SDavid du Colombier dbprt(stderr, "%d, %d, %d\n", gcmap[i], gcmap[i+1], gcmap[i+2]);
132*219b2ee8SDavid du Colombier }
133*219b2ee8SDavid du Colombier 
134*219b2ee8SDavid du Colombier void
readlcolormap(bp)135*219b2ee8SDavid du Colombier readlcolormap(bp)
136*219b2ee8SDavid du Colombier     int bp;
137*219b2ee8SDavid du Colombier {
138*219b2ee8SDavid du Colombier     int i, entries = 1;
139*219b2ee8SDavid du Colombier     unsigned char *p, *q;
140*219b2ee8SDavid du Colombier 
141*219b2ee8SDavid du Colombier     for (i = 0; i < bp; i++) entries *= 2;
142*219b2ee8SDavid du Colombier     lcmap = (unsigned char *) allocate(entries*3);
143*219b2ee8SDavid du Colombier     lgmap = (unsigned char *) allocate(entries);
144*219b2ee8SDavid du Colombier     lmaplength = entries;
145*219b2ee8SDavid du Colombier     fread(lcmap, sizeof(*lcmap), entries*3, fp_in);
146*219b2ee8SDavid du Colombier     if (negative)
147*219b2ee8SDavid du Colombier 	for (i = 0, p = lcmap; i < entries*3; i++, p++) *p = 255 - *p;
148*219b2ee8SDavid du Colombier     for (i = 0, p = lcmap, q = lgmap; i < entries; i++, p += 3, q++)
149*219b2ee8SDavid du Colombier 	*q = cr*(int)p[0] + cg*(int)p[1] + cb*(int)p[2] + 0.5;
150*219b2ee8SDavid du Colombier     if (gammaflag)
151*219b2ee8SDavid du Colombier     	for (i = 0, p = lcmap; i < entries*3; i++, p++)
152*219b2ee8SDavid du Colombier 	    *p = (unsigned char) (pow((double) *p/256.0, gamma)*256);
153*219b2ee8SDavid du Colombier dbprt(stderr,"local color map:\n");
154*219b2ee8SDavid du Colombier for (i = 0; i < entries*3; i += 3)
155*219b2ee8SDavid du Colombier dbprt(stderr, "%d, %d, %d\n", lcmap[i], lcmap[i+1], lcmap[i+2]);
156*219b2ee8SDavid du Colombier }
157*219b2ee8SDavid du Colombier 
158*219b2ee8SDavid du Colombier void
initstbl()159*219b2ee8SDavid du Colombier initstbl()
160*219b2ee8SDavid du Colombier {
161*219b2ee8SDavid du Colombier     int i, entries = 1, *p, *s;
162*219b2ee8SDavid du Colombier 
163*219b2ee8SDavid du Colombier     for (i = 0; i < codesize; i++) entries *= 2;
164*219b2ee8SDavid du Colombier     clearcode = entries;
165*219b2ee8SDavid du Colombier     endcode = clearcode + 1;
166*219b2ee8SDavid du Colombier     for (i = 0, p = prefix, s = suffix; i <= endcode; i++, p++, s++) {
167*219b2ee8SDavid du Colombier 	*p = endcode;
168*219b2ee8SDavid du Colombier 	*s = i;
169*219b2ee8SDavid du Colombier     }
170*219b2ee8SDavid du Colombier     curstblsize = endcode + 1;
171*219b2ee8SDavid du Colombier     pmindex = 0;
172*219b2ee8SDavid du Colombier     byteinibuf = 0;
173*219b2ee8SDavid du Colombier     bitsleft = 0;
174*219b2ee8SDavid du Colombier }
175*219b2ee8SDavid du Colombier 
176*219b2ee8SDavid du Colombier int
nextbyte()177*219b2ee8SDavid du Colombier nextbyte()
178*219b2ee8SDavid du Colombier {
179*219b2ee8SDavid du Colombier     static ibufindex;
180*219b2ee8SDavid du Colombier 
181*219b2ee8SDavid du Colombier     if (byteinibuf) {
182*219b2ee8SDavid du Colombier 	byteinibuf--;
183*219b2ee8SDavid du Colombier 	ibufindex++;
184*219b2ee8SDavid du Colombier     }
185*219b2ee8SDavid du Colombier     else {
186*219b2ee8SDavid du Colombier     	fread(ibuf, sizeof(*ibuf), 1, fp_in);
187*219b2ee8SDavid du Colombier     	byteinibuf = ibuf[0];
188*219b2ee8SDavid du Colombier dbprt(stderr, "byte count: %d\n", byteinibuf);
189*219b2ee8SDavid du Colombier 	if (byteinibuf) fread(ibuf, sizeof(*ibuf), byteinibuf, fp_in);
190*219b2ee8SDavid du Colombier 	else error(FATAL, "encounter zero byte count block before end code");
191*219b2ee8SDavid du Colombier 	ibufindex = 0;
192*219b2ee8SDavid du Colombier 	byteinibuf--;
193*219b2ee8SDavid du Colombier 	ibufindex++;
194*219b2ee8SDavid du Colombier     }
195*219b2ee8SDavid du Colombier     return(ibuf[ibufindex-1]);
196*219b2ee8SDavid du Colombier }
197*219b2ee8SDavid du Colombier 
198*219b2ee8SDavid du Colombier int masktbl[25] = {
199*219b2ee8SDavid du Colombier     0, 01, 03, 07, 017, 037, 077, 0177, 0377, 0777, 01777, 03777, 07777,
200*219b2ee8SDavid du Colombier     017777, 037777, 077777, 0177777, 0377777, 0777777, 01777777, 03777777,
201*219b2ee8SDavid du Colombier     07777777, 017777777, 037777777, 077777777
202*219b2ee8SDavid du Colombier };
203*219b2ee8SDavid du Colombier 
204*219b2ee8SDavid du Colombier int
getcode()205*219b2ee8SDavid du Colombier getcode()
206*219b2ee8SDavid du Colombier {
207*219b2ee8SDavid du Colombier     int cs, c;
208*219b2ee8SDavid du Colombier     static int oldc;
209*219b2ee8SDavid du Colombier 
210*219b2ee8SDavid du Colombier     if (curstblsize < 4096) cs = cstbl[curstblsize];
211*219b2ee8SDavid du Colombier     else cs = 12;
212*219b2ee8SDavid du Colombier     while (bitsleft < cs) {
213*219b2ee8SDavid du Colombier 	oldc = (oldc & masktbl[bitsleft]) | ((nextbyte() & 0377) << bitsleft);
214*219b2ee8SDavid du Colombier 	bitsleft += 8;
215*219b2ee8SDavid du Colombier     }
216*219b2ee8SDavid du Colombier     c = oldc & masktbl[cs];
217*219b2ee8SDavid du Colombier     oldc = oldc >> cs;
218*219b2ee8SDavid du Colombier     bitsleft -= cs;
219*219b2ee8SDavid du Colombier /* dbprt(stderr, "code: %d %d %d\n", curstblsize, cs, c); */
220*219b2ee8SDavid du Colombier     return(c);
221*219b2ee8SDavid du Colombier }
222*219b2ee8SDavid du Colombier 
223*219b2ee8SDavid du Colombier void
putcode(c)224*219b2ee8SDavid du Colombier putcode(c)
225*219b2ee8SDavid du Colombier     int c;
226*219b2ee8SDavid du Colombier {
227*219b2ee8SDavid du Colombier     if (prefix[c] != endcode) {
228*219b2ee8SDavid du Colombier 	putcode(prefix[c]);
229*219b2ee8SDavid du Colombier 	pmap[pmindex] = suffix[c];
230*219b2ee8SDavid du Colombier 	pmindex++;
231*219b2ee8SDavid du Colombier     }
232*219b2ee8SDavid du Colombier     else {
233*219b2ee8SDavid du Colombier    	pmap[pmindex] = suffix[c];
234*219b2ee8SDavid du Colombier 	pmindex++;
235*219b2ee8SDavid du Colombier     }
236*219b2ee8SDavid du Colombier }
237*219b2ee8SDavid du Colombier 
238*219b2ee8SDavid du Colombier int
firstof(c)239*219b2ee8SDavid du Colombier firstof(c)
240*219b2ee8SDavid du Colombier     int c;
241*219b2ee8SDavid du Colombier {
242*219b2ee8SDavid du Colombier     while (prefix[c] != endcode) c = prefix[c];
243*219b2ee8SDavid du Colombier     return(suffix[c]);
244*219b2ee8SDavid du Colombier }
245*219b2ee8SDavid du Colombier 
246*219b2ee8SDavid du Colombier void
writeimage()247*219b2ee8SDavid du Colombier writeimage()
248*219b2ee8SDavid du Colombier {
249*219b2ee8SDavid du Colombier     int i, j, k;
250*219b2ee8SDavid du Colombier 
251*219b2ee8SDavid du Colombier dbprt(stderr, "pmindex: %d\n", pmindex);
252*219b2ee8SDavid du Colombier     fputs("save\n", fp_out);
253*219b2ee8SDavid du Colombier     fprintf(fp_out, "/codestr %d string def\n", imagewidth);
254*219b2ee8SDavid du Colombier     if (!gray) {
255*219b2ee8SDavid du Colombier     	fprintf(fp_out, "/colortbl currentfile %d string readhexstring\n",
256*219b2ee8SDavid du Colombier 	    maplength*3);
257*219b2ee8SDavid du Colombier         for (i = 0; i < maplength; i++) puthex(cmap[i], fp_out);
258*219b2ee8SDavid du Colombier         fputs("\n", fp_out);
259*219b2ee8SDavid du Colombier         for (i = maplength ; i < maplength*2; i++) puthex(cmap[i], fp_out);
260*219b2ee8SDavid du Colombier         fputs("\n", fp_out);
261*219b2ee8SDavid du Colombier         for (i = maplength*2 ; i < maplength*3; i++) puthex(cmap[i], fp_out);
262*219b2ee8SDavid du Colombier         fputs("\npop def\n", fp_out);
263*219b2ee8SDavid du Colombier     	fprintf(fp_out, "/graytbl currentfile %d string readhexstring\n",
264*219b2ee8SDavid du Colombier 	    maplength);
265*219b2ee8SDavid du Colombier         for (i = 0; i < maplength; i++) puthex(gmap[i], fp_out);
266*219b2ee8SDavid du Colombier         fputs("\npop def\n", fp_out);
267*219b2ee8SDavid du Colombier     }
268*219b2ee8SDavid du Colombier     fprintf(fp_out, "%s %d %d %d %d gifimage\n",
269*219b2ee8SDavid du Colombier 	gray ? "true" : "false", imagewidth, imageheight,
270*219b2ee8SDavid du Colombier 	scrwidth - imageleft - imagewidth, scrheight - imagetop - imageheight);
271*219b2ee8SDavid du Colombier     if (gray) {
272*219b2ee8SDavid du Colombier 	if (interlaced) {
273*219b2ee8SDavid du Colombier 	    int *iltbl;
274*219b2ee8SDavid du Colombier 
275*219b2ee8SDavid du Colombier 	    iltbl = (int *) allocate(imageheight*sizeof(int));
276*219b2ee8SDavid du Colombier 	    j = 0;
277*219b2ee8SDavid du Colombier 	    for (i = 0; i < imageheight; i += 8) {
278*219b2ee8SDavid du Colombier 		iltbl[i] = j;
279*219b2ee8SDavid du Colombier 		j += imagewidth;
280*219b2ee8SDavid du Colombier 	    }
281*219b2ee8SDavid du Colombier dbprt(stderr, "pass1: %d\n", j);
282*219b2ee8SDavid du Colombier 	    for (i = 4; i < imageheight; i += 8) {
283*219b2ee8SDavid du Colombier 		iltbl[i] = j;
284*219b2ee8SDavid du Colombier 		j += imagewidth;
285*219b2ee8SDavid du Colombier 	    }
286*219b2ee8SDavid du Colombier dbprt(stderr, "pass2: %d\n", j);
287*219b2ee8SDavid du Colombier 	    for (i = 2; i < imageheight; i += 4) {
288*219b2ee8SDavid du Colombier 		iltbl[i] = j;
289*219b2ee8SDavid du Colombier 		j += imagewidth;
290*219b2ee8SDavid du Colombier 	    }
291*219b2ee8SDavid du Colombier dbprt(stderr, "pass3: %d\n", j);
292*219b2ee8SDavid du Colombier 	    for (i = 1; i < imageheight; i += 2) {
293*219b2ee8SDavid du Colombier 		iltbl[i] = j;
294*219b2ee8SDavid du Colombier 		j += imagewidth;
295*219b2ee8SDavid du Colombier 	    }
296*219b2ee8SDavid du Colombier dbprt(stderr, "pass4: %d\n", j);
297*219b2ee8SDavid du Colombier 
298*219b2ee8SDavid du Colombier     	    for (i = 0; i < imageheight; i++) {
299*219b2ee8SDavid du Colombier 		k = iltbl[i];
300*219b2ee8SDavid du Colombier 	        for (j = 0; j < imagewidth; j++, k++)
301*219b2ee8SDavid du Colombier 		    puthex(gmap[pmap[k]], fp_out);
302*219b2ee8SDavid du Colombier 	        fputs("\n", fp_out);
303*219b2ee8SDavid du Colombier 	    }
304*219b2ee8SDavid du Colombier 	}
305*219b2ee8SDavid du Colombier 	else {
306*219b2ee8SDavid du Colombier     	    for (i = 0, k = 0; i < imageheight; i++) {
307*219b2ee8SDavid du Colombier 	        for (j = 0; j < imagewidth; j++, k++)
308*219b2ee8SDavid du Colombier 		    puthex(gmap[pmap[k]], fp_out);
309*219b2ee8SDavid du Colombier 	        fputs("\n", fp_out);
310*219b2ee8SDavid du Colombier 	    }
311*219b2ee8SDavid du Colombier     	}
312*219b2ee8SDavid du Colombier     }
313*219b2ee8SDavid du Colombier     else {
314*219b2ee8SDavid du Colombier 	if (interlaced) {
315*219b2ee8SDavid du Colombier 	    int *iltbl;
316*219b2ee8SDavid du Colombier 
317*219b2ee8SDavid du Colombier 	    iltbl = (int *) allocate(imageheight*sizeof(int));
318*219b2ee8SDavid du Colombier 	    j = 0;
319*219b2ee8SDavid du Colombier 	    for (i = 0; i < imageheight; i += 8) {
320*219b2ee8SDavid du Colombier 		iltbl[i] = j;
321*219b2ee8SDavid du Colombier 		j += imagewidth;
322*219b2ee8SDavid du Colombier 	    }
323*219b2ee8SDavid du Colombier dbprt(stderr, "pass1: %d\n", j);
324*219b2ee8SDavid du Colombier 	    for (i = 4; i < imageheight; i += 8) {
325*219b2ee8SDavid du Colombier 		iltbl[i] = j;
326*219b2ee8SDavid du Colombier 		j += imagewidth;
327*219b2ee8SDavid du Colombier 	    }
328*219b2ee8SDavid du Colombier dbprt(stderr, "pass2: %d\n", j);
329*219b2ee8SDavid du Colombier 	    for (i = 2; i < imageheight; i += 4) {
330*219b2ee8SDavid du Colombier 		iltbl[i] = j;
331*219b2ee8SDavid du Colombier 		j += imagewidth;
332*219b2ee8SDavid du Colombier 	    }
333*219b2ee8SDavid du Colombier dbprt(stderr, "pass3: %d\n", j);
334*219b2ee8SDavid du Colombier 	    for (i = 1; i < imageheight; i += 2) {
335*219b2ee8SDavid du Colombier 		iltbl[i] = j;
336*219b2ee8SDavid du Colombier 		j += imagewidth;
337*219b2ee8SDavid du Colombier 	    }
338*219b2ee8SDavid du Colombier dbprt(stderr, "pass4: %d\n", j);
339*219b2ee8SDavid du Colombier 
340*219b2ee8SDavid du Colombier     	    for (i = 0; i < imageheight; i++) {
341*219b2ee8SDavid du Colombier 		k = iltbl[i];
342*219b2ee8SDavid du Colombier 	        for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
343*219b2ee8SDavid du Colombier 	        fputs("\n", fp_out);
344*219b2ee8SDavid du Colombier     	    }
345*219b2ee8SDavid du Colombier 	}
346*219b2ee8SDavid du Colombier 	else {
347*219b2ee8SDavid du Colombier     	    for (i = 0, k = 0; i < imageheight; i++) {
348*219b2ee8SDavid du Colombier 	        for (j = 0; j < imagewidth; j++, k++) puthex(pmap[k], fp_out);
349*219b2ee8SDavid du Colombier 	        fputs("\n", fp_out);
350*219b2ee8SDavid du Colombier     	    }
351*219b2ee8SDavid du Colombier 	}
352*219b2ee8SDavid du Colombier     }
353*219b2ee8SDavid du Colombier     fputs("restore\n", fp_out);
354*219b2ee8SDavid du Colombier }
355*219b2ee8SDavid du Colombier 
356*219b2ee8SDavid du Colombier void
readimage()357*219b2ee8SDavid du Colombier readimage()
358*219b2ee8SDavid du Colombier {
359*219b2ee8SDavid du Colombier     int bytecount, zerobytecount = 0;
360*219b2ee8SDavid du Colombier     int code, oldcode;
361*219b2ee8SDavid du Colombier 
362*219b2ee8SDavid du Colombier     fread(ibuf, sizeof(*ibuf), 9, fp_in);
363*219b2ee8SDavid du Colombier     imageleft = ibuf[0] + 256*ibuf[1];
364*219b2ee8SDavid du Colombier     imagetop = ibuf[2] + 256*ibuf[3];
365*219b2ee8SDavid du Colombier     imagewidth = ibuf[4] + 256*ibuf[5];
366*219b2ee8SDavid du Colombier     imageheight = ibuf[6] + 256*ibuf[7];
367*219b2ee8SDavid du Colombier     lcolormap = ibuf[8] & 0200;
368*219b2ee8SDavid du Colombier     interlaced = ibuf[8] & 0100;
369*219b2ee8SDavid du Colombier     lbitperpixel = (ibuf[8] & 07) + 1;
370*219b2ee8SDavid du Colombier dbprt(stderr, "imageleft: %d\n", imageleft);
371*219b2ee8SDavid du Colombier dbprt(stderr, "imagetop: %d\n", imagetop);
372*219b2ee8SDavid du Colombier dbprt(stderr, "imagewidth: %d\n", imagewidth);
373*219b2ee8SDavid du Colombier dbprt(stderr, "imgaeheight: %d\n", imageheight);
374*219b2ee8SDavid du Colombier dbprt(stderr, "lcolormap: %d\n", lcolormap ? 1 : 0);
375*219b2ee8SDavid du Colombier dbprt(stderr, "interlaced: %d\n", interlaced ? 1 : 0);
376*219b2ee8SDavid du Colombier dbprt(stderr, "lbitperpixel: %d\n", lbitperpixel);
377*219b2ee8SDavid du Colombier     if (lcolormap) {
378*219b2ee8SDavid du Colombier 	readlcolormap(lbitperpixel);
379*219b2ee8SDavid du Colombier 	cmap = lcmap;
380*219b2ee8SDavid du Colombier 	gmap = lgmap;
381*219b2ee8SDavid du Colombier 	maplength = lmaplength;
382*219b2ee8SDavid du Colombier     }
383*219b2ee8SDavid du Colombier 
384*219b2ee8SDavid du Colombier dbprt(stderr, "start reading raster data\n");
385*219b2ee8SDavid du Colombier     fread(ibuf, sizeof(*ibuf), 1, fp_in);
386*219b2ee8SDavid du Colombier     codesize = ibuf[0];
387*219b2ee8SDavid du Colombier dbprt(stderr, "codesize: %d\n", codesize);
388*219b2ee8SDavid du Colombier     pmap = (unsigned char *) allocate(imagewidth*imageheight);
389*219b2ee8SDavid du Colombier     initstbl();
390*219b2ee8SDavid du Colombier     while ((code = getcode()) != endcode) {
391*219b2ee8SDavid du Colombier 	if (code == clearcode) {
392*219b2ee8SDavid du Colombier 	    curstblsize = endcode + 1;
393*219b2ee8SDavid du Colombier     	    code = getcode();
394*219b2ee8SDavid du Colombier     	    putcode(code);
395*219b2ee8SDavid du Colombier     	    oldcode = code;
396*219b2ee8SDavid du Colombier 	}
397*219b2ee8SDavid du Colombier 	else if (code < curstblsize) {
398*219b2ee8SDavid du Colombier 	    putcode(code);
399*219b2ee8SDavid du Colombier 	    prefix[curstblsize] = oldcode;
400*219b2ee8SDavid du Colombier 	    suffix[curstblsize] = firstof(code);
401*219b2ee8SDavid du Colombier 	    curstblsize++;
402*219b2ee8SDavid du Colombier 	    oldcode = code;
403*219b2ee8SDavid du Colombier 	}
404*219b2ee8SDavid du Colombier 	else {
405*219b2ee8SDavid du Colombier 	   if (code != curstblsize) error(FATAL, "code out of order");
406*219b2ee8SDavid du Colombier 	   prefix[curstblsize] = oldcode;
407*219b2ee8SDavid du Colombier 	   suffix[curstblsize] = firstof(oldcode);
408*219b2ee8SDavid du Colombier 	   curstblsize++;
409*219b2ee8SDavid du Colombier 	   putcode(curstblsize-1);
410*219b2ee8SDavid du Colombier 	   oldcode = code;
411*219b2ee8SDavid du Colombier 	}
412*219b2ee8SDavid du Colombier     }
413*219b2ee8SDavid du Colombier dbprt(stderr, "finish reading raster data\n");
414*219b2ee8SDavid du Colombier 
415*219b2ee8SDavid du Colombier     /* read the rest of the raster data */
416*219b2ee8SDavid du Colombier     do {
417*219b2ee8SDavid du Colombier     	fread(ibuf, sizeof(*ibuf), 1, fp_in);
418*219b2ee8SDavid du Colombier     	bytecount = ibuf[0];
419*219b2ee8SDavid du Colombier dbprt(stderr, "byte count: %d\n", bytecount);
420*219b2ee8SDavid du Colombier 	if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
421*219b2ee8SDavid du Colombier 	else zerobytecount = 1;
422*219b2ee8SDavid du Colombier     } while (!zerobytecount);
423*219b2ee8SDavid du Colombier 
424*219b2ee8SDavid du Colombier     writeimage();
425*219b2ee8SDavid du Colombier 
426*219b2ee8SDavid du Colombier     if (lcolormap) {
427*219b2ee8SDavid du Colombier 	cmap = gcmap;
428*219b2ee8SDavid du Colombier 	gmap = ggmap;
429*219b2ee8SDavid du Colombier 	maplength = gmaplength;
430*219b2ee8SDavid du Colombier 	free(lcmap);
431*219b2ee8SDavid du Colombier 	free(lgmap);
432*219b2ee8SDavid du Colombier     }
433*219b2ee8SDavid du Colombier }
434*219b2ee8SDavid du Colombier 
435*219b2ee8SDavid du Colombier void
readextensionblock()436*219b2ee8SDavid du Colombier readextensionblock()
437*219b2ee8SDavid du Colombier {
438*219b2ee8SDavid du Colombier     int functioncode, bytecount, zerobytecount = 0;
439*219b2ee8SDavid du Colombier 
440*219b2ee8SDavid du Colombier     fread(ibuf, sizeof(*ibuf), 1, fp_in);
441*219b2ee8SDavid du Colombier     functioncode = ibuf[0];
442*219b2ee8SDavid du Colombier dbprt(stderr, "function code: %d\n", functioncode);
443*219b2ee8SDavid du Colombier     do {
444*219b2ee8SDavid du Colombier     	fread(ibuf, sizeof(*ibuf), 1, fp_in);
445*219b2ee8SDavid du Colombier     	bytecount = ibuf[0];
446*219b2ee8SDavid du Colombier dbprt(stderr, "byte count: %d\n", bytecount);
447*219b2ee8SDavid du Colombier 	if (bytecount) fread(ibuf, sizeof(*ibuf), bytecount, fp_in);
448*219b2ee8SDavid du Colombier 	else zerobytecount = 1;
449*219b2ee8SDavid du Colombier     } while (!zerobytecount);
450*219b2ee8SDavid du Colombier }
451*219b2ee8SDavid du Colombier 
452*219b2ee8SDavid du Colombier void
writebgscr()453*219b2ee8SDavid du Colombier writebgscr()
454*219b2ee8SDavid du Colombier {
455*219b2ee8SDavid du Colombier     fprintf(fp_out, "%s %d %d\n", PAGE, page, printed+1);
456*219b2ee8SDavid du Colombier     fputs("/saveobj save def\n", fp_out);
457*219b2ee8SDavid du Colombier     fprintf(fp_out, "%s: %d %d %d %d\n",
458*219b2ee8SDavid du Colombier 	"%%PageBoundingBox", 0, 0, scrwidth, scrheight);
459*219b2ee8SDavid du Colombier     if (scrwidth > bburx) bburx = scrwidth;
460*219b2ee8SDavid du Colombier     if (scrheight > bbury) bbury = scrheight;
461*219b2ee8SDavid du Colombier     fprintf(fp_out, "%d %d gifscreen\n", scrwidth, scrheight);
462*219b2ee8SDavid du Colombier }
463*219b2ee8SDavid du Colombier 
464*219b2ee8SDavid du Colombier void
writeendscr()465*219b2ee8SDavid du Colombier writeendscr()
466*219b2ee8SDavid du Colombier {
467*219b2ee8SDavid du Colombier     if ( fp_out == stdout ) printed++;
468*219b2ee8SDavid du Colombier     fputs("showpage\n", fp_out);
469*219b2ee8SDavid du Colombier     fputs("saveobj restore\n", fp_out);
470*219b2ee8SDavid du Colombier     fprintf(fp_out, "%s %d %d\n", ENDPAGE, page, printed);
471*219b2ee8SDavid du Colombier }
472*219b2ee8SDavid du Colombier 
473*219b2ee8SDavid du Colombier void
redirect(pg)474*219b2ee8SDavid du Colombier redirect(pg)
475*219b2ee8SDavid du Colombier     int		pg;			/* next page we're printing */
476*219b2ee8SDavid du Colombier {
477*219b2ee8SDavid du Colombier     static FILE	*fp_null = NULL;	/* if output is turned off */
478*219b2ee8SDavid du Colombier 
479*219b2ee8SDavid du Colombier     if ( pg >= 0 && in_olist(pg) == ON )
480*219b2ee8SDavid du Colombier 	fp_out = stdout;
481*219b2ee8SDavid du Colombier     else if ( (fp_out = fp_null) == NULL )
482*219b2ee8SDavid du Colombier 	fp_out = fp_null = fopen("/dev/null", "w");
483*219b2ee8SDavid du Colombier 
484*219b2ee8SDavid du Colombier }
485*219b2ee8SDavid du Colombier 
486*219b2ee8SDavid du Colombier void
readgif()487*219b2ee8SDavid du Colombier readgif()
488*219b2ee8SDavid du Colombier {
489*219b2ee8SDavid du Colombier     int i, j, k;
490*219b2ee8SDavid du Colombier 
491*219b2ee8SDavid du Colombier     for (i = 0, j = 1, k = 0; i < 13; i++) {
492*219b2ee8SDavid du Colombier 	for (; k < j; k++) cstbl[k] = i;
493*219b2ee8SDavid du Colombier 	j *= 2;
494*219b2ee8SDavid du Colombier     }
495*219b2ee8SDavid du Colombier 
496*219b2ee8SDavid du Colombier     fread(ibuf, sizeof(*ibuf), 6, fp_in);
497*219b2ee8SDavid du Colombier dbprt(stderr, "%.6s\n", ibuf);
498*219b2ee8SDavid du Colombier     if (strncmp((char *)ibuf, "GIF87a", 6) != 0) {
499*219b2ee8SDavid du Colombier     	fread(ibuf, sizeof(*ibuf), 122, fp_in);
500*219b2ee8SDavid du Colombier     	fread(ibuf, sizeof(*ibuf), 6, fp_in);
501*219b2ee8SDavid du Colombier dbprt(stderr, "%.6s\n", ibuf);
502*219b2ee8SDavid du Colombier     	if (strncmp((char *)ibuf, "GIF87a", 6) != 0)
503*219b2ee8SDavid du Colombier 		 error(FATAL, "wrong GIF signature");
504*219b2ee8SDavid du Colombier     }
505*219b2ee8SDavid du Colombier     fread(ibuf, sizeof(*ibuf), 7, fp_in);
506*219b2ee8SDavid du Colombier     scrwidth = ibuf[0] + 256*ibuf[1];
507*219b2ee8SDavid du Colombier     scrheight = ibuf[2] + 256*ibuf[3];
508*219b2ee8SDavid du Colombier     gcolormap = ibuf[4] & 0200;
509*219b2ee8SDavid du Colombier     bitperpixel = (ibuf[4] & 07) + 1;
510*219b2ee8SDavid du Colombier     background = ibuf[5];
511*219b2ee8SDavid du Colombier dbprt(stderr, "scrwidth: %d\n", scrwidth);
512*219b2ee8SDavid du Colombier dbprt(stderr, "scrheight: %d\n", scrheight);
513*219b2ee8SDavid du Colombier dbprt(stderr, "gcolormap: %d\n", gcolormap ? 1 : 0);
514*219b2ee8SDavid du Colombier dbprt(stderr, "bitperpixel: %d\n", bitperpixel);
515*219b2ee8SDavid du Colombier dbprt(stderr, "background: %d\n", background);
516*219b2ee8SDavid du Colombier     if (ibuf[6] != 0) error(FATAL, "wrong screen descriptor");
517*219b2ee8SDavid du Colombier     if (gcolormap) readgcolormap(bitperpixel);
518*219b2ee8SDavid du Colombier     else setcolormap(bitperpixel);
519*219b2ee8SDavid du Colombier 
520*219b2ee8SDavid du Colombier     redirect(++page);
521*219b2ee8SDavid du Colombier     writebgscr();
522*219b2ee8SDavid du Colombier 
523*219b2ee8SDavid du Colombier     cmap = gcmap;
524*219b2ee8SDavid du Colombier     gmap = ggmap;
525*219b2ee8SDavid du Colombier     maplength = gmaplength;
526*219b2ee8SDavid du Colombier 
527*219b2ee8SDavid du Colombier     do {
528*219b2ee8SDavid du Colombier 	fread(ibuf, sizeof(*ibuf), 1, fp_in);
529*219b2ee8SDavid du Colombier 	if (ibuf[0] == ',') readimage();
530*219b2ee8SDavid du Colombier 	else if (ibuf[0] == ';') terminate = 1;
531*219b2ee8SDavid du Colombier 	else if (ibuf[0] == '!') readextensionblock();
532*219b2ee8SDavid du Colombier 	else
533*219b2ee8SDavid du Colombier 	error(FATAL, "wrong image separator character or wrong GIF terminator");
534*219b2ee8SDavid du Colombier     } while (!terminate);
535*219b2ee8SDavid du Colombier 
536*219b2ee8SDavid du Colombier     writeendscr();
537*219b2ee8SDavid du Colombier 
538*219b2ee8SDavid du Colombier     free(gcmap);
539*219b2ee8SDavid du Colombier     free(ggmap);
540*219b2ee8SDavid du Colombier }
541*219b2ee8SDavid du Colombier 
542*219b2ee8SDavid du Colombier void
init_signals()543*219b2ee8SDavid du Colombier init_signals()
544*219b2ee8SDavid du Colombier {
545*219b2ee8SDavid du Colombier 
546*219b2ee8SDavid du Colombier     if ( signal(SIGINT, interrupt) == SIG_IGN )  {
547*219b2ee8SDavid du Colombier         signal(SIGINT, SIG_IGN);
548*219b2ee8SDavid du Colombier         signal(SIGQUIT, SIG_IGN);
549*219b2ee8SDavid du Colombier         signal(SIGHUP, SIG_IGN);
550*219b2ee8SDavid du Colombier     }
551*219b2ee8SDavid du Colombier     else {
552*219b2ee8SDavid du Colombier         signal(SIGHUP, interrupt);
553*219b2ee8SDavid du Colombier         signal(SIGQUIT, interrupt);
554*219b2ee8SDavid du Colombier     }
555*219b2ee8SDavid du Colombier 
556*219b2ee8SDavid du Colombier     signal(SIGTERM, interrupt);
557*219b2ee8SDavid du Colombier }
558*219b2ee8SDavid du Colombier 
559*219b2ee8SDavid du Colombier void
header()560*219b2ee8SDavid du Colombier header()
561*219b2ee8SDavid du Colombier {
562*219b2ee8SDavid du Colombier     int         ch;                     /* return value from getopt() */
563*219b2ee8SDavid du Colombier     int         old_optind = optind;    /* for restoring optind - should be 1 */
564*219b2ee8SDavid du Colombier 
565*219b2ee8SDavid du Colombier     while ( (ch = getopt(argc, argv, optnames)) != EOF )
566*219b2ee8SDavid du Colombier         if ( ch == 'L' )
567*219b2ee8SDavid du Colombier             prologue = optarg;
568*219b2ee8SDavid du Colombier         else if ( ch == '?' )
569*219b2ee8SDavid du Colombier             error(FATAL, "");
570*219b2ee8SDavid du Colombier 
571*219b2ee8SDavid du Colombier     optind = old_optind;                /* get ready for option scanning */
572*219b2ee8SDavid du Colombier 
573*219b2ee8SDavid du Colombier     fprintf(stdout, "%s", CONFORMING);
574*219b2ee8SDavid du Colombier     fprintf(stdout, "%s %s\n", VERSION, PROGRAMVERSION);
575*219b2ee8SDavid du Colombier     fprintf(stdout, "%s %s\n", BOUNDINGBOX, ATEND);
576*219b2ee8SDavid du Colombier     fprintf(stdout, "%s %s\n", PAGES, ATEND);
577*219b2ee8SDavid du Colombier     fprintf(stdout, "%s", ENDCOMMENTS);
578*219b2ee8SDavid du Colombier 
579*219b2ee8SDavid du Colombier     if ( cat(prologue) == FALSE )
580*219b2ee8SDavid du Colombier         error(FATAL, "can't read %s", prologue);
581*219b2ee8SDavid du Colombier 
582*219b2ee8SDavid du Colombier     fprintf(stdout, "%s", ENDPROLOG);
583*219b2ee8SDavid du Colombier     fprintf(stdout, "%s", BEGINSETUP);
584*219b2ee8SDavid du Colombier     fprintf(stdout, "mark\n");
585*219b2ee8SDavid du Colombier 
586*219b2ee8SDavid du Colombier }
587*219b2ee8SDavid du Colombier 
588*219b2ee8SDavid du Colombier void
options()589*219b2ee8SDavid du Colombier options()
590*219b2ee8SDavid du Colombier {
591*219b2ee8SDavid du Colombier     int		ch;			/* return value from getopt() */
592*219b2ee8SDavid du Colombier 
593*219b2ee8SDavid du Colombier     while ( (ch = getopt(argc, argv, optnames)) != EOF )  {
594*219b2ee8SDavid du Colombier 	switch ( ch )  {
595*219b2ee8SDavid du Colombier 
596*219b2ee8SDavid du Colombier 	    case 'a':			/* aspect ratio */
597*219b2ee8SDavid du Colombier 		    fprintf(stdout, "/aspectratio %s def\n", optarg);
598*219b2ee8SDavid du Colombier 		    break;
599*219b2ee8SDavid du Colombier 
600*219b2ee8SDavid du Colombier 	    case 'c':			/* copies */
601*219b2ee8SDavid du Colombier 		    copies = atoi(optarg);
602*219b2ee8SDavid du Colombier 		    fprintf(stdout, "/#copies %s store\n", optarg);
603*219b2ee8SDavid du Colombier 		    break;
604*219b2ee8SDavid du Colombier 
605*219b2ee8SDavid du Colombier 	    case 'f':
606*219b2ee8SDavid du Colombier 		    negative = TRUE;
607*219b2ee8SDavid du Colombier 		    break;
608*219b2ee8SDavid du Colombier 
609*219b2ee8SDavid du Colombier 	    case 'g':
610*219b2ee8SDavid du Colombier 		    gray = TRUE;
611*219b2ee8SDavid du Colombier 		    break;
612*219b2ee8SDavid du Colombier 
613*219b2ee8SDavid du Colombier 	    case 'l':
614*219b2ee8SDavid du Colombier 		    fprintf(stdout, "/alignment true def\n");
615*219b2ee8SDavid du Colombier 		    break;
616*219b2ee8SDavid du Colombier 
617*219b2ee8SDavid du Colombier 	    case 'm':			/* magnification */
618*219b2ee8SDavid du Colombier 		    fprintf(stdout, "/magnification %s def\n", optarg);
619*219b2ee8SDavid du Colombier 		    break;
620*219b2ee8SDavid du Colombier 
621*219b2ee8SDavid du Colombier 	    case 'n':			/* forms per page */
622*219b2ee8SDavid du Colombier 		    formsperpage = atoi(optarg);
623*219b2ee8SDavid du Colombier 		    fprintf(stdout, "%s %s\n", FORMSPERPAGE, optarg);
624*219b2ee8SDavid du Colombier 		    fprintf(stdout, "/formsperpage %s def\n", optarg);
625*219b2ee8SDavid du Colombier 		    break;
626*219b2ee8SDavid du Colombier 
627*219b2ee8SDavid du Colombier 	    case 'o':			/* output page list */
628*219b2ee8SDavid du Colombier 		    out_list(optarg);
629*219b2ee8SDavid du Colombier 		    break;
630*219b2ee8SDavid du Colombier 
631*219b2ee8SDavid du Colombier 	    case 'p':			/* landscape or portrait mode */
632*219b2ee8SDavid du Colombier 		    if ( *optarg == 'l' )
633*219b2ee8SDavid du Colombier 			fprintf(stdout, "/landscape true def\n");
634*219b2ee8SDavid du Colombier 		    else fprintf(stdout, "/landscape false def\n");
635*219b2ee8SDavid du Colombier 		    break;
636*219b2ee8SDavid du Colombier 
637*219b2ee8SDavid du Colombier 	    case 'x':			/* shift things horizontally */
638*219b2ee8SDavid du Colombier 		    fprintf(stdout, "/xoffset %s def\n", optarg);
639*219b2ee8SDavid du Colombier 		    break;
640*219b2ee8SDavid du Colombier 
641*219b2ee8SDavid du Colombier 	    case 'y':			/* and vertically on the page */
642*219b2ee8SDavid du Colombier 		    fprintf(stdout, "/yoffset %s def\n", optarg);
643*219b2ee8SDavid du Colombier 		    break;
644*219b2ee8SDavid du Colombier 
645*219b2ee8SDavid du Colombier 	    case 'C':			/* copy file straight to output */
646*219b2ee8SDavid du Colombier 		    if ( cat(optarg) == FALSE )
647*219b2ee8SDavid du Colombier 			error(FATAL, "can't read %s", optarg);
648*219b2ee8SDavid du Colombier 		    break;
649*219b2ee8SDavid du Colombier 
650*219b2ee8SDavid du Colombier 	    case 'E':			/* text font encoding - unnecessary */
651*219b2ee8SDavid du Colombier 		    fontencoding = optarg;
652*219b2ee8SDavid du Colombier 		    break;
653*219b2ee8SDavid du Colombier 
654*219b2ee8SDavid du Colombier 	    case 'D':			/* debug flag */
655*219b2ee8SDavid du Colombier 		    debug = ON;
656*219b2ee8SDavid du Colombier 		    break;
657*219b2ee8SDavid du Colombier 
658*219b2ee8SDavid du Colombier 	    case 'G':
659*219b2ee8SDavid du Colombier 		    gammaflag = ON;
660*219b2ee8SDavid du Colombier 		    gamma = atof(optarg);
661*219b2ee8SDavid du Colombier 		    break;
662*219b2ee8SDavid du Colombier 
663*219b2ee8SDavid du Colombier 	    case 'I':			/* ignore FATAL errors */
664*219b2ee8SDavid du Colombier 		    ignore = ON;
665*219b2ee8SDavid du Colombier 		    break;
666*219b2ee8SDavid du Colombier 
667*219b2ee8SDavid du Colombier 	    case 'L':			/* PostScript prologue file */
668*219b2ee8SDavid du Colombier 		    prologue = optarg;
669*219b2ee8SDavid du Colombier 		    break;
670*219b2ee8SDavid du Colombier 
671*219b2ee8SDavid du Colombier 	    case 'P':			/* PostScript pass through */
672*219b2ee8SDavid du Colombier 		    fprintf(stdout, "%s\n", optarg);
673*219b2ee8SDavid du Colombier 		    break;
674*219b2ee8SDavid du Colombier 
675*219b2ee8SDavid du Colombier 	    case '?':			/* don't understand the option */
676*219b2ee8SDavid du Colombier 		    error(FATAL, "");
677*219b2ee8SDavid du Colombier 		    break;
678*219b2ee8SDavid du Colombier 
679*219b2ee8SDavid du Colombier 	    default:			/* don't know what to do for ch */
680*219b2ee8SDavid du Colombier 		    error(FATAL, "missing case for option %c\n", ch);
681*219b2ee8SDavid du Colombier 		    break;
682*219b2ee8SDavid du Colombier 
683*219b2ee8SDavid du Colombier 	}
684*219b2ee8SDavid du Colombier     }
685*219b2ee8SDavid du Colombier 
686*219b2ee8SDavid du Colombier     argc -= optind;			/* get ready for non-option args */
687*219b2ee8SDavid du Colombier     argv += optind;
688*219b2ee8SDavid du Colombier }
689*219b2ee8SDavid du Colombier 
690*219b2ee8SDavid du Colombier void
setup()691*219b2ee8SDavid du Colombier setup()
692*219b2ee8SDavid du Colombier {
693*219b2ee8SDavid du Colombier     /*setencoding(fontencoding);*/
694*219b2ee8SDavid du Colombier     fprintf(stdout, "setup\n");
695*219b2ee8SDavid du Colombier 
696*219b2ee8SDavid du Colombier     if ( formsperpage > 1 )  {          /* followed by stuff for multiple pages
697*219b2ee8SDavid du Colombier */
698*219b2ee8SDavid du Colombier         if ( cat(formfile) == FALSE )
699*219b2ee8SDavid du Colombier             error(FATAL, "can't read %s", formfile);
700*219b2ee8SDavid du Colombier         fprintf(stdout, "%d setupforms\n", formsperpage);
701*219b2ee8SDavid du Colombier     }   /* End if */
702*219b2ee8SDavid du Colombier 
703*219b2ee8SDavid du Colombier     fprintf(stdout, "%s", ENDSETUP);
704*219b2ee8SDavid du Colombier 
705*219b2ee8SDavid du Colombier }
706*219b2ee8SDavid du Colombier 
707*219b2ee8SDavid du Colombier void
arguments()708*219b2ee8SDavid du Colombier arguments()
709*219b2ee8SDavid du Colombier {
710*219b2ee8SDavid du Colombier     if ( argc < 1 ) {
711*219b2ee8SDavid du Colombier 	fp_in = stdin;
712*219b2ee8SDavid du Colombier 	readgif();
713*219b2ee8SDavid du Colombier     }
714*219b2ee8SDavid du Colombier     else  {				/* at least one argument is left */
715*219b2ee8SDavid du Colombier 	while ( argc > 0 )  {
716*219b2ee8SDavid du Colombier 	    if ( strcmp(*argv, "-") == 0 )
717*219b2ee8SDavid du Colombier 		fp_in = stdin;
718*219b2ee8SDavid du Colombier 	    else if ( (fp_in = fopen(*argv, "r")) == NULL )
719*219b2ee8SDavid du Colombier 		error(FATAL, "can't open %s", *argv);
720*219b2ee8SDavid du Colombier 	    readgif();
721*219b2ee8SDavid du Colombier 	    if ( fp_in != stdin )
722*219b2ee8SDavid du Colombier 		fclose(fp_in);
723*219b2ee8SDavid du Colombier 	    argc--;
724*219b2ee8SDavid du Colombier 	    argv++;
725*219b2ee8SDavid du Colombier 	}
726*219b2ee8SDavid du Colombier     }
727*219b2ee8SDavid du Colombier }
728*219b2ee8SDavid du Colombier 
729*219b2ee8SDavid du Colombier void
done()730*219b2ee8SDavid du Colombier done()
731*219b2ee8SDavid du Colombier {
732*219b2ee8SDavid du Colombier     fprintf(stdout, "%s", TRAILER);
733*219b2ee8SDavid du Colombier     fprintf(stdout, "done\n");
734*219b2ee8SDavid du Colombier     fprintf(stdout, "%s 0 0 %d %d\n", BOUNDINGBOX, bburx, bbury);
735*219b2ee8SDavid du Colombier     fprintf(stdout, "%s %d\n", PAGES, printed);
736*219b2ee8SDavid du Colombier }
737*219b2ee8SDavid du Colombier 
main(agc,agv)738*219b2ee8SDavid du Colombier main(agc, agv)
739*219b2ee8SDavid du Colombier     int agc;
740*219b2ee8SDavid du Colombier     char *agv[];
741*219b2ee8SDavid du Colombier {
742*219b2ee8SDavid du Colombier     argc = agc;
743*219b2ee8SDavid du Colombier     argv = agv;
744*219b2ee8SDavid du Colombier     prog_name = argv[0];
745*219b2ee8SDavid du Colombier 
746*219b2ee8SDavid du Colombier     init_signals();
747*219b2ee8SDavid du Colombier     header();
748*219b2ee8SDavid du Colombier     options();
749*219b2ee8SDavid du Colombier     setup();
750*219b2ee8SDavid du Colombier     arguments();
751*219b2ee8SDavid du Colombier     done();
752*219b2ee8SDavid du Colombier 
753*219b2ee8SDavid du Colombier     exit(0);
754*219b2ee8SDavid du Colombier }
755*219b2ee8SDavid du Colombier 
756