1 #ifndef lint
2 static char sccsid[] = "@(#)print.c	1.1 (CWI) 85/07/19";
3 #endif lint
4 #include <stdio.h>
5 #include <ctype.h>
6 #include "grap.h"
7 #include "y.tab.h"
8 
9 double	margin	= MARGIN;	/* extra space around edges */
10 extern	double	frame_ht, frame_wid, ticklen;
11 
12 char	graphname[50] = "Graph";
13 char	graphpos[200] = "";
14 
15 print()	/* arrange final output */
16 {
17 	FILE *fd;
18 	Obj *p, *dfp, *setauto();
19 	int c;
20 	static int firstG1 = 0;
21 	double dx, dy, xfac, yfac;
22 	extern double pow();
23 
24 	if (tfd != stdout) {
25 		fclose(tfd);	/* end the temp file */
26 		tfd = stdout;
27 	}
28 
29 	if ((p=lookup("margin",0)) != NULL)
30 		margin = p->fval;
31 	if (frame_ht < 0)	/* wasn't set explicitly, so use default */
32 		frame_ht = getvar(lookup("frameht", 0));
33 	if (frame_wid < 0)
34 		frame_wid = getvar(lookup("framewid", 0));
35 	dfp = NULL;
36 	for (p = objlist; p; p = p->next) {
37 		dprintf("print: name = <%s>, type = %d\n", p->name, p->type);
38 		if (p->type == NAME) {
39 			Point pt, pt1;
40 			pt = p->pt;
41 			pt1 = p->pt1;
42 			fprintf(tfd, "\t# %s %g .. %g, %g .. %g\n",
43 				p->name, pt.x, pt1.x, pt.y, pt1.y);
44 			if (p->log & XFLAG) {
45 				if (pt.x <= 0.0)
46 					fatal("can't take log of x coord %g", pt.x);
47 				logit(pt.x);
48 				logit(pt1.x);
49 			}
50 			if (p->log & YFLAG) {
51 				if (pt.y <= 0.0)
52 					fatal("can't take log of y coord %g", pt.y);
53 				logit(pt.y);
54 				logit(pt1.y);
55 			}
56 			if (!(p->coord & XFLAG)) {
57 				dx = pt1.x - pt.x;
58 				pt.x -= margin * dx;
59 				pt1.x += margin * dx;
60 			}
61 			if (!(p->coord & YFLAG)) {
62 				dy = pt1.y - pt.y;
63 				pt.y -= margin * dy;
64 				pt1.y += margin * dy;
65 			}
66 			if (autoticks && strcmp(p->name, dflt_coord) == 0) {
67 				p->pt = pt;
68 				p->pt1 = pt1;
69 				if (p->log & XFLAG) {
70 					p->pt.x = pow(10.0, pt.x);
71 					p->pt1.x = pow(10.0, pt1.x);
72 				}
73 				if (p->log & YFLAG) {
74 					p->pt.y = pow(10.0, pt.y);
75 					p->pt1.y = pow(10.0, pt1.y);
76 				}
77 				dfp = setauto(p);
78 			}
79 			dx = pt1.x - pt.x;
80 			dy = pt1.y - pt.y;
81 			xfac = dx > 0 ? frame_wid/dx : 0;
82 			yfac = dy > 0 ? frame_ht/dy : 0;
83 
84 			fprintf(tfd, "define xy_%s @ ", p->name);
85 			fprintf(tfd, "\t(($1)-(%g))*%g", pt.x, xfac);
86 			fprintf(tfd, ", (($2)-(%g))*%g @\n", pt.y, yfac);
87 			fprintf(tfd, "define x_%s @ ", p->name);
88 			fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.x, xfac);
89 			fprintf(tfd, "define y_%s @ ", p->name);
90 			fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.y, yfac);
91 		}
92 	}
93 	if (codegen)
94 		frame();
95 	if (codegen && autoticks && dfp)
96 		do_autoticks(dfp);
97 
98 	if ((fd = fopen(tempfile, "r")) != NULL) {
99 		while ((c = getc(fd)) != EOF)
100 			putc(c, tfd);
101 		fclose(fd);
102 	}
103 	tfd = NULL;
104 }
105 
106 endstat()	/* clean up after each statement */
107 {
108 	extern int just, sizeop, tick_dir;
109 	extern double sizexpr, lab_up, lab_rt;
110 
111 	just = sizeop = 0;
112 	lab_up = lab_rt = 0.0;
113 	sizexpr = 0.0;
114 	nnum = 0;
115 	ntick = 0;
116 	tside = 0;
117 	tick_dir = OUT;
118 	ticklen = TICKLEN;
119 }
120 
121 graph(s)	/* graph statement */
122 	char *s;
123 {
124 	char *p, *os;
125 	int c;
126 
127 	if (codegen) {
128 		fprintf(stdout, "%s: [\n", graphname);
129 		print();	/* pump out previous graph */
130 		fprintf(stdout, "\n] %s\n", graphpos);
131 		reset();
132 	}
133 	if (s) {
134 		dprintf("into graph with <%s>\n", s);
135 		os = s;
136 		while ((c = *s) == ' ' || c == '\t')
137 			s++;
138 		if (c == '\0')
139 			yyerror("no name on graph statement");
140 		if (!isupper(s[0]))
141 			yyerror("graph name %s must be capitalized", s);
142 		for (p=graphname; (c = *s) != ' ' && c != '\t' && c != '\0'; )
143 			*p++ = *s++;
144 		*p = '\0';
145 		strcpy(graphpos, s);
146 		dprintf("graphname = <%s>, graphpos = <%s>\n", graphname, graphpos);
147 		free(os);
148 	}
149 }
150 
151 setup()		/* done at each .G1 */
152 {
153 	static int firstG1 = 0;
154 
155 	reset();
156 	frame_ht = frame_wid = -1;	/* reset in frame() */
157 	ticklen = getvar(lookup("ticklen", 0));
158 	if (firstG1++ == 0)
159 		do_first();
160 	codegen = synerr = 0;
161 	strcpy(graphname, "Graph");
162 	strcpy(graphpos, "");
163 }
164 
165 do_first()	/* done at first .G1:  definitions, etc. */
166 {
167 	extern int lib;
168 	extern char *lib_defines;
169 	static char buf[50], buf1[50];	/* static because pbstr uses them */
170 
171 	sprintf(buf, "define pid /%d/\n", getpid());
172 	pbstr(buf);
173 	if (lib != 0) {
174 		if (access(lib_defines, 4) == 0) {
175 			sprintf(buf1, "copy \"%s\"\n", lib_defines);
176 			pbstr(buf1);
177 		} else {
178 			fprintf(stderr, "grap warning: can't open %s\n", lib_defines);
179 		}
180 	}
181 }
182 
183 reset()		/* done at each "graph ..." statement */
184 {
185 	Obj *p, *np, *deflist;
186 
187 	curr_coord = dflt_coord;
188 	ncoord = auto_x = 0;
189 	autoticks = LEFT|BOT;
190 	margin = MARGIN;
191 	deflist = NULL;
192 	for (p = objlist; p; p = np) {
193 		np = p->next;
194 		if (p->type == DEFNAME || p->type == VARNAME) {
195 			p->next = deflist;
196 			deflist = p;
197 		} else {
198 			free(p->name);
199 			freeattr(p->attr);
200 			free(p);
201 		}
202 	}
203 	objlist = deflist;
204 	if (tfd != stdout && (tfd = fopen(tempfile, "w")) == NULL) {
205 		fprintf(stderr, "grap: can't open %s\n", tempfile);
206 		exit(1);
207 	}
208 }
209