Blame


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