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