1*23943Sjaap #ifndef lint
2*23943Sjaap static char sccsid[] = "@(#)driver.c 1.1 (CWI) 85/07/19";
3*23943Sjaap #endif lint
4*23943Sjaap
5*23943Sjaap #include <stdio.h>
6*23943Sjaap #include <ctype.h>
7*23943Sjaap
8*23943Sjaap #define DEV202 1
9*23943Sjaap #define DEVAPS 2
10*23943Sjaap #define DEVCAT 3
11*23943Sjaap #define DEV450 4
12*23943Sjaap #define DEVHAR 6
13*23943Sjaap int devtype = DEVHAR;
14*23943Sjaap
15*23943Sjaap float deltx; /* max x value in output, for scaling */
16*23943Sjaap float delty; /* max y value in output, for scaling */
17*23943Sjaap int dbg = 0;
18*23943Sjaap int res = 1445; /* harris is default */
19*23943Sjaap FILE *fin; /* input file pointer */
20*23943Sjaap char *cmdname;
21*23943Sjaap int crop = 1; /* trim off exterior white space if non-zero */
22*23943Sjaap float hshift = 0.3; /* move this far left for text (in em's) */
23*23943Sjaap float vshift = 0.3; /* this far down */
24*23943Sjaap /* these values are suitable for circuit diagrams */
25*23943Sjaap int linetype = 's'; /* solid is normal */
26*23943Sjaap
27*23943Sjaap char buf[20000];
28*23943Sjaap char *bp = buf;
29*23943Sjaap
30*23943Sjaap int sxmin; /* lower limit from s command */
31*23943Sjaap int symin;
32*23943Sjaap int sxmax = 4096; /* upper */
33*23943Sjaap int symax = 4096;
34*23943Sjaap int xmin = 30000; /* min values found in actual data */
35*23943Sjaap int ymin = 30000;
36*23943Sjaap int xmax = -30000; /* max */
37*23943Sjaap int ymax = -30000;
38*23943Sjaap
main(argc,argv)39*23943Sjaap main(argc,argv)
40*23943Sjaap char **argv;
41*23943Sjaap {
42*23943Sjaap float atof();
43*23943Sjaap int c;
44*23943Sjaap
45*23943Sjaap cmdname = argv[0];
46*23943Sjaap while (argc > 1 && *argv[1] == '-') {
47*23943Sjaap switch (c = argv[1][1]) {
48*23943Sjaap case 'T':
49*23943Sjaap if (strcmp(&argv[1][2], "aps") == 0) {
50*23943Sjaap res = 723;
51*23943Sjaap devtype = DEVAPS;
52*23943Sjaap } else if (strcmp(&argv[1][2], "cat") == 0) {
53*23943Sjaap res = 432;
54*23943Sjaap devtype = DEVCAT;
55*23943Sjaap } else if (strcmp(&argv[1][2], "202") == 0) {
56*23943Sjaap res = 972;
57*23943Sjaap devtype = DEV202;
58*23943Sjaap }
59*23943Sjaap break;
60*23943Sjaap case 'c':
61*23943Sjaap crop = 0;
62*23943Sjaap break;
63*23943Sjaap case 'l':
64*23943Sjaap delty = atof(&argv[1][2]);
65*23943Sjaap break;
66*23943Sjaap case 'w':
67*23943Sjaap case 's': /* set size */
68*23943Sjaap if (argv[1][2] == 0) {
69*23943Sjaap argv++;
70*23943Sjaap argc--;
71*23943Sjaap deltx = atof(&argv[1][0]);
72*23943Sjaap } else
73*23943Sjaap deltx = atof(&argv[1][2]);
74*23943Sjaap if (c == 's')
75*23943Sjaap delty = deltx;
76*23943Sjaap break;
77*23943Sjaap case 'd':
78*23943Sjaap dbg = 1;
79*23943Sjaap break;
80*23943Sjaap }
81*23943Sjaap argc--;
82*23943Sjaap argv++;
83*23943Sjaap }
84*23943Sjaap if (argc <= 1) {
85*23943Sjaap fin = stdin;
86*23943Sjaap getdata();
87*23943Sjaap } else
88*23943Sjaap while (argc-- > 1) {
89*23943Sjaap if ((fin = fopen(*++argv, "r")) == NULL) {
90*23943Sjaap fprintf(stderr, "%s: can't open %s\n", cmdname, *argv);
91*23943Sjaap exit(1);
92*23943Sjaap }
93*23943Sjaap getdata();
94*23943Sjaap fclose(fin);
95*23943Sjaap }
96*23943Sjaap print();
97*23943Sjaap exit(0);
98*23943Sjaap }
99*23943Sjaap
getdata()100*23943Sjaap getdata() /* read the file, collect max, min sizes, etc. */
101*23943Sjaap {
102*23943Sjaap char s[100], s1[20], *p;
103*23943Sjaap int x, y, x1, y1, x2, y2, r, c;
104*23943Sjaap
105*23943Sjaap while ((c = getc(fin)) != EOF) {
106*23943Sjaap switch (c) {
107*23943Sjaap case 'M':
108*23943Sjaap case 'N':
109*23943Sjaap case 'P':
110*23943Sjaap fscanf(fin, "%d %d", &x, &y);
111*23943Sjaap extreme(x, y);
112*23943Sjaap ctobuf(tolower(c));
113*23943Sjaap xytobuf(x, y);
114*23943Sjaap break;
115*23943Sjaap case 'm':
116*23943Sjaap case 'n':
117*23943Sjaap case 'p':
118*23943Sjaap x = getsi(fin);
119*23943Sjaap y = getsi(fin);
120*23943Sjaap extreme(x, y);
121*23943Sjaap ctobuf(c);
122*23943Sjaap xytobuf(x, y);
123*23943Sjaap break;
124*23943Sjaap case 'L':
125*23943Sjaap case 'B':
126*23943Sjaap fscanf(fin, "%d %d %d %d", &x, &y, &x1, &y1);
127*23943Sjaap extreme(x, y);
128*23943Sjaap extreme(x1, y1);
129*23943Sjaap ctobuf(tolower(c));
130*23943Sjaap xytobuf(x, y);
131*23943Sjaap xytobuf(x1, y1);
132*23943Sjaap break;
133*23943Sjaap case 'l':
134*23943Sjaap case 'b':
135*23943Sjaap x = getsi(fin);
136*23943Sjaap y = getsi(fin);
137*23943Sjaap x1 = getsi(fin);
138*23943Sjaap y1 = getsi(fin);
139*23943Sjaap extreme(x, y);
140*23943Sjaap extreme(x1, y1);
141*23943Sjaap ctobuf(c);
142*23943Sjaap xytobuf(x, y);
143*23943Sjaap xytobuf(x1, y1);
144*23943Sjaap break;
145*23943Sjaap case 'S':
146*23943Sjaap fscanf(fin, "%d %d %d %d", &sxmin, &symin, &sxmax, &symax);
147*23943Sjaap break; /* BUG -- ignoring this because it overrides -c */
148*23943Sjaap ctobuf('s');
149*23943Sjaap xytobuf(sxmin, symin);
150*23943Sjaap xytobuf(sxmax, symax);
151*23943Sjaap break;
152*23943Sjaap case 's':
153*23943Sjaap sxmin = getsi(fin);
154*23943Sjaap symin = getsi(fin);
155*23943Sjaap sxmax = getsi(fin);
156*23943Sjaap symax = getsi(fin);
157*23943Sjaap break; /* BUG -- ignoring this because it overrides -c */
158*23943Sjaap ctobuf(c);
159*23943Sjaap xytobuf(sxmin, symin);
160*23943Sjaap xytobuf(sxmax, symax);
161*23943Sjaap break;
162*23943Sjaap case 'T':
163*23943Sjaap case 't':
164*23943Sjaap fgets(s, sizeof s, fin);
165*23943Sjaap for (p = s; *p != '\n'; p++)
166*23943Sjaap ;
167*23943Sjaap *p = 0; /* zap newline */
168*23943Sjaap ctobuf('t');
169*23943Sjaap stobuf(s);
170*23943Sjaap break;
171*23943Sjaap case 'E':
172*23943Sjaap case 'e':
173*23943Sjaap ctobuf('e');
174*23943Sjaap break;
175*23943Sjaap case 'A':
176*23943Sjaap fscanf(fin, "%d %d %d %d %d %d", &x, &y, &x1, &y1, &x2, &y2);
177*23943Sjaap extreme(x, y); /* should use radius */
178*23943Sjaap ctobuf('a');
179*23943Sjaap xytobuf(x, y);
180*23943Sjaap xytobuf(x1, y1);
181*23943Sjaap xytobuf(x2, y2);
182*23943Sjaap break;
183*23943Sjaap case 'a':
184*23943Sjaap x = getsi(fin);
185*23943Sjaap y = getsi(fin);
186*23943Sjaap x1 = getsi(fin);
187*23943Sjaap y1 = getsi(fin);
188*23943Sjaap x2 = getsi(fin);
189*23943Sjaap y2 = getsi(fin);
190*23943Sjaap extreme(x, y); /* should use radius */
191*23943Sjaap ctobuf('a');
192*23943Sjaap xytobuf(x, y);
193*23943Sjaap xytobuf(x1, y1);
194*23943Sjaap xytobuf(x2, y2);
195*23943Sjaap break;
196*23943Sjaap case 'C':
197*23943Sjaap fscanf(fin, "%d %d %d", &x, &y, &r);
198*23943Sjaap extreme(x+r, y+r);
199*23943Sjaap extreme(x-r, y-r);
200*23943Sjaap ctobuf('c');
201*23943Sjaap xytobuf(x, y);
202*23943Sjaap xtobuf(r);
203*23943Sjaap break;
204*23943Sjaap case 'c':
205*23943Sjaap x = getsi(fin);
206*23943Sjaap y = getsi(fin);
207*23943Sjaap r = getsi(fin);
208*23943Sjaap extreme(x+r, y+r);
209*23943Sjaap extreme(x-r, y-r);
210*23943Sjaap ctobuf('c');
211*23943Sjaap xytobuf(x, y);
212*23943Sjaap xtobuf(r);
213*23943Sjaap break;
214*23943Sjaap case 'F':
215*23943Sjaap case 'f':
216*23943Sjaap fgets(s, sizeof s, fin);
217*23943Sjaap ctobuf('f');
218*23943Sjaap sscanf(s, "%s", s1);
219*23943Sjaap if (strcmp(s1, "solid") == 0)
220*23943Sjaap c = 's';
221*23943Sjaap else if (strcmp(s1, "dotted") == 0)
222*23943Sjaap c = '.';
223*23943Sjaap else if (strcmp(s1, "longdashed") == 0)
224*23943Sjaap c = '_';
225*23943Sjaap else if (strcmp(s1, "shortdashed") == 0)
226*23943Sjaap c = '-';
227*23943Sjaap else
228*23943Sjaap c = '!'; /* would you believe dotdashed? */
229*23943Sjaap ctobuf(c);
230*23943Sjaap break;
231*23943Sjaap case 'd':
232*23943Sjaap case 'D':
233*23943Sjaap fgets(s, 100, fin);
234*23943Sjaap /* ignore */
235*23943Sjaap break;
236*23943Sjaap default:
237*23943Sjaap break;
238*23943Sjaap }
239*23943Sjaap if (bp >= buf + sizeof buf) {
240*23943Sjaap fprintf(stderr, "pltroff: input too big to handle\n");
241*23943Sjaap exit(1);
242*23943Sjaap }
243*23943Sjaap }
244*23943Sjaap *bp = 0;
245*23943Sjaap }
246*23943Sjaap
extreme(x,y)247*23943Sjaap extreme(x, y) /* record max and min x and y values */
248*23943Sjaap {
249*23943Sjaap if (x > xmax)
250*23943Sjaap xmax = x;
251*23943Sjaap if (y > ymax)
252*23943Sjaap ymax = y;
253*23943Sjaap if (x < xmin)
254*23943Sjaap xmin = x;
255*23943Sjaap if (y < ymin)
256*23943Sjaap ymin = y;
257*23943Sjaap }
258*23943Sjaap
ctobuf(c)259*23943Sjaap ctobuf(c)
260*23943Sjaap {
261*23943Sjaap *bp++ = c;
262*23943Sjaap }
263*23943Sjaap
stobuf(s)264*23943Sjaap stobuf(s)
265*23943Sjaap char *s;
266*23943Sjaap {
267*23943Sjaap while (*bp++ = *s++)
268*23943Sjaap ;
269*23943Sjaap }
270*23943Sjaap
xytobuf(x,y)271*23943Sjaap xytobuf(x, y)
272*23943Sjaap {
273*23943Sjaap *bp++ = x >> 8;
274*23943Sjaap *bp++ = x & 0377;
275*23943Sjaap *bp++ = y >> 8;
276*23943Sjaap *bp++ = y & 0377;
277*23943Sjaap }
278*23943Sjaap
xtobuf(x)279*23943Sjaap xtobuf(x)
280*23943Sjaap {
281*23943Sjaap *bp++ = x >> 8;
282*23943Sjaap *bp++ = x & 0377;
283*23943Sjaap }
284*23943Sjaap
print()285*23943Sjaap print()
286*23943Sjaap {
287*23943Sjaap char s[100], *p;
288*23943Sjaap int x, y, x1, y1, x2, y2, r, c;
289*23943Sjaap
290*23943Sjaap openpl("\n"); /* outputs .PS\n */
291*23943Sjaap for (bp = buf; *bp; ) {
292*23943Sjaap switch (c = *bp++) {
293*23943Sjaap case 'm':
294*23943Sjaap x = getbuf();
295*23943Sjaap y = getbuf();
296*23943Sjaap move(x, y);
297*23943Sjaap break;
298*23943Sjaap case 'f': /* line mode */
299*23943Sjaap linetype = *bp++;
300*23943Sjaap break;
301*23943Sjaap case 'l':
302*23943Sjaap x = getbuf();
303*23943Sjaap y = getbuf();
304*23943Sjaap x1 = getbuf();
305*23943Sjaap y1 = getbuf();
306*23943Sjaap if (linetype == 's')
307*23943Sjaap line(x, y, x1, y1);
308*23943Sjaap else
309*23943Sjaap dotline(x, y, x1, y1, linetype);
310*23943Sjaap break;
311*23943Sjaap case 't':
312*23943Sjaap for (p = s; *p++ = *bp++; )
313*23943Sjaap ;
314*23943Sjaap label(s, 'L', 0);
315*23943Sjaap break;
316*23943Sjaap case 'e':
317*23943Sjaap erase();
318*23943Sjaap break;
319*23943Sjaap case 'p':
320*23943Sjaap x = getbuf();
321*23943Sjaap y = getbuf();
322*23943Sjaap point(x, y);
323*23943Sjaap break;
324*23943Sjaap case 'n':
325*23943Sjaap x = getbuf();
326*23943Sjaap y = getbuf();
327*23943Sjaap cont(x, y);
328*23943Sjaap break;
329*23943Sjaap case 's':
330*23943Sjaap x = getbuf();
331*23943Sjaap y = getbuf();
332*23943Sjaap x1 = getbuf();
333*23943Sjaap y1 = getbuf();
334*23943Sjaap space(x, y, x1, y1);
335*23943Sjaap break;
336*23943Sjaap case 'a':
337*23943Sjaap x = getbuf();
338*23943Sjaap y = getbuf();
339*23943Sjaap x1 = getbuf();
340*23943Sjaap y1 = getbuf();
341*23943Sjaap x2 = getbuf();
342*23943Sjaap y2 = getbuf();
343*23943Sjaap arc(x, y, x1, y1, x2, y2);
344*23943Sjaap break;
345*23943Sjaap case 'c':
346*23943Sjaap x = getbuf();
347*23943Sjaap y = getbuf();
348*23943Sjaap r = getbuf();
349*23943Sjaap circle(x, y, r);
350*23943Sjaap break;
351*23943Sjaap case 'b':
352*23943Sjaap x = getbuf();
353*23943Sjaap y = getbuf();
354*23943Sjaap x1 = getbuf();
355*23943Sjaap y1 = getbuf();
356*23943Sjaap box(x, y, x1, y1);
357*23943Sjaap break;
358*23943Sjaap default:
359*23943Sjaap break;
360*23943Sjaap }
361*23943Sjaap }
362*23943Sjaap closepl();
363*23943Sjaap }
364*23943Sjaap
dotline(x0,y0,x1,y1,type)365*23943Sjaap dotline(x0, y0, x1, y1, type) /* dotted or dashed line */
366*23943Sjaap int x0, y0, x1, y1;
367*23943Sjaap int type;
368*23943Sjaap {
369*23943Sjaap int prevval = 10;
370*23943Sjaap int i, numdots;
371*23943Sjaap double a, b, sqrt(), dx, dy;
372*23943Sjaap
373*23943Sjaap dx = x1 - x0;
374*23943Sjaap dy = y1 - y0;
375*23943Sjaap if (type == '.') {
376*23943Sjaap numdots = sqrt(dx*dx + dy*dy) / prevval + 0.5;
377*23943Sjaap for (i = 0; i <= numdots; i++) {
378*23943Sjaap a = (float) i / (float) numdots;
379*23943Sjaap move(x0 + (int)(a * dx), y0 + (int)(a * dy));
380*23943Sjaap dot();
381*23943Sjaap }
382*23943Sjaap } else { /* all others */
383*23943Sjaap double d, dashsize, spacesize;
384*23943Sjaap d = sqrt(dx*dx + dy*dy) + 0.5;
385*23943Sjaap if (d <= 2 * prevval) {
386*23943Sjaap line(x0, y0, x1, y1);
387*23943Sjaap return;
388*23943Sjaap }
389*23943Sjaap numdots = d / (2 * prevval - 1) + 1; /* ceiling */
390*23943Sjaap dashsize = prevval;
391*23943Sjaap spacesize = (d - numdots * dashsize) / (numdots - 1);
392*23943Sjaap for (i = 0; i < numdots-1; i++) {
393*23943Sjaap a = i * (dashsize + spacesize) / d;
394*23943Sjaap b = a + dashsize / d;
395*23943Sjaap line(x0 + (int)(a*dx), y0 + (int)(a*dy), x0 + (int)(b*dx), y0 + (int)(b*dy));
396*23943Sjaap a = b;
397*23943Sjaap b = a + spacesize / d;
398*23943Sjaap move(x0 + (int)(a*dx), y0 + (int)(a*dy));
399*23943Sjaap }
400*23943Sjaap line(x0 + (int)(b * dx), y0 + (int)(b * dy), x1, y1);
401*23943Sjaap }
402*23943Sjaap }
403*23943Sjaap
getbuf()404*23943Sjaap getbuf()
405*23943Sjaap {
406*23943Sjaap int n;
407*23943Sjaap
408*23943Sjaap n = *bp++ << 8;
409*23943Sjaap n |= (*bp++ & 0377);
410*23943Sjaap return(n);
411*23943Sjaap }
412*23943Sjaap
getsi(fin)413*23943Sjaap getsi(fin) FILE *fin; { /* get an integer stored in 2 ascii bytes. */
414*23943Sjaap short a, b;
415*23943Sjaap if((b = getc(fin)) == EOF)
416*23943Sjaap return(EOF);
417*23943Sjaap if((a = getc(fin)) == EOF)
418*23943Sjaap return(EOF);
419*23943Sjaap a = a<<8;
420*23943Sjaap return(a|b);
421*23943Sjaap }
422