1 #ifndef lint
2 static char sccsid[] = "@(#)main.c	3.1 (CWI) 85/07/30";
3 #endif lint
4 
5 #include	<stdio.h>
6 #include	<signal.h>
7 #include	"pic.h"
8 #include	"y.tab.h"
9 
10 obj	**objlist = 0;	/* store the elements here */
11 int	nobjlist = 0;		/* size of objlist array */
12 int	nobj	= 0;
13 
14 Attr	*attr;	/*;attributes stored here as collected */
15 int	nattrlist = 0;
16 int	nattr	= 0;	/* number of entries in attr_list */
17 
18 Text	*text	= 0;	/* text strings stored here as collected */
19 int	ntextlist = 0;		/* size of text[] array */
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;	/* max x value in output, for scaling */
31 float	delty	= 6;	/* max y value in output, for scaling */
32 int	dbg	= 0;
33 int	lineno	= 0;
34 char	*filename	= "-";
35 int	synerr	= 0;
36 char	*cmdname;
37 
38 float	xmin	= 30000;	/* min values found in actual data */
39 float	ymin	= 30000;
40 float	xmax	= -30000;	/* max */
41 float	ymax	= -30000;
42 
main(argc,argv)43 main(argc, argv)
44 	char *argv[];
45 {
46 	char buf[20];
47 	extern int fpecatch();
48 
49 	signal(SIGFPE, fpecatch);
50 	cmdname = argv[0];
51 	while (argc > 1 && *argv[1] == '-') {
52 		switch (argv[1][1]) {
53 		case 'd':
54 			dbg = atoi(&argv[1][2]);
55 			if (dbg == 0)
56 				dbg = 1;
57 			break;
58 		}
59 		argc--;
60 		argv++;
61 	}
62 	setdefaults();
63 	objlist = (obj **) grow(objlist, "objlist", nobjlist += 1000, sizeof(obj *));
64 	text = (Text *) grow(text, "text", ntextlist += 1000, sizeof(Text));
65 	attr = (Attr *) grow(attr, "attr", nattrlist += 100, sizeof(Attr));
66 
67 	sprintf(buf, "/%d/", getpid());
68 	pushsrc(String, buf);
69 	definition("pid");
70 
71 	pushsrc(File, curfile = infile);
72 	if (argc <= 1) {
73 		curfile->fin = stdin;
74 		curfile->fname = tostring("-");
75 		getdata(curfile);
76 	} else
77 		while (argc-- > 1) {
78 			if ((curfile->fin = fopen(*++argv, "r")) == NULL) {
79 				fprintf(stderr, "%s: can't open %s\n", cmdname, *argv);
80 				exit(1);
81 			}
82 			curfile->fname = tostring(*argv);
83 			getdata(curfile);
84 			fclose(curfile->fin);
85 			free(curfile->fname);
86 		}
87 	exit(0);
88 }
89 
fpecatch()90 fpecatch()
91 {
92 	fatal("floating point exception");
93 }
94 
grow(ptr,name,num,size)95 char *grow(ptr, name, num, size)	/* make array bigger */
96 	char *ptr, *name;
97 	int num, size;
98 {
99 	char *p;
100 
101 	if (ptr == NULL)
102 		p = malloc(num * size);
103 	else
104 		p = realloc(ptr, num * size);
105 	if (p == NULL)
106 		fatal("can't grow %s to %d", name, num * size);
107 	return p;
108 }
109 
110 static struct {
111 	char *name;
112 	float val;
113 	short scalable;		/* 1 => adjust when "scale" changes */
114 } defaults[] ={
115 	"scale", SCALE, 1,
116 	"lineht", HT, 1,
117 	"linewid", HT, 1,
118 	"moveht", HT, 1,
119 	"movewid", HT, 1,
120 	"dashwid", HT10, 1,
121 	"boxht", HT, 1,
122 	"boxwid", WID, 1,
123 	"circlerad", HT2, 1,
124 	"arcrad", HT2, 1,
125 	"ellipseht", HT, 1,
126 	"ellipsewid", WID, 1,
127 	"arrowht", HT5, 1,
128 	"arrowwid", HT10, 1,
129 	"arrowhead", 2, 0,		/* arrowhead style */
130 	"textht", 0.0, 1,		/* 6 lines/inch is also a useful value */
131 	"textwid", 0.0, 1,
132 	NULL, 0
133 };
134 
setdefaults()135 setdefaults()	/* set default sizes for variables like boxht */
136 {
137 	int i;
138 	YYSTYPE v;
139 
140 	for (i = 0; defaults[i].name != NULL; i++) {
141 		v.f = defaults[i].val;
142 		makevar(tostring(defaults[i].name), VARNAME, v);
143 	}
144 }
145 
resetvar()146 resetvar()	/* reset variables listed */
147 {
148 	int i, j;
149 
150 	if (nattr == 0) {	/* none listed, so do all */
151 		setdefaults();
152 		return;
153 	}
154 	for (i = 0; i < nattr; i++) {
155 		for (j = 0; defaults[j].name != NULL; j++)
156 			if (strcmp(defaults[j].name, attr[i].a_val.p) == 0) {
157 				setfval(defaults[j].name, defaults[j].val);
158 				free(attr[i].a_val.p);
159 				break;
160 			}
161 	}
162 }
163 
checkscale(s)164 checkscale(s)	/* if s is "scale", adjust default variables */
165 	char *s;
166 {
167 	int i;
168 	float scale;
169 
170 	if (strcmp(s, "scale") == 0) {
171 		scale = getfval("scale");
172 		for (i = 1; defaults[i].name != NULL; i++)
173 			if (defaults[i].scalable)
174 				setfval(defaults[i].name, defaults[i].val * scale);
175 	}
176 }
177 
getdata()178 getdata()
179 {
180 	char *p, buf[1000], buf1[100];
181 	int ln;
182 
183 	curfile->lineno = 0;
184 	printf(".lf 1 %s\n", curfile->fname);
185 	while (fgets(buf, sizeof buf, curfile->fin) != NULL) {
186 		curfile->lineno++;
187 		if (*buf == '.' && *(buf+1) == 'P' && *(buf+2) == 'S') {
188 			for (p = &buf[3]; *p == ' '; p++)
189 				;
190 			if (*p++ == '<') {
191 				Infile svfile;
192 				svfile = *curfile;
193 				sscanf(p, "%s", buf1);
194 				if ((curfile->fin=fopen(buf1, "r")) == NULL)
195 					fatal("can't open %s", buf1);
196 				curfile->fname = tostring(buf1);
197 				getdata();
198 				fclose(curfile->fin);
199 				free(curfile->fname);
200 				*curfile = svfile;
201 				printf(".lf %d %s\n", curfile->lineno, curfile->fname);
202 				continue;
203 			}
204 			reset();
205 			yyparse();
206 			/* yylval.i now contains 'E' or 'F' from .PE or .PF */
207 
208 			deltx = (xmax - xmin) / getfval("scale");
209 			delty = (ymax - ymin) / getfval("scale");
210 			if (buf[3] == ' ') {	/* next things are wid & ht */
211 				if (sscanf(&buf[4],"%f%f",&deltx,&delty) < 2)
212 					delty = deltx * (ymax-ymin) / (xmax-xmin);
213 			}
214 			dprintf("deltx = %g, delty = %g\n", deltx, delty);
215 			if (codegen && !synerr) {
216 				openpl(&buf[3]);	/* puts out .PS, with ht & wid stuck in */
217 				printf(".lf %d\n", curfile->lineno+1);
218 				print();	/* assumes \n at end */
219 				closepl(yylval.i);	/* does the .PE/F */
220 			}
221 			printf(".lf %d\n", curfile->lineno+1);
222 			fflush(stdout);
223 		} else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') {
224 			if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) {
225 				free(curfile->fname);
226 				printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1));
227 			} else
228 				printf(".lf %d\n", curfile->lineno = ln);
229 		} else
230 			fputs(buf, stdout);
231 	}
232 }
233 
reset()234 reset()
235 {
236 	obj *op;
237 	int i;
238 	struct symtab *p;
239 	extern int nstack;
240 
241 	for (i = 0; i < nobj; i++) {
242 		op = objlist[i];
243 		if (op->o_type == BLOCK)
244 			freesymtab(op->o_symtab);
245 		free(objlist[i]);
246 	}
247 	nobj = 0;
248 	nattr = 0;
249 	for (i = 0; i < ntext; i++)
250 		if (text[i].t_val)
251 			free(text[i].t_val);
252 	ntext = ntext1 = 0;
253 	codegen = synerr = 0;
254 	nstack = 0;
255 	curx = cury = 0;
256 	hvmode = R_DIR;
257 	xmin = ymin = 30000;
258 	xmax = ymax = -30000;
259 }
260