1 /* main.c	(Berkeley)	1.3	83/08/15	*/
2 #include	<stdio.h>
3 #include	"pic.h"
4 #include	"y.tab.h"
5 #include	"dev.h"
6 
7 
8 #define DEVDIR	"/usr/lib/font"		/* place to look up device files */
9 
10 char	*devdir = DEVDIR;
11 char	*dev = "var";			/* default typesetter is varian */
12 
13 struct	obj	*objlist[MAXOBJ];	/* store the elements here */
14 int	nobj	= 0;
15 
16 struct attr	attr[40];	/* attributes stored here as collected */
17 int	nattr	= 0;	/* number of entries in attr_list */
18 
19 struct	text	text[MAXTEXT];	/* text strings stored here as collected */
20 int	ntext	= 0;
21 int	ntext1	= 0;	/* record ntext here on entry to each figure */
22 
23 float	curx	= 0;
24 float	cury	= 0;
25 
26 int	hvmode	= R_DIR;	/* R => join left to right, D => top to bottom, etc. */
27 
28 int	codegen	= 0;	/* 1=>output for this picture; 0=>no output */
29 
30 float	deltx	= 6.0;	/* max x value in output, for scaling */
31 float	delty	= 6.0;	/* max y value in output, for scaling */
32 float	xbound	= 8.0;	/* max allowed x value in output */
33 float	ybound	= 10.0;	/* max allowed y value in output */
34 int	dbg	= 0;
35 extern	FILE	*yyin,	/* input file pointer */
36 		*skeldb; /* output pointer for dbg messeges */
37 int	lineno	= 0;
38 char	*filename	= "-";
39 int	synerr	= 0;
40 char	*cmdname;
41 int	crop	= 1;	/* trim off exterior white space if non-zero */
42 extern int	useDline;	/* if set, use \D for all lines */
43 int	res;		/* resolution of output device (dots/inch) */
44 int	DX;		/* smallest change in X, and Y for output device */
45 int	DY;
46 
47 
48 float	hshift	= 0;	/* move this far left for text (in em's) */
49 float	vshift	= 0.2;	/* this far down */
50 
51 float	sxmin;		/* lower limit from s command */
52 float	symin;
53 float	sxmax	= 4096;	/* upper */
54 float	symax	= 4096;
55 
56 float	xmin	= 30000;	/* min values found in actual data */
57 float	ymin	= 30000;
58 float	xmax	= -30000;	/* max */
59 float	ymax	= -30000;
60 
61 main(argc, argv)
62 	char **argv;
63 {
64 	cmdname = argv[0];
65 	while (argc > 1 && *argv[1] == '-') {
66 		switch (argv[1][1]) {
67 		case 'F':
68 			devdir = &argv[1][2];
69 			break;
70 		case 'T':
71 			dev = &argv[1][2];
72 			break;
73 		case 'd':
74 			dbg = 1;
75 			break;
76 		case 'D':
77 			useDline = !useDline;
78 			break;
79 		case 'x':
80 			xbound = atof(&argv[1][2]);
81 			break;
82 		case 'y':
83 			ybound = atof(&argv[1][2]);
84 			break;
85 		}
86 		argc--;
87 		argv++;
88 	}
89 
90 	fileinit();
91 	setdefaults();
92 	if (argc <= 1) {
93 		yyin = stdin;
94 		getdata(yyin);
95 	} else
96 		while (argc-- > 1) {
97 			if ((yyin = fopen(*++argv, "r")) == NULL) {
98 				fprintf(stderr, "pic: can't open %s\n", *argv);
99 				exit(1);
100 			}
101 			filename = *argv;
102 			getdata(yyin);
103 			fclose(yyin);
104 		}
105 	exit(0);
106 }
107 
108 
109 fileinit()
110 {
111 	int fin;
112 	struct dev device;
113 	char temp[100];
114 
115 	sprintf(temp, "%s/dev%s/DESC.out", devdir, dev);
116 	if ((fin = open(temp, 0)) < 0) {
117 	    fprintf(stderr, "can't open tables for %s\n", temp);
118 	    exit(1);
119 	}
120 	read(fin, &device, sizeof(struct dev));
121 	res = device.res;
122 	DX = device.hor;
123 	DY = device.vert;
124 	close(fin);
125 }
126 
127 
128 static struct {
129 	char *name;
130 	float val;
131 } defaults[] ={
132 	"scale", SCALE,
133 	"lineht", HT,
134 	"linewid", HT,
135 	"moveht", HT,
136 	"movewid", HT,
137 	"dashwid", HT10,
138 	"boxht", HT,
139 	"boxwid", WID,
140 	"circlerad", HT2,
141 	"arcrad", HT2,
142 	"ellipseht", HT,
143 	"ellipsewid", WID,
144 	"arrowht", HT5,
145 	"arrowwid", HT10,
146 	"textht", HT,
147 	"textwid", WID,
148 	NULL, 0
149 };
150 
151 setdefaults()	/* set default sizes for variables like boxht */
152 {
153 	int i;
154 	YYSTYPE v;
155 
156 	for (i = 0; defaults[i].name != NULL; i++) {
157 		v.f = defaults[i].val;
158 		makevar(tostring(defaults[i].name), VARNAME, v);
159 	}
160 }
161 
162 
163 checkscale(s)	/* if s is "scale", adjust default variables */
164 	char *s;
165 {
166 	int i;
167 	float scale;
168 
169 	if (strcmp(s, "scale") == 0) {
170 		scale = getfval("scale");
171 		for (i = 1; defaults[i].name != NULL; i++)
172 			setfval(defaults[i].name, defaults[i].val * scale);
173 	}
174 }
175 
176 getdata(fin)
177 	register FILE *fin;
178 {
179 	char buf[1000], buf1[50];
180 	FILE *svyyin;
181 	int svlineno;
182 	char *svfilename, *p;
183 
184 	lineno = 0;
185 	while (fgets(buf, sizeof buf, fin) != NULL) {
186 		lineno++;
187 		if (*buf == '.' && *(buf+1) == 'P' && *(buf+2) == 'S') {
188 			for (p = &buf[3]; *p == ' '; p++)
189 				;
190 			if (*p++ == '<') {
191 				svyyin = yyin;
192 				svlineno = lineno;
193 				svfilename = filename;
194 				sscanf(p, "%s", buf1);
195 				if ((yyin = fopen(buf1, "r")) == NULL) {
196 					fprintf(stderr, "pic: can't open %s\n", buf1);
197 					exit(1);
198 				}
199 				lineno = 0;
200 				filename = p;
201 				getdata(yyin);
202 				fclose(yyin);
203 				lineno = svlineno;
204 				yyin = svyyin;
205 				filename = svfilename;
206 				continue;
207 			}
208 			reset();
209 			yyparse();
210 			/* yylval now contains 'E' or 'F' from .PE or .PF */
211 			if (buf[3] == ' ')	/* assume next thing is width */
212 				deltx = delty = atof(&buf[4]);
213 			else {
214 				deltx = xmax - xmin;
215 				if (deltx <= 0)
216 					deltx = ymax - ymin;
217 				deltx /= getfval("scale");
218 				delty = deltx;
219 			}
220 			dprintf("deltx = %.3f\n", deltx);
221 			if (codegen && !synerr) {
222 				openpl(&buf[3]);	/* puts out .PS, with ht & wid stuck in */
223 				print();	/* assumes \n at end */
224 				closepl(yylval.p);	/* does the .PE/F */
225 			}
226 			fflush(stdout);
227 		}
228 		else
229 			fputs(buf, stdout);
230 	}
231 }
232 
233 reset()
234 {
235 	struct obj *op;
236 	int i;
237 	struct symtab *p;
238 	extern int nstack;
239 
240 	for (i = 0; i < nobj; i++) {
241 		op = objlist[i];
242 		if (op->o_type == BLOCK)
243 			freesymtab(op->o_dotdash);	/* funny place */
244 		free(objlist[i]);
245 	}
246 	nobj = 0;
247 	nattr = 0;
248 	for (i = 0; i < ntext; i++)
249 		free(text[i].t_val);
250 	ntext = ntext1 = 0;
251 	codegen = synerr = 0;
252 	nstack = 0;
253 	curx = cury = 0;
254 	hvmode = R_DIR;
255 	sxmin = symin = 0;
256 	sxmax = symax = 4096;
257 	xmin = ymin = 30000;
258 	xmax = ymax = -30000;
259 }
260