1*e043683cSjaap #ifndef lint
2*e043683cSjaap static char *sccsid = "idfilt.c	(CWI)	1.1	85/03/01";
3*e043683cSjaap #endif
4*e043683cSjaap #include "idfilt.h"
5*e043683cSjaap 
6*e043683cSjaap FILE *infile;
7*e043683cSjaap char *filename;
8*e043683cSjaap int lineno = 0;
9*e043683cSjaap 
10*e043683cSjaap float maxx, maxy;
11*e043683cSjaap float minx, miny;
12*e043683cSjaap float width = 4.0;
13*e043683cSjaap float colwid = 6.0;
14*e043683cSjaap 
15*e043683cSjaap boolean maxxset, maxyset;
16*e043683cSjaap boolean minxset, minyset;
17*e043683cSjaap boolean widset, colset;
18*e043683cSjaap boolean boundset;
19*e043683cSjaap 
20*e043683cSjaap boolean veryfirst = TRUE;
21*e043683cSjaap 
22*e043683cSjaap boolean wantquality = FALSE;
23*e043683cSjaap 
main(argc,argv)24*e043683cSjaap main (argc, argv)
25*e043683cSjaap int argc;
26*e043683cSjaap char *argv[];
27*e043683cSjaap {
28*e043683cSjaap 	while (argc > 1 && argv[1][0] == '-') {
29*e043683cSjaap 		switch (argv[1][1]) {
30*e043683cSjaap 		case 'q':
31*e043683cSjaap 			wantquality = TRUE;
32*e043683cSjaap 			break;
33*e043683cSjaap 		default:
34*e043683cSjaap 			fprintf (stderr, "ideal filter: unknown flag %c\n", argv[1][1]);
35*e043683cSjaap 			break;
36*e043683cSjaap 		}
37*e043683cSjaap 		argc--;
38*e043683cSjaap 		argv++;
39*e043683cSjaap 	}
40*e043683cSjaap 	if (argc < 2) {
41*e043683cSjaap 		infile = stdin;
42*e043683cSjaap 		lineno = 0;
43*e043683cSjaap 		interpret (infile);
44*e043683cSjaap 	} else {
45*e043683cSjaap 		while (argc-- > 1) {
46*e043683cSjaap 			if (!(infile = fopen (*++argv, "r"))) {
47*e043683cSjaap 				fprintf (stderr, "ideal filter: can't open %s\n", *argv);
48*e043683cSjaap 				exit (1);
49*e043683cSjaap 			}
50*e043683cSjaap 			filename = *argv;
51*e043683cSjaap 			lineno = 0;
52*e043683cSjaap 			interpret (infile);
53*e043683cSjaap 			fclose (infile);
54*e043683cSjaap 		}
55*e043683cSjaap 	}
56*e043683cSjaap 	exit (0);
57*e043683cSjaap }
58*e043683cSjaap 
interpret(infile)59*e043683cSjaap interpret (infile)
60*e043683cSjaap register FILE *infile;
61*e043683cSjaap {
62*e043683cSjaap 	char buf[250];
63*e043683cSjaap 
64*e043683cSjaap 	int numitems;
65*e043683cSjaap 	char cmd[10];
66*e043683cSjaap 	int i[10];
67*e043683cSjaap 	float f[30];
68*e043683cSjaap 	char *string;
69*e043683cSjaap 
70*e043683cSjaap 
71*e043683cSjaap 	while (fgets (buf, sizeof buf, infile)) {
72*e043683cSjaap 		lineno++;
73*e043683cSjaap 		idjusttext (buf);
74*e043683cSjaap 		if (buf[0] == '.') {
75*e043683cSjaap 			if (buf[1] == 'I') {
76*e043683cSjaap 				switch (buf[2]) {
77*e043683cSjaap 				case 'S':
78*e043683cSjaap 					numitems = sscanf (buf, "%s %d %d %d %d %d %d",
79*e043683cSjaap 						cmd, &i[0], &i[1], &i[2], &i[3], &i[4], &i[5]
80*e043683cSjaap 					);
81*e043683cSjaap 					idstart (numitems, i);
82*e043683cSjaap 					maxxset = minxset = FALSE;
83*e043683cSjaap 					maxyset = minyset = FALSE;
84*e043683cSjaap 					colset = boundset = widset = FALSE;
85*e043683cSjaap 					break;
86*e043683cSjaap 				case 'E':
87*e043683cSjaap 					idendE ();
88*e043683cSjaap 					break;
89*e043683cSjaap 				case 'F':
90*e043683cSjaap 					idendF ();
91*e043683cSjaap 					break;
92*e043683cSjaap 				default:
93*e043683cSjaap 					break;
94*e043683cSjaap 				}
95*e043683cSjaap 			} else if (buf[1] == '.' && buf[2] == '.') {
96*e043683cSjaap 				sscanf (buf, "%s", cmd);
97*e043683cSjaap 				if (!boundset) {
98*e043683cSjaap 					if (strcmp (cmd, "...maxx") == 0) {
99*e043683cSjaap 						sscanf (buf, "%s %f",
100*e043683cSjaap 							cmd, &f[0]
101*e043683cSjaap 						);
102*e043683cSjaap 						idmaxx (f[0]);
103*e043683cSjaap 					} else if (strcmp (cmd, "...maxy") == 0) {
104*e043683cSjaap 						sscanf (buf, "%s %f",
105*e043683cSjaap 							cmd, &f[0]
106*e043683cSjaap 						);
107*e043683cSjaap 						idmaxy (f[0]);
108*e043683cSjaap 					} else if (strcmp (cmd, "...minx") == 0) {
109*e043683cSjaap 						sscanf (buf, "%s %f",
110*e043683cSjaap 							cmd, &f[0]
111*e043683cSjaap 						);
112*e043683cSjaap 						idminx (f[0]);
113*e043683cSjaap 					} else if (strcmp (cmd, "...miny") == 0) {
114*e043683cSjaap 						sscanf (buf, "%s %f",
115*e043683cSjaap 							cmd, &f[0]
116*e043683cSjaap 						);
117*e043683cSjaap 						idminy (f[0]);
118*e043683cSjaap 					} else if (strcmp (cmd, "...width") == 0) {
119*e043683cSjaap 						sscanf (buf, "%s %f",
120*e043683cSjaap 							cmd, &f[0]
121*e043683cSjaap 						);
122*e043683cSjaap 						idwidth (f[0]);
123*e043683cSjaap 					} else if (strcmp (cmd, "...colwid") == 0) {
124*e043683cSjaap 						sscanf (buf, "%s %f",
125*e043683cSjaap 							cmd, &f[0]
126*e043683cSjaap 						);
127*e043683cSjaap 						idcolwid (f[0]);
128*e043683cSjaap 					} else if (strcmp (cmd, "...obbox") == 0) {
129*e043683cSjaap 						if (!veryfirst) {
130*e043683cSjaap 							maxxset = maxyset = TRUE;
131*e043683cSjaap 							minxset = minyset = TRUE;
132*e043683cSjaap 							boundset = TRUE;
133*e043683cSjaap 						}
134*e043683cSjaap 					} else if (strcmp (cmd, "...noerase") == 0) {
135*e043683cSjaap 						idnoerase ();
136*e043683cSjaap 					} else if (strcmp (cmd, "...yeserase") == 0) {
137*e043683cSjaap 						idyeserase ();
138*e043683cSjaap 					} else {
139*e043683cSjaap 						idendbound ();
140*e043683cSjaap 						veryfirst = FALSE;
141*e043683cSjaap 					}
142*e043683cSjaap 				}
143*e043683cSjaap 				if (boundset) {
144*e043683cSjaap 					if (strcmp (cmd, "...line") == 0) {
145*e043683cSjaap 						sscanf (buf, "%s %f %f %f %f",
146*e043683cSjaap 							cmd, &f[0], &f[1], &f[2], &f[3]
147*e043683cSjaap 						);
148*e043683cSjaap 						idline (f[0], f[1], f[2], f[3]);
149*e043683cSjaap 					} else if (strcmp (cmd, "...circle") == 0) {
150*e043683cSjaap 						sscanf (buf, "%s %f %f %f",
151*e043683cSjaap 							cmd, &f[0], &f[1], &f[2]
152*e043683cSjaap 						);
153*e043683cSjaap 						idcircle (f[0], f[1], f[2]);
154*e043683cSjaap 					} else if (strcmp (cmd, "...arc") == 0) {
155*e043683cSjaap 						sscanf (buf, "%s %f %f %f %f %f %f %f %f %f",
156*e043683cSjaap 							cmd, &f[0], &f[1], &f[2], &f[3], &f[4], &f[5], &f[6], &f[7], &f[8]
157*e043683cSjaap 						);
158*e043683cSjaap 						idarc (f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7], f[8]);
159*e043683cSjaap 					} else if (strcmp (cmd, "...left") == 0) {
160*e043683cSjaap 						sscanf (buf, "%s %f %f",
161*e043683cSjaap 							cmd, &f[0], &f[1]
162*e043683cSjaap 						);
163*e043683cSjaap 						buf[strlen(buf)-1] = '\0';
164*e043683cSjaap 						string = buf;
165*e043683cSjaap 						while (*string != '\'')
166*e043683cSjaap 							string ++;
167*e043683cSjaap 						idleft (f[0], f[1], string);
168*e043683cSjaap 					} else if (strcmp (cmd, "...center") == 0) {
169*e043683cSjaap 						sscanf (buf, "%s %f %f",
170*e043683cSjaap 							cmd, &f[0], &f[1]
171*e043683cSjaap 						);
172*e043683cSjaap 						buf[strlen(buf)-1] = '\0';
173*e043683cSjaap 						string = buf;
174*e043683cSjaap 						while (*string != '\'')
175*e043683cSjaap 							string ++;
176*e043683cSjaap 						idcenter (f[0], f[1], string);
177*e043683cSjaap 					} else if (strcmp (cmd, "...right") == 0) {
178*e043683cSjaap 						sscanf (buf, "%s %f %f",
179*e043683cSjaap 							cmd, &f[0], &f[1]
180*e043683cSjaap 						);
181*e043683cSjaap 						buf[strlen(buf)-1] = '\0';
182*e043683cSjaap 						string = buf;
183*e043683cSjaap 						while (*string != '\'')
184*e043683cSjaap 							string ++;
185*e043683cSjaap 						idright (f[0], f[1], string);
186*e043683cSjaap 					} else if (strcmp (cmd, "...spline") == 0) {
187*e043683cSjaap 						sscanf (buf, "%s %f %f",
188*e043683cSjaap 							cmd, &f[0], &f[1]
189*e043683cSjaap 						);
190*e043683cSjaap 						idspline (f[0], f[1]);
191*e043683cSjaap 					} else if (strcmp (cmd, "...knot") == 0) {
192*e043683cSjaap 						sscanf (buf, "%s %f %f",
193*e043683cSjaap 							cmd, &f[0], &f[1]
194*e043683cSjaap 						);
195*e043683cSjaap 						idknot (f[0], f[1]);
196*e043683cSjaap 					} else if (strcmp (cmd, "...endspline") == 0) {
197*e043683cSjaap 						idendspline ();
198*e043683cSjaap 					}
199*e043683cSjaap 				}
200*e043683cSjaap 			}
201*e043683cSjaap 		}
202*e043683cSjaap 	}
203*e043683cSjaap }
204*e043683cSjaap 
idmaxx(x)205*e043683cSjaap void idmaxx (x)
206*e043683cSjaap float x;
207*e043683cSjaap {
208*e043683cSjaap 	if (!maxxset) {
209*e043683cSjaap 		maxx = x;
210*e043683cSjaap 		maxxset = TRUE;
211*e043683cSjaap 	}
212*e043683cSjaap }
213*e043683cSjaap 
idmaxy(y)214*e043683cSjaap void idmaxy (y)
215*e043683cSjaap float y;
216*e043683cSjaap {
217*e043683cSjaap 	if (!maxyset) {
218*e043683cSjaap 		maxy = y;
219*e043683cSjaap 		maxyset = TRUE;
220*e043683cSjaap 	}
221*e043683cSjaap }
222*e043683cSjaap 
idminx(x)223*e043683cSjaap void idminx (x)
224*e043683cSjaap float x;
225*e043683cSjaap {
226*e043683cSjaap 	if (!minxset) {
227*e043683cSjaap 		minx = x;
228*e043683cSjaap 		minxset = TRUE;
229*e043683cSjaap 	}
230*e043683cSjaap }
231*e043683cSjaap 
idminy(y)232*e043683cSjaap void idminy (y)
233*e043683cSjaap float y;
234*e043683cSjaap {
235*e043683cSjaap 	if (!minyset) {
236*e043683cSjaap 		miny = y;
237*e043683cSjaap 		minyset = TRUE;
238*e043683cSjaap 	}
239*e043683cSjaap }
240*e043683cSjaap 
idwidth(wid)241*e043683cSjaap void idwidth (wid)
242*e043683cSjaap float wid;
243*e043683cSjaap {
244*e043683cSjaap 	if (!widset) {
245*e043683cSjaap 		width = wid;
246*e043683cSjaap 		widset = TRUE;
247*e043683cSjaap 	}
248*e043683cSjaap }
249*e043683cSjaap 
idcolwid(wid)250*e043683cSjaap void idcolwid (wid)
251*e043683cSjaap float wid;
252*e043683cSjaap {
253*e043683cSjaap 	if (!colset) {
254*e043683cSjaap 		colwid = wid;
255*e043683cSjaap 		colset = TRUE;
256*e043683cSjaap 	}
257*e043683cSjaap }
258