Blame


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