Blame


1 b6d98463 2006-04-14 devnull #include <stdio.h>
2 b6d98463 2006-04-14 devnull #include <string.h>
3 b6d98463 2006-04-14 devnull #include <math.h>
4 b6d98463 2006-04-14 devnull #include "pic.h"
5 b6d98463 2006-04-14 devnull #include "y.tab.h"
6 b6d98463 2006-04-14 devnull
7 b6d98463 2006-04-14 devnull int
8 b6d98463 2006-04-14 devnull setdir(int n) /* set direction (hvmode) from LEFT, RIGHT, etc. */
9 b6d98463 2006-04-14 devnull {
10 b6d98463 2006-04-14 devnull switch (n) {
11 b6d98463 2006-04-14 devnull case UP: hvmode = U_DIR; break;
12 b6d98463 2006-04-14 devnull case DOWN: hvmode = D_DIR; break;
13 b6d98463 2006-04-14 devnull case LEFT: hvmode = L_DIR; break;
14 b6d98463 2006-04-14 devnull case RIGHT: hvmode = R_DIR; break;
15 b6d98463 2006-04-14 devnull }
16 b6d98463 2006-04-14 devnull return(hvmode);
17 b6d98463 2006-04-14 devnull }
18 b6d98463 2006-04-14 devnull
19 b6d98463 2006-04-14 devnull int
20 b6d98463 2006-04-14 devnull curdir(void) /* convert current dir (hvmode) to RIGHT, LEFT, etc. */
21 b6d98463 2006-04-14 devnull {
22 b6d98463 2006-04-14 devnull switch (hvmode) {
23 b6d98463 2006-04-14 devnull case R_DIR: return RIGHT;
24 b6d98463 2006-04-14 devnull case L_DIR: return LEFT;
25 b6d98463 2006-04-14 devnull case U_DIR: return UP;
26 b6d98463 2006-04-14 devnull case D_DIR: return DOWN;
27 b6d98463 2006-04-14 devnull }
28 b6d98463 2006-04-14 devnull ERROR "can't happen curdir" FATAL;
29 b6d98463 2006-04-14 devnull return 0;
30 b6d98463 2006-04-14 devnull }
31 b6d98463 2006-04-14 devnull
32 b6d98463 2006-04-14 devnull double
33 b6d98463 2006-04-14 devnull getcomp(obj *p, int t) /* return component of a position */
34 b6d98463 2006-04-14 devnull {
35 b6d98463 2006-04-14 devnull switch (t) {
36 b6d98463 2006-04-14 devnull case DOTX:
37 b6d98463 2006-04-14 devnull return p->o_x;
38 b6d98463 2006-04-14 devnull case DOTY:
39 b6d98463 2006-04-14 devnull return p->o_y;
40 b6d98463 2006-04-14 devnull case DOTWID:
41 b6d98463 2006-04-14 devnull switch (p->o_type) {
42 b6d98463 2006-04-14 devnull case BOX:
43 b6d98463 2006-04-14 devnull case BLOCK:
44 b6d98463 2006-04-14 devnull case TEXT:
45 b6d98463 2006-04-14 devnull return p->o_val[0];
46 b6d98463 2006-04-14 devnull case CIRCLE:
47 b6d98463 2006-04-14 devnull case ELLIPSE:
48 b6d98463 2006-04-14 devnull return 2 * p->o_val[0];
49 b6d98463 2006-04-14 devnull case LINE:
50 b6d98463 2006-04-14 devnull case ARROW:
51 b6d98463 2006-04-14 devnull return p->o_val[0] - p->o_x;
52 b6d98463 2006-04-14 devnull case PLACE:
53 b6d98463 2006-04-14 devnull return 0;
54 b6d98463 2006-04-14 devnull }
55 b6d98463 2006-04-14 devnull case DOTHT:
56 b6d98463 2006-04-14 devnull switch (p->o_type) {
57 b6d98463 2006-04-14 devnull case BOX:
58 b6d98463 2006-04-14 devnull case BLOCK:
59 b6d98463 2006-04-14 devnull case TEXT:
60 b6d98463 2006-04-14 devnull return p->o_val[1];
61 b6d98463 2006-04-14 devnull case CIRCLE:
62 b6d98463 2006-04-14 devnull case ELLIPSE:
63 b6d98463 2006-04-14 devnull return 2 * p->o_val[1];
64 b6d98463 2006-04-14 devnull case LINE:
65 b6d98463 2006-04-14 devnull case ARROW:
66 b6d98463 2006-04-14 devnull return p->o_val[1] - p->o_y;
67 b6d98463 2006-04-14 devnull case PLACE:
68 b6d98463 2006-04-14 devnull return 0;
69 b6d98463 2006-04-14 devnull }
70 b6d98463 2006-04-14 devnull case DOTRAD:
71 b6d98463 2006-04-14 devnull switch (p->o_type) {
72 b6d98463 2006-04-14 devnull case CIRCLE:
73 b6d98463 2006-04-14 devnull case ELLIPSE:
74 b6d98463 2006-04-14 devnull return p->o_val[0];
75 b6d98463 2006-04-14 devnull }
76 b6d98463 2006-04-14 devnull }
77 b6d98463 2006-04-14 devnull ERROR "you asked for a weird dimension or position" WARNING;
78 b6d98463 2006-04-14 devnull return 0;
79 b6d98463 2006-04-14 devnull }
80 b6d98463 2006-04-14 devnull
81 b6d98463 2006-04-14 devnull double exprlist[100];
82 b6d98463 2006-04-14 devnull int nexpr = 0;
83 b6d98463 2006-04-14 devnull
84 b6d98463 2006-04-14 devnull void
85 b6d98463 2006-04-14 devnull exprsave(double f)
86 b6d98463 2006-04-14 devnull {
87 b6d98463 2006-04-14 devnull exprlist[nexpr++] = f;
88 b6d98463 2006-04-14 devnull }
89 b6d98463 2006-04-14 devnull
90 b6d98463 2006-04-14 devnull char*
91 b6d98463 2006-04-14 devnull sprintgen(char *fmt)
92 b6d98463 2006-04-14 devnull {
93 b6d98463 2006-04-14 devnull char buf[1000];
94 b6d98463 2006-04-14 devnull
95 b6d98463 2006-04-14 devnull sprintf(buf, fmt, exprlist[0], exprlist[1], exprlist[2], exprlist[3], exprlist[4]);
96 b6d98463 2006-04-14 devnull nexpr = 0;
97 b6d98463 2006-04-14 devnull free(fmt);
98 b6d98463 2006-04-14 devnull return tostring(buf);
99 b6d98463 2006-04-14 devnull }
100 b6d98463 2006-04-14 devnull
101 b6d98463 2006-04-14 devnull void
102 b6d98463 2006-04-14 devnull makefattr(int type, int sub, double f) /* double attr */
103 b6d98463 2006-04-14 devnull {
104 b6d98463 2006-04-14 devnull YYSTYPE val;
105 b6d98463 2006-04-14 devnull val.f = f;
106 b6d98463 2006-04-14 devnull makeattr(type, sub, val);
107 b6d98463 2006-04-14 devnull }
108 b6d98463 2006-04-14 devnull
109 b6d98463 2006-04-14 devnull void
110 b6d98463 2006-04-14 devnull makeoattr(int type, obj *o) /* obj* attr */
111 b6d98463 2006-04-14 devnull {
112 b6d98463 2006-04-14 devnull YYSTYPE val;
113 b6d98463 2006-04-14 devnull val.o = o;
114 b6d98463 2006-04-14 devnull makeattr(type, 0, val);
115 b6d98463 2006-04-14 devnull }
116 b6d98463 2006-04-14 devnull
117 b6d98463 2006-04-14 devnull void
118 b6d98463 2006-04-14 devnull makeiattr(int type, int i) /* int attr */
119 b6d98463 2006-04-14 devnull {
120 b6d98463 2006-04-14 devnull YYSTYPE val;
121 b6d98463 2006-04-14 devnull val.i = i;
122 b6d98463 2006-04-14 devnull makeattr(type, 0, val);
123 b6d98463 2006-04-14 devnull }
124 b6d98463 2006-04-14 devnull
125 b6d98463 2006-04-14 devnull void
126 b6d98463 2006-04-14 devnull maketattr(int sub, char *p) /* text attribute: takes two */
127 b6d98463 2006-04-14 devnull {
128 b6d98463 2006-04-14 devnull YYSTYPE val;
129 b6d98463 2006-04-14 devnull val.p = p;
130 b6d98463 2006-04-14 devnull makeattr(TEXTATTR, sub, val);
131 b6d98463 2006-04-14 devnull }
132 b6d98463 2006-04-14 devnull
133 b6d98463 2006-04-14 devnull void
134 b6d98463 2006-04-14 devnull addtattr(int sub) /* add text attrib to existing item */
135 b6d98463 2006-04-14 devnull {
136 b6d98463 2006-04-14 devnull attr[nattr-1].a_sub |= sub;
137 b6d98463 2006-04-14 devnull }
138 b6d98463 2006-04-14 devnull
139 b6d98463 2006-04-14 devnull void
140 b6d98463 2006-04-14 devnull makevattr(char *p) /* varname attribute */
141 b6d98463 2006-04-14 devnull {
142 b6d98463 2006-04-14 devnull YYSTYPE val;
143 b6d98463 2006-04-14 devnull val.p = p;
144 b6d98463 2006-04-14 devnull makeattr(VARNAME, 0, val);
145 b6d98463 2006-04-14 devnull }
146 b6d98463 2006-04-14 devnull
147 b6d98463 2006-04-14 devnull void
148 b6d98463 2006-04-14 devnull makeattr(int type, int sub, YYSTYPE val) /* add attribute type and val */
149 b6d98463 2006-04-14 devnull {
150 b6d98463 2006-04-14 devnull if (type == 0 && val.i == 0) { /* clear table for next stat */
151 b6d98463 2006-04-14 devnull nattr = 0;
152 b6d98463 2006-04-14 devnull return;
153 b6d98463 2006-04-14 devnull }
154 b6d98463 2006-04-14 devnull if (nattr >= nattrlist)
155 b6d98463 2006-04-14 devnull attr = (Attr *) grow((char *)attr, "attr", nattrlist += 100, sizeof(Attr));
156 b6d98463 2006-04-14 devnull dprintf("attr %d: %d %d %d\n", nattr, type, sub, val.i);
157 b6d98463 2006-04-14 devnull attr[nattr].a_type = type;
158 b6d98463 2006-04-14 devnull attr[nattr].a_sub = sub;
159 b6d98463 2006-04-14 devnull attr[nattr].a_val = val;
160 b6d98463 2006-04-14 devnull nattr++;
161 b6d98463 2006-04-14 devnull }
162 b6d98463 2006-04-14 devnull
163 b6d98463 2006-04-14 devnull void
164 b6d98463 2006-04-14 devnull printexpr(double f) /* print expression for debugging */
165 b6d98463 2006-04-14 devnull {
166 b6d98463 2006-04-14 devnull printf("%g\n", f);
167 b6d98463 2006-04-14 devnull }
168 b6d98463 2006-04-14 devnull
169 b6d98463 2006-04-14 devnull void
170 b6d98463 2006-04-14 devnull printpos(obj *p) /* print position for debugging */
171 b6d98463 2006-04-14 devnull {
172 b6d98463 2006-04-14 devnull printf("%g, %g\n", p->o_x, p->o_y);
173 b6d98463 2006-04-14 devnull }
174 b6d98463 2006-04-14 devnull
175 b6d98463 2006-04-14 devnull char*
176 b6d98463 2006-04-14 devnull tostring(char *s)
177 b6d98463 2006-04-14 devnull {
178 b6d98463 2006-04-14 devnull char *p;
179 b6d98463 2006-04-14 devnull
180 b6d98463 2006-04-14 devnull p = malloc(strlen(s)+1);
181 b6d98463 2006-04-14 devnull if (p == NULL)
182 b6d98463 2006-04-14 devnull ERROR "out of space in tostring on %s", s FATAL;
183 b6d98463 2006-04-14 devnull strcpy(p, s);
184 b6d98463 2006-04-14 devnull return(p);
185 b6d98463 2006-04-14 devnull }
186 b6d98463 2006-04-14 devnull
187 b6d98463 2006-04-14 devnull obj*
188 b6d98463 2006-04-14 devnull makepos(double x, double y) /* make a position cell */
189 b6d98463 2006-04-14 devnull {
190 b6d98463 2006-04-14 devnull obj *p;
191 b6d98463 2006-04-14 devnull
192 b6d98463 2006-04-14 devnull p = makenode(PLACE, 0);
193 b6d98463 2006-04-14 devnull p->o_x = x;
194 b6d98463 2006-04-14 devnull p->o_y = y;
195 b6d98463 2006-04-14 devnull return(p);
196 b6d98463 2006-04-14 devnull }
197 b6d98463 2006-04-14 devnull
198 b6d98463 2006-04-14 devnull obj*
199 b6d98463 2006-04-14 devnull makebetween(double f, obj *p1, obj* p2) /* make position between p1 and p2 */
200 b6d98463 2006-04-14 devnull {
201 b6d98463 2006-04-14 devnull obj *p;
202 b6d98463 2006-04-14 devnull
203 b6d98463 2006-04-14 devnull dprintf("fraction = %.2f\n", f);
204 b6d98463 2006-04-14 devnull p = makenode(PLACE, 0);
205 b6d98463 2006-04-14 devnull p->o_x = p1->o_x + f * (p2->o_x - p1->o_x);
206 b6d98463 2006-04-14 devnull p->o_y = p1->o_y + f * (p2->o_y - p1->o_y);
207 b6d98463 2006-04-14 devnull return(p);
208 b6d98463 2006-04-14 devnull }
209 b6d98463 2006-04-14 devnull
210 b6d98463 2006-04-14 devnull obj*
211 b6d98463 2006-04-14 devnull getpos(obj *p, int corner) /* find position of point */
212 b6d98463 2006-04-14 devnull {
213 b6d98463 2006-04-14 devnull double x, y;
214 b6d98463 2006-04-14 devnull
215 b6d98463 2006-04-14 devnull whatpos(p, corner, &x, &y);
216 b6d98463 2006-04-14 devnull return makepos(x, y);
217 b6d98463 2006-04-14 devnull }
218 b6d98463 2006-04-14 devnull
219 b6d98463 2006-04-14 devnull int
220 b6d98463 2006-04-14 devnull whatpos(obj *p, int corner, double *px, double *py) /* what is the position (no side effect) */
221 b6d98463 2006-04-14 devnull {
222 b6d98463 2006-04-14 devnull double x, y, x1, y1;
223 b6d98463 2006-04-14 devnull
224 b6d98463 2006-04-14 devnull dprintf("whatpos %p %d %d\n", p, p->o_type, corner);
225 b6d98463 2006-04-14 devnull x = p->o_x;
226 b6d98463 2006-04-14 devnull y = p->o_y;
227 b6d98463 2006-04-14 devnull x1 = 0;
228 b6d98463 2006-04-14 devnull y1 = 0;
229 b6d98463 2006-04-14 devnull if (p->o_type != PLACE) {
230 b6d98463 2006-04-14 devnull x1 = p->o_val[0];
231 b6d98463 2006-04-14 devnull y1 = p->o_val[1];
232 b6d98463 2006-04-14 devnull }
233 b6d98463 2006-04-14 devnull switch (p->o_type) {
234 b6d98463 2006-04-14 devnull case PLACE:
235 b6d98463 2006-04-14 devnull break;
236 b6d98463 2006-04-14 devnull case BOX:
237 b6d98463 2006-04-14 devnull case BLOCK:
238 b6d98463 2006-04-14 devnull case TEXT:
239 b6d98463 2006-04-14 devnull switch (corner) {
240 b6d98463 2006-04-14 devnull case NORTH: y += y1 / 2; break;
241 b6d98463 2006-04-14 devnull case SOUTH: y -= y1 / 2; break;
242 b6d98463 2006-04-14 devnull case EAST: x += x1 / 2; break;
243 b6d98463 2006-04-14 devnull case WEST: x -= x1 / 2; break;
244 b6d98463 2006-04-14 devnull case NE: x += x1 / 2; y += y1 / 2; break;
245 b6d98463 2006-04-14 devnull case SW: x -= x1 / 2; y -= y1 / 2; break;
246 b6d98463 2006-04-14 devnull case SE: x += x1 / 2; y -= y1 / 2; break;
247 b6d98463 2006-04-14 devnull case NW: x -= x1 / 2; y += y1 / 2; break;
248 b6d98463 2006-04-14 devnull case START:
249 b6d98463 2006-04-14 devnull if (p->o_type == BLOCK)
250 b6d98463 2006-04-14 devnull return whatpos(objlist[(int)p->o_val[2]], START, px, py);
251 b6d98463 2006-04-14 devnull case END:
252 b6d98463 2006-04-14 devnull if (p->o_type == BLOCK)
253 b6d98463 2006-04-14 devnull return whatpos(objlist[(int)p->o_val[3]], END, px, py);
254 b6d98463 2006-04-14 devnull }
255 b6d98463 2006-04-14 devnull break;
256 b6d98463 2006-04-14 devnull case ARC:
257 b6d98463 2006-04-14 devnull switch (corner) {
258 b6d98463 2006-04-14 devnull case START:
259 b6d98463 2006-04-14 devnull if (p->o_attr & CW_ARC) {
260 b6d98463 2006-04-14 devnull x = p->o_val[2]; y = p->o_val[3];
261 b6d98463 2006-04-14 devnull } else {
262 b6d98463 2006-04-14 devnull x = x1; y = y1;
263 b6d98463 2006-04-14 devnull }
264 b6d98463 2006-04-14 devnull break;
265 b6d98463 2006-04-14 devnull case END:
266 b6d98463 2006-04-14 devnull if (p->o_attr & CW_ARC) {
267 b6d98463 2006-04-14 devnull x = x1; y = y1;
268 b6d98463 2006-04-14 devnull } else {
269 b6d98463 2006-04-14 devnull x = p->o_val[2]; y = p->o_val[3];
270 b6d98463 2006-04-14 devnull }
271 b6d98463 2006-04-14 devnull break;
272 b6d98463 2006-04-14 devnull }
273 b6d98463 2006-04-14 devnull if (corner == START || corner == END)
274 b6d98463 2006-04-14 devnull break;
275 b6d98463 2006-04-14 devnull x1 = y1 = sqrt((x1-x)*(x1-x) + (y1-y)*(y1-y));
276 b6d98463 2006-04-14 devnull /* Fall Through! */
277 b6d98463 2006-04-14 devnull case CIRCLE:
278 b6d98463 2006-04-14 devnull case ELLIPSE:
279 b6d98463 2006-04-14 devnull switch (corner) {
280 b6d98463 2006-04-14 devnull case NORTH: y += y1; break;
281 b6d98463 2006-04-14 devnull case SOUTH: y -= y1; break;
282 b6d98463 2006-04-14 devnull case EAST: x += x1; break;
283 b6d98463 2006-04-14 devnull case WEST: x -= x1; break;
284 b6d98463 2006-04-14 devnull case NE: x += 0.707 * x1; y += 0.707 * y1; break;
285 b6d98463 2006-04-14 devnull case SE: x += 0.707 * x1; y -= 0.707 * y1; break;
286 b6d98463 2006-04-14 devnull case NW: x -= 0.707 * x1; y += 0.707 * y1; break;
287 b6d98463 2006-04-14 devnull case SW: x -= 0.707 * x1; y -= 0.707 * y1; break;
288 b6d98463 2006-04-14 devnull }
289 b6d98463 2006-04-14 devnull break;
290 b6d98463 2006-04-14 devnull case LINE:
291 b6d98463 2006-04-14 devnull case SPLINE:
292 b6d98463 2006-04-14 devnull case ARROW:
293 b6d98463 2006-04-14 devnull switch (corner) {
294 b6d98463 2006-04-14 devnull case START: break; /* already in place */
295 b6d98463 2006-04-14 devnull case END: x = x1; y = y1; break;
296 b6d98463 2006-04-14 devnull default: /* change! */
297 b6d98463 2006-04-14 devnull case CENTER: x = (x+x1)/2; y = (y+y1)/2; break;
298 b6d98463 2006-04-14 devnull case NORTH: if (y1 > y) { x = x1; y = y1; } break;
299 b6d98463 2006-04-14 devnull case SOUTH: if (y1 < y) { x = x1; y = y1; } break;
300 b6d98463 2006-04-14 devnull case EAST: if (x1 > x) { x = x1; y = y1; } break;
301 b6d98463 2006-04-14 devnull case WEST: if (x1 < x) { x = x1; y = y1; } break;
302 b6d98463 2006-04-14 devnull }
303 b6d98463 2006-04-14 devnull break;
304 b6d98463 2006-04-14 devnull case MOVE:
305 b6d98463 2006-04-14 devnull /* really ought to be same as line... */
306 b6d98463 2006-04-14 devnull break;
307 b6d98463 2006-04-14 devnull }
308 b6d98463 2006-04-14 devnull dprintf("whatpos returns %g %g\n", x, y);
309 b6d98463 2006-04-14 devnull *px = x;
310 b6d98463 2006-04-14 devnull *py = y;
311 b6d98463 2006-04-14 devnull return 1;
312 b6d98463 2006-04-14 devnull }
313 b6d98463 2006-04-14 devnull
314 b6d98463 2006-04-14 devnull obj*
315 b6d98463 2006-04-14 devnull gethere(void) /* make a place for curx,cury */
316 b6d98463 2006-04-14 devnull {
317 b6d98463 2006-04-14 devnull dprintf("gethere %g %g\n", curx, cury);
318 b6d98463 2006-04-14 devnull return(makepos(curx, cury));
319 b6d98463 2006-04-14 devnull }
320 b6d98463 2006-04-14 devnull
321 b6d98463 2006-04-14 devnull obj*
322 b6d98463 2006-04-14 devnull getlast(int n, int t) /* find n-th previous occurrence of type t */
323 b6d98463 2006-04-14 devnull {
324 b6d98463 2006-04-14 devnull int i, k;
325 b6d98463 2006-04-14 devnull obj *p;
326 b6d98463 2006-04-14 devnull
327 b6d98463 2006-04-14 devnull k = n;
328 b6d98463 2006-04-14 devnull for (i = nobj-1; i >= 0; i--) {
329 b6d98463 2006-04-14 devnull p = objlist[i];
330 b6d98463 2006-04-14 devnull if (p->o_type == BLOCKEND) {
331 b6d98463 2006-04-14 devnull i = p->o_val[4];
332 b6d98463 2006-04-14 devnull continue;
333 b6d98463 2006-04-14 devnull }
334 b6d98463 2006-04-14 devnull if (p->o_type != t)
335 b6d98463 2006-04-14 devnull continue;
336 b6d98463 2006-04-14 devnull if (--k > 0)
337 b6d98463 2006-04-14 devnull continue; /* not there yet */
338 b6d98463 2006-04-14 devnull dprintf("got a last of x,y= %g,%g\n", p->o_x, p->o_y);
339 b6d98463 2006-04-14 devnull return(p);
340 b6d98463 2006-04-14 devnull }
341 b6d98463 2006-04-14 devnull ERROR "there is no %dth last", n WARNING;
342 b6d98463 2006-04-14 devnull return(NULL);
343 b6d98463 2006-04-14 devnull }
344 b6d98463 2006-04-14 devnull
345 b6d98463 2006-04-14 devnull obj*
346 b6d98463 2006-04-14 devnull getfirst(int n, int t) /* find n-th occurrence of type t */
347 b6d98463 2006-04-14 devnull {
348 b6d98463 2006-04-14 devnull int i, k;
349 b6d98463 2006-04-14 devnull obj *p;
350 b6d98463 2006-04-14 devnull
351 b6d98463 2006-04-14 devnull k = n;
352 b6d98463 2006-04-14 devnull for (i = 0; i < nobj; i++) {
353 b6d98463 2006-04-14 devnull p = objlist[i];
354 b6d98463 2006-04-14 devnull if (p->o_type == BLOCK && t != BLOCK) { /* skip whole block */
355 b6d98463 2006-04-14 devnull i = p->o_val[5] + 1;
356 b6d98463 2006-04-14 devnull continue;
357 b6d98463 2006-04-14 devnull }
358 b6d98463 2006-04-14 devnull if (p->o_type != t)
359 b6d98463 2006-04-14 devnull continue;
360 b6d98463 2006-04-14 devnull if (--k > 0)
361 b6d98463 2006-04-14 devnull continue; /* not there yet */
362 b6d98463 2006-04-14 devnull dprintf("got a first of x,y= %g,%g\n", p->o_x, p->o_y);
363 b6d98463 2006-04-14 devnull return(p);
364 b6d98463 2006-04-14 devnull }
365 b6d98463 2006-04-14 devnull ERROR "there is no %dth ", n WARNING;
366 b6d98463 2006-04-14 devnull return(NULL);
367 b6d98463 2006-04-14 devnull }
368 b6d98463 2006-04-14 devnull
369 b6d98463 2006-04-14 devnull double
370 b6d98463 2006-04-14 devnull getblkvar(obj *p, char *s) /* find variable s2 in block p */
371 b6d98463 2006-04-14 devnull {
372 90a99688 2006-04-14 devnull YYSTYPE y;
373 b6d98463 2006-04-14 devnull
374 b6d98463 2006-04-14 devnull y = getblk(p, s);
375 b6d98463 2006-04-14 devnull return y.f;
376 b6d98463 2006-04-14 devnull }
377 b6d98463 2006-04-14 devnull
378 b6d98463 2006-04-14 devnull obj*
379 b6d98463 2006-04-14 devnull getblock(obj *p, char *s) /* find variable s in block p */
380 b6d98463 2006-04-14 devnull {
381 90a99688 2006-04-14 devnull YYSTYPE y;
382 b6d98463 2006-04-14 devnull
383 b6d98463 2006-04-14 devnull y = getblk(p, s);
384 b6d98463 2006-04-14 devnull return y.o;
385 b6d98463 2006-04-14 devnull }
386 b6d98463 2006-04-14 devnull
387 b6d98463 2006-04-14 devnull YYSTYPE
388 b6d98463 2006-04-14 devnull getblk(obj *p, char *s) /* find union type for s in p */
389 b6d98463 2006-04-14 devnull {
390 b6d98463 2006-04-14 devnull static YYSTYPE bug;
391 b6d98463 2006-04-14 devnull struct symtab *stp;
392 b6d98463 2006-04-14 devnull
393 b6d98463 2006-04-14 devnull if (p->o_type != BLOCK) {
394 b6d98463 2006-04-14 devnull ERROR ".%s is not in that block", s WARNING;
395 b6d98463 2006-04-14 devnull return(bug);
396 b6d98463 2006-04-14 devnull }
397 b6d98463 2006-04-14 devnull for (stp = p->o_symtab; stp != NULL; stp = stp->s_next)
398 b6d98463 2006-04-14 devnull if (strcmp(s, stp->s_name) == 0) {
399 b6d98463 2006-04-14 devnull dprintf("getblk %s found x,y= %g,%g\n",
400 b6d98463 2006-04-14 devnull s, (stp->s_val.o)->o_x, (stp->s_val.o)->o_y);
401 b6d98463 2006-04-14 devnull return(stp->s_val);
402 b6d98463 2006-04-14 devnull }
403 b6d98463 2006-04-14 devnull ERROR "there is no .%s in that []", s WARNING;
404 b6d98463 2006-04-14 devnull return(bug);
405 b6d98463 2006-04-14 devnull }
406 b6d98463 2006-04-14 devnull
407 b6d98463 2006-04-14 devnull obj*
408 b6d98463 2006-04-14 devnull fixpos(obj *p, double x, double y)
409 b6d98463 2006-04-14 devnull {
410 b6d98463 2006-04-14 devnull dprintf("fixpos returns %g %g\n", p->o_x + x, p->o_y + y);
411 b6d98463 2006-04-14 devnull return makepos(p->o_x + x, p->o_y + y);
412 b6d98463 2006-04-14 devnull }
413 b6d98463 2006-04-14 devnull
414 b6d98463 2006-04-14 devnull obj*
415 b6d98463 2006-04-14 devnull addpos(obj *p, obj *q)
416 b6d98463 2006-04-14 devnull {
417 b6d98463 2006-04-14 devnull dprintf("addpos returns %g %g\n", p->o_x+q->o_x, p->o_y+q->o_y);
418 b6d98463 2006-04-14 devnull return makepos(p->o_x+q->o_x, p->o_y+q->o_y);
419 b6d98463 2006-04-14 devnull }
420 b6d98463 2006-04-14 devnull
421 b6d98463 2006-04-14 devnull obj*
422 b6d98463 2006-04-14 devnull subpos(obj *p, obj *q)
423 b6d98463 2006-04-14 devnull {
424 b6d98463 2006-04-14 devnull dprintf("subpos returns %g %g\n", p->o_x-q->o_x, p->o_y-q->o_y);
425 b6d98463 2006-04-14 devnull return makepos(p->o_x-q->o_x, p->o_y-q->o_y);
426 b6d98463 2006-04-14 devnull }
427 b6d98463 2006-04-14 devnull
428 b6d98463 2006-04-14 devnull obj*
429 b6d98463 2006-04-14 devnull makenode(int type, int n)
430 b6d98463 2006-04-14 devnull {
431 b6d98463 2006-04-14 devnull obj *p;
432 b6d98463 2006-04-14 devnull
433 b6d98463 2006-04-14 devnull p = (obj *) calloc(1, sizeof(obj) + (n-1)*sizeof(ofloat));
434 b6d98463 2006-04-14 devnull if (p == NULL)
435 b6d98463 2006-04-14 devnull ERROR "out of space in makenode" FATAL;
436 b6d98463 2006-04-14 devnull p->o_type = type;
437 b6d98463 2006-04-14 devnull p->o_count = n;
438 b6d98463 2006-04-14 devnull p->o_nobj = nobj;
439 b6d98463 2006-04-14 devnull p->o_mode = hvmode;
440 b6d98463 2006-04-14 devnull p->o_x = curx;
441 b6d98463 2006-04-14 devnull p->o_y = cury;
442 b6d98463 2006-04-14 devnull p->o_nt1 = ntext1;
443 b6d98463 2006-04-14 devnull p->o_nt2 = ntext;
444 b6d98463 2006-04-14 devnull ntext1 = ntext; /* ready for next caller */
445 b6d98463 2006-04-14 devnull if (nobj >= nobjlist)
446 b6d98463 2006-04-14 devnull objlist = (obj **) grow((char *) objlist, "objlist",
447 b6d98463 2006-04-14 devnull nobjlist *= 2, sizeof(obj *));
448 b6d98463 2006-04-14 devnull objlist[nobj++] = p;
449 b6d98463 2006-04-14 devnull return(p);
450 b6d98463 2006-04-14 devnull }
451 b6d98463 2006-04-14 devnull
452 b6d98463 2006-04-14 devnull void
453 b6d98463 2006-04-14 devnull extreme(double x, double y) /* record max and min x and y values */
454 b6d98463 2006-04-14 devnull {
455 b6d98463 2006-04-14 devnull if (x > xmax)
456 b6d98463 2006-04-14 devnull xmax = x;
457 b6d98463 2006-04-14 devnull if (y > ymax)
458 b6d98463 2006-04-14 devnull ymax = y;
459 b6d98463 2006-04-14 devnull if (x < xmin)
460 b6d98463 2006-04-14 devnull xmin = x;
461 b6d98463 2006-04-14 devnull if (y < ymin)
462 b6d98463 2006-04-14 devnull ymin = y;
463 b6d98463 2006-04-14 devnull }