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