Blame


1 3ebbd193 2017-06-19 rsc #include <stdio.h>
2 3ebbd193 2017-06-19 rsc #include <stdlib.h>
3 3ebbd193 2017-06-19 rsc #include "pic.h"
4 3ebbd193 2017-06-19 rsc #include "y.tab.h"
5 3ebbd193 2017-06-19 rsc
6 3ebbd193 2017-06-19 rsc #define NBRACK 20 /* depth of [...] */
7 3ebbd193 2017-06-19 rsc #define NBRACE 20 /* depth of {...} */
8 3ebbd193 2017-06-19 rsc
9 3ebbd193 2017-06-19 rsc struct pushstack stack[NBRACK];
10 3ebbd193 2017-06-19 rsc int nstack = 0;
11 3ebbd193 2017-06-19 rsc struct pushstack bracestack[NBRACE];
12 3ebbd193 2017-06-19 rsc int nbstack = 0;
13 3ebbd193 2017-06-19 rsc
14 3ebbd193 2017-06-19 rsc void blockadj(obj *);
15 3ebbd193 2017-06-19 rsc
16 3ebbd193 2017-06-19 rsc obj *leftthing(int c) /* called for {... or [... */
17 3ebbd193 2017-06-19 rsc /* really ought to be separate functions */
18 3ebbd193 2017-06-19 rsc {
19 3ebbd193 2017-06-19 rsc obj *p;
20 3ebbd193 2017-06-19 rsc
21 3ebbd193 2017-06-19 rsc if (c == '[') {
22 3ebbd193 2017-06-19 rsc if (nstack >= NBRACK)
23 3ebbd193 2017-06-19 rsc ERROR "[...] nested too deep" FATAL;
24 3ebbd193 2017-06-19 rsc stack[nstack].p_x = curx;
25 3ebbd193 2017-06-19 rsc stack[nstack].p_y = cury;
26 3ebbd193 2017-06-19 rsc stack[nstack].p_hvmode = hvmode;
27 3ebbd193 2017-06-19 rsc curx = cury = 0;
28 3ebbd193 2017-06-19 rsc stack[nstack].p_xmin = xmin;
29 3ebbd193 2017-06-19 rsc stack[nstack].p_xmax = xmax;
30 3ebbd193 2017-06-19 rsc stack[nstack].p_ymin = ymin;
31 3ebbd193 2017-06-19 rsc stack[nstack].p_ymax = ymax;
32 3ebbd193 2017-06-19 rsc nstack++;
33 3ebbd193 2017-06-19 rsc xmin = ymin = 30000;
34 3ebbd193 2017-06-19 rsc xmax = ymax = -30000;
35 3ebbd193 2017-06-19 rsc p = makenode(BLOCK, 7);
36 3ebbd193 2017-06-19 rsc p->o_val[4] = nobj; /* 1st item within [...] */
37 3ebbd193 2017-06-19 rsc if (p->o_nobj != nobj-1)
38 3ebbd193 2017-06-19 rsc fprintf(stderr, "nobjs wrong%d %d\n", p->o_nobj, nobj);
39 3ebbd193 2017-06-19 rsc } else {
40 3ebbd193 2017-06-19 rsc if (nbstack >= NBRACK)
41 3ebbd193 2017-06-19 rsc ERROR "{...} nested too deep" FATAL;
42 3ebbd193 2017-06-19 rsc bracestack[nbstack].p_x = curx;
43 3ebbd193 2017-06-19 rsc bracestack[nbstack].p_y = cury;
44 3ebbd193 2017-06-19 rsc bracestack[nbstack].p_hvmode = hvmode;
45 3ebbd193 2017-06-19 rsc nbstack++;
46 3ebbd193 2017-06-19 rsc p = NULL;
47 3ebbd193 2017-06-19 rsc }
48 3ebbd193 2017-06-19 rsc return(p);
49 3ebbd193 2017-06-19 rsc }
50 3ebbd193 2017-06-19 rsc
51 3ebbd193 2017-06-19 rsc obj *rightthing(obj *p, int c) /* called for ... ] or ... } */
52 3ebbd193 2017-06-19 rsc {
53 3ebbd193 2017-06-19 rsc obj *q;
54 3ebbd193 2017-06-19 rsc
55 3ebbd193 2017-06-19 rsc if (c == '}') {
56 3ebbd193 2017-06-19 rsc nbstack--;
57 3ebbd193 2017-06-19 rsc curx = bracestack[nbstack].p_x;
58 3ebbd193 2017-06-19 rsc cury = bracestack[nbstack].p_y;
59 3ebbd193 2017-06-19 rsc hvmode = bracestack[nbstack].p_hvmode;
60 3ebbd193 2017-06-19 rsc q = makenode(MOVE, 0);
61 3ebbd193 2017-06-19 rsc dprintf("M %g %g\n", curx, cury);
62 3ebbd193 2017-06-19 rsc } else {
63 3ebbd193 2017-06-19 rsc nstack--;
64 3ebbd193 2017-06-19 rsc curx = stack[nstack].p_x;
65 3ebbd193 2017-06-19 rsc cury = stack[nstack].p_y;
66 3ebbd193 2017-06-19 rsc hvmode = stack[nstack].p_hvmode;
67 3ebbd193 2017-06-19 rsc q = makenode(BLOCKEND, 7);
68 3ebbd193 2017-06-19 rsc q->o_val[4] = p->o_nobj + 1; /* back pointer */
69 3ebbd193 2017-06-19 rsc p->o_val[5] = q->o_nobj - 1; /* forward pointer */
70 3ebbd193 2017-06-19 rsc if (xmin > xmax) /* nothing happened */
71 3ebbd193 2017-06-19 rsc xmin = xmax;
72 3ebbd193 2017-06-19 rsc if (ymin > ymax)
73 3ebbd193 2017-06-19 rsc ymin = ymax;
74 3ebbd193 2017-06-19 rsc p->o_val[0] = xmin; p->o_val[1] = ymin;
75 3ebbd193 2017-06-19 rsc p->o_val[2] = xmax; p->o_val[3] = ymax;
76 3ebbd193 2017-06-19 rsc p->o_symtab = q->o_symtab = stack[nstack+1].p_symtab;
77 3ebbd193 2017-06-19 rsc xmin = stack[nstack].p_xmin;
78 3ebbd193 2017-06-19 rsc ymin = stack[nstack].p_ymin;
79 3ebbd193 2017-06-19 rsc xmax = stack[nstack].p_xmax;
80 3ebbd193 2017-06-19 rsc ymax = stack[nstack].p_ymax;
81 3ebbd193 2017-06-19 rsc }
82 3ebbd193 2017-06-19 rsc return(q);
83 3ebbd193 2017-06-19 rsc }
84 3ebbd193 2017-06-19 rsc
85 3ebbd193 2017-06-19 rsc obj *blockgen(obj *p, obj *q) /* handles [...] */
86 3ebbd193 2017-06-19 rsc {
87 3ebbd193 2017-06-19 rsc int i, invis, at, with;
88 3ebbd193 2017-06-19 rsc double ddval, h, w, xwith, ywith;
89 3ebbd193 2017-06-19 rsc double x0, y0, x1, y1, cx, cy;
90 3ebbd193 2017-06-19 rsc obj *ppos;
91 3ebbd193 2017-06-19 rsc Attr *ap;
92 3ebbd193 2017-06-19 rsc
93 3ebbd193 2017-06-19 rsc invis = at = 0;
94 3ebbd193 2017-06-19 rsc with = xwith = ywith = 0;
95 3ebbd193 2017-06-19 rsc ddval = 0;
96 3ebbd193 2017-06-19 rsc w = p->o_val[2] - p->o_val[0];
97 3ebbd193 2017-06-19 rsc h = p->o_val[3] - p->o_val[1];
98 3ebbd193 2017-06-19 rsc cx = (p->o_val[2] + p->o_val[0]) / 2; /* geom ctr of [] wrt local orogin */
99 3ebbd193 2017-06-19 rsc cy = (p->o_val[3] + p->o_val[1]) / 2;
100 3ebbd193 2017-06-19 rsc dprintf("cx,cy=%g,%g\n", cx, cy);
101 3ebbd193 2017-06-19 rsc for (i = 0; i < nattr; i++) {
102 3ebbd193 2017-06-19 rsc ap = &attr[i];
103 3ebbd193 2017-06-19 rsc switch (ap->a_type) {
104 3ebbd193 2017-06-19 rsc case HEIGHT:
105 3ebbd193 2017-06-19 rsc h = ap->a_val.f;
106 3ebbd193 2017-06-19 rsc break;
107 3ebbd193 2017-06-19 rsc case WIDTH:
108 3ebbd193 2017-06-19 rsc w = ap->a_val.f;
109 3ebbd193 2017-06-19 rsc break;
110 3ebbd193 2017-06-19 rsc case WITH:
111 3ebbd193 2017-06-19 rsc with = ap->a_val.i; /* corner */
112 3ebbd193 2017-06-19 rsc break;
113 3ebbd193 2017-06-19 rsc case PLACE: /* actually with position ... */
114 3ebbd193 2017-06-19 rsc ppos = ap->a_val.o;
115 3ebbd193 2017-06-19 rsc xwith = cx - ppos->o_x;
116 3ebbd193 2017-06-19 rsc ywith = cy - ppos->o_y;
117 3ebbd193 2017-06-19 rsc with = PLACE;
118 3ebbd193 2017-06-19 rsc break;
119 3ebbd193 2017-06-19 rsc case AT:
120 3ebbd193 2017-06-19 rsc case FROM:
121 3ebbd193 2017-06-19 rsc ppos = ap->a_val.o;
122 3ebbd193 2017-06-19 rsc curx = ppos->o_x;
123 3ebbd193 2017-06-19 rsc cury = ppos->o_y;
124 3ebbd193 2017-06-19 rsc at++;
125 3ebbd193 2017-06-19 rsc break;
126 3ebbd193 2017-06-19 rsc case INVIS:
127 3ebbd193 2017-06-19 rsc invis = INVIS;
128 3ebbd193 2017-06-19 rsc break;
129 3ebbd193 2017-06-19 rsc case TEXTATTR:
130 3ebbd193 2017-06-19 rsc savetext(ap->a_sub, ap->a_val.p);
131 3ebbd193 2017-06-19 rsc break;
132 3ebbd193 2017-06-19 rsc }
133 3ebbd193 2017-06-19 rsc }
134 3ebbd193 2017-06-19 rsc if (with) {
135 3ebbd193 2017-06-19 rsc switch (with) {
136 3ebbd193 2017-06-19 rsc case NORTH: ywith = -h / 2; break;
137 3ebbd193 2017-06-19 rsc case SOUTH: ywith = h / 2; break;
138 3ebbd193 2017-06-19 rsc case EAST: xwith = -w / 2; break;
139 3ebbd193 2017-06-19 rsc case WEST: xwith = w / 2; break;
140 3ebbd193 2017-06-19 rsc case NE: xwith = -w / 2; ywith = -h / 2; break;
141 3ebbd193 2017-06-19 rsc case SE: xwith = -w / 2; ywith = h / 2; break;
142 3ebbd193 2017-06-19 rsc case NW: xwith = w / 2; ywith = -h / 2; break;
143 3ebbd193 2017-06-19 rsc case SW: xwith = w / 2; ywith = h / 2; break;
144 3ebbd193 2017-06-19 rsc }
145 3ebbd193 2017-06-19 rsc curx += xwith;
146 3ebbd193 2017-06-19 rsc cury += ywith;
147 3ebbd193 2017-06-19 rsc }
148 3ebbd193 2017-06-19 rsc if (!at) {
149 3ebbd193 2017-06-19 rsc if (isright(hvmode))
150 3ebbd193 2017-06-19 rsc curx += w / 2;
151 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
152 3ebbd193 2017-06-19 rsc curx -= w / 2;
153 3ebbd193 2017-06-19 rsc else if (isup(hvmode))
154 3ebbd193 2017-06-19 rsc cury += h / 2;
155 3ebbd193 2017-06-19 rsc else
156 3ebbd193 2017-06-19 rsc cury -= h / 2;
157 3ebbd193 2017-06-19 rsc }
158 3ebbd193 2017-06-19 rsc x0 = curx - w / 2;
159 3ebbd193 2017-06-19 rsc y0 = cury - h / 2;
160 3ebbd193 2017-06-19 rsc x1 = curx + w / 2;
161 3ebbd193 2017-06-19 rsc y1 = cury + h / 2;
162 3ebbd193 2017-06-19 rsc extreme(x0, y0);
163 3ebbd193 2017-06-19 rsc extreme(x1, y1);
164 3ebbd193 2017-06-19 rsc p->o_x = curx;
165 3ebbd193 2017-06-19 rsc p->o_y = cury;
166 3ebbd193 2017-06-19 rsc p->o_nt1 = ntext1;
167 3ebbd193 2017-06-19 rsc p->o_nt2 = ntext;
168 3ebbd193 2017-06-19 rsc ntext1 = ntext;
169 3ebbd193 2017-06-19 rsc p->o_val[0] = w;
170 3ebbd193 2017-06-19 rsc p->o_val[1] = h;
171 3ebbd193 2017-06-19 rsc p->o_val[2] = cx;
172 3ebbd193 2017-06-19 rsc p->o_val[3] = cy;
173 3ebbd193 2017-06-19 rsc p->o_val[5] = q->o_nobj - 1; /* last item in [...] */
174 3ebbd193 2017-06-19 rsc p->o_ddval = ddval;
175 3ebbd193 2017-06-19 rsc p->o_attr = invis;
176 3ebbd193 2017-06-19 rsc dprintf("[] %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w);
177 3ebbd193 2017-06-19 rsc if (isright(hvmode))
178 3ebbd193 2017-06-19 rsc curx = x1;
179 3ebbd193 2017-06-19 rsc else if (isleft(hvmode))
180 3ebbd193 2017-06-19 rsc curx = x0;
181 3ebbd193 2017-06-19 rsc else if (isup(hvmode))
182 3ebbd193 2017-06-19 rsc cury = y1;
183 3ebbd193 2017-06-19 rsc else
184 3ebbd193 2017-06-19 rsc cury = y0;
185 3ebbd193 2017-06-19 rsc for (i = 0; i <= 5; i++)
186 3ebbd193 2017-06-19 rsc q->o_val[i] = p->o_val[i];
187 3ebbd193 2017-06-19 rsc stack[nstack+1].p_symtab = NULL; /* so won't be found again */
188 3ebbd193 2017-06-19 rsc blockadj(p); /* fix up coords for enclosed blocks */
189 3ebbd193 2017-06-19 rsc return(p);
190 3ebbd193 2017-06-19 rsc }
191 3ebbd193 2017-06-19 rsc
192 3ebbd193 2017-06-19 rsc void blockadj(obj *p) /* adjust coords in block starting at p */
193 3ebbd193 2017-06-19 rsc {
194 3ebbd193 2017-06-19 rsc double dx, dy;
195 3ebbd193 2017-06-19 rsc int n, lev;
196 3ebbd193 2017-06-19 rsc
197 3ebbd193 2017-06-19 rsc dx = p->o_x - p->o_val[2];
198 3ebbd193 2017-06-19 rsc dy = p->o_y - p->o_val[3];
199 3ebbd193 2017-06-19 rsc n = p->o_nobj + 1;
200 3ebbd193 2017-06-19 rsc dprintf("into blockadj: dx,dy=%g,%g\n", dx, dy);
201 3ebbd193 2017-06-19 rsc for (lev = 1; lev > 0; n++) {
202 3ebbd193 2017-06-19 rsc p = objlist[n];
203 3ebbd193 2017-06-19 rsc if (p->o_type == BLOCK)
204 3ebbd193 2017-06-19 rsc lev++;
205 3ebbd193 2017-06-19 rsc else if (p->o_type == BLOCKEND)
206 3ebbd193 2017-06-19 rsc lev--;
207 3ebbd193 2017-06-19 rsc dprintf("blockadj: type=%d o_x,y=%g,%g;", p->o_type, p->o_x, p->o_y);
208 3ebbd193 2017-06-19 rsc p->o_x += dx;
209 3ebbd193 2017-06-19 rsc p->o_y += dy;
210 3ebbd193 2017-06-19 rsc dprintf(" becomes %g,%g\n", p->o_x, p->o_y);
211 3ebbd193 2017-06-19 rsc switch (p->o_type) { /* other absolute coords */
212 3ebbd193 2017-06-19 rsc case LINE:
213 3ebbd193 2017-06-19 rsc case ARROW:
214 3ebbd193 2017-06-19 rsc case SPLINE:
215 3ebbd193 2017-06-19 rsc p->o_val[0] += dx;
216 3ebbd193 2017-06-19 rsc p->o_val[1] += dy;
217 3ebbd193 2017-06-19 rsc break;
218 3ebbd193 2017-06-19 rsc case ARC:
219 3ebbd193 2017-06-19 rsc p->o_val[0] += dx;
220 3ebbd193 2017-06-19 rsc p->o_val[1] += dy;
221 3ebbd193 2017-06-19 rsc p->o_val[2] += dx;
222 3ebbd193 2017-06-19 rsc p->o_val[3] += dy;
223 3ebbd193 2017-06-19 rsc break;
224 3ebbd193 2017-06-19 rsc }
225 3ebbd193 2017-06-19 rsc }
226 3ebbd193 2017-06-19 rsc }