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