|
|
1.1 root 1: #include "ideal.h"
2: #include "y.tab.h"
3:
4: LINEPTR rbuild (noadtree, linelist)
5: NOADPTR noadtree;
6: LINEPTR linelist;
7: {
8: STMTPTR slist[2];
9: STMTPTR curstmt, opqstmt;
10: NOADPTR nextnoad;
11: int i;
12: slist[0] = noadtree->defnode->parm->stmtlist;
13: slist[1] = findbox (noadtree->defnode->parm->name,FALSE)->stmtlist;
14: nextnoad = noadtree->son;
15: if ((opqstmt = nextstmt (OPAQUE, slist[0])) || (opqstmt = nextstmt (OPAQUE, slist[1])))
16: linelist = opqact (opqstmt, noadtree, linelist);
17: if (noadtree->defnode->parm->name == lookup ("circle"))
18: linelist = circact (noadtree, linelist);
19: else if (noadtree->defnode->parm->name == lookup ("arc"))
20: linelist = arcact (noadtree, linelist);
21: for (i = 0; i < 2; i ++)
22: for (curstmt = slist[i]; curstmt; curstmt = curstmt->next) {
23: switch (curstmt->kind) {
24: case '=':
25: break;
26: case CONN:
27: linelist = connact (
28: (EXPRPTR) curstmt->stmt,
29: noadtree,
30: linelist
31: );
32: break;
33: case USING:
34: linelist = penact (
35: (PENPTR) curstmt->stmt,
36: noadtree,
37: linelist
38: );
39: break;
40: case PUT:
41: if (((PUTPTR)curstmt->stmt)->p_or_c == PUT)
42: linelist = rbuild (nextnoad, linelist);
43: else if (((PUTPTR)curstmt->stmt)->p_or_c == CONSTRUCT)
44: nextnoad->linelist = rbuild (nextnoad, nextnoad->linelist);
45: else impossible ("rbuild (PUT)");
46: nextnoad = nextnoad->brother;
47: break;
48: case DRAW:
49: linelist = drawact (
50: (MISCPTR) curstmt->stmt,
51: noadtree,
52: linelist
53: );
54: break;
55: case STRING:
56: linelist = stract (
57: (STRPTR) curstmt->stmt,
58: noadtree,
59: linelist
60: );
61: break;
62: case SPLINE:
63: linelist = splact (
64: (EXPRPTR) curstmt->stmt,
65: noadtree,
66: linelist
67: );
68: break;
69: case OPAQUE:
70: break;
71: case BDLIST:
72: break;
73: case VAR:
74: break;
75: default:
76: impossible ("rbuild");
77: }
78: }
79: return (linelist);
80: }
81:
82: LINEPTR build (noadtree, linelist)
83: NOADPTR noadtree;
84: LINEPTR linelist;
85: {
86: LINEPTR retval;
87: if (when_bug & 040) bug_on;
88: retval = rbuild (noadtree, linelist);
89: bug_off;
90: return (retval);
91: }
92:
93: LINEPTR connact (connstmt, noadtree, linelist)
94: EXPRPTR connstmt;
95: NOADPTR noadtree;
96: LINEPTR linelist;
97: {
98: INTLPTR frompt, topt;
99: LINEPTR newline;
100: EXPRPTR linwalk;
101: newline = NULL;
102: frompt = expreval (connstmt->expr, noadtree);
103: linwalk = connstmt->next;
104: while (linwalk) {
105: topt = expreval (linwalk->expr, noadtree);
106: if (!known(frompt) || !known(topt)) {
107: fprintf (stderr, "ideal: indeterminate endpoints\n >>>conn ignored\n");
108: } else {
109: newline = linegen (
110: Re(frompt), Im(frompt),
111: Re(topt), Im(topt)
112: );
113: dprintf "Adding line (%f,%f) to (%f,%f)\n",
114: Re(frompt), Im(frompt),
115: Re(topt), Im(topt)
116: );
117: newline->next = linelist;
118: linelist = newline;
119: }
120: intlfree (frompt);
121: frompt = topt;
122: linwalk = linwalk->next;
123: }
124: intlfree (topt);
125: return (newline);
126: }
127:
128: LINEPTR penact (penstmt, noadtree, linelist)
129: PENPTR penstmt;
130: NOADPTR noadtree;
131: LINEPTR linelist;
132: {
133: INTLPTR frompt, topt, copies;
134: LINEPTR newline;
135: frompt = expreval (penstmt->from, noadtree);
136: topt = expreval (penstmt->to, noadtree);
137: copies = expreval (penstmt->copies, noadtree);
138: newline = linelist;
139: if (!known(frompt) || !known(topt) || !known(copies)) {
140: fprintf (stderr, "ideal: indeterminate pen\n >>>pen ignored\n");
141: } else {
142: PUTNODE dummyput;
143: NOADPTR pennoad;
144: STMTPTR ostmthead;
145: int i;
146:
147: dprintf "Drawing pen from (%f,%f) to (%f,%f)\n",
148: Re(frompt),
149: Im(frompt),
150: Re(topt),
151: Im(topt)
152: );
153:
154: /* add key statements to beginning of parameter section */
155: dummyput.name = 0;
156: dummyput.parm = penstmt->pen;
157: ostmthead = dummyput.parm->stmtlist;
158: dummyput.parm->stmtlist = stmtgen (
159: '=',
160: (char *) intlgen (
161: '=',
162: (EXPR) extlgen (namegen (lookup ("$pencnt"))),
163: (EXPR) fextlgen (0.0)
164: )
165: );
166: dummyput.parm->stmtlist->next = stmtgen (
167: '=',
168: (char *) intlgen (
169: '=',
170: penstmt->start,
171: bracket (
172: (EXPR) intlgen (
173: '/',
174: (EXPR) extlgen(namegen(lookup("$pencnt"))),
175: (EXPR) copies
176: ),
177: (EXPR) frompt,
178: (EXPR) topt
179: )
180: )
181: );
182: dummyput.parm->stmtlist->next->next = stmtgen (
183: '=',
184: (char *) intlgen (
185: '=',
186: penstmt->end,
187: bracket (
188: (EXPR) intlgen (
189: '/',
190: (EXPR) intlgen (
191: '+',
192: (EXPR) extlgen(namegen(lookup("$pencnt"))),
193: (EXPR) fextlgen(1.0)
194: ),
195: (EXPR) copies
196: ),
197: (EXPR) frompt,
198: (EXPR) topt
199: )
200: )
201: );
202: dummyput.parm->stmtlist->next->next->next = stmtgen (
203: VAR,
204: (char *) namegen (lookup ("$pencnt"))
205: );
206: dummyput.parm->stmtlist->next->next->next->next = ostmthead;
207: /* make N copies */
208: for (i = 0; i < Re(copies); i ++) {
209: ((EXTLPTR) ((INTLPTR) dummyput.parm->stmtlist->stmt)->right)->info.const = i;
210: pennoad = buildnoadtree (&dummyput);
211: pennoad->father = noadtree;
212: eqneval (pennoad);
213: nl_eval ();
214: newline = build (pennoad, newline);
215: depvarkill ();
216: noadfree (pennoad);
217: }
218: if (dummyput.parm->stmtlist->next->next->next->next != ostmthead)
219: impossible ("penact");
220: dummyput.parm->stmtlist->next->next->next->next = NULL;
221: /* will have to let garbage collector get dummyput.parm */
222: penstmt->pen->stmtlist = ostmthead;
223: }
224: intlfree (frompt);
225: intlfree (topt);
226: intlfree (copies);
227: return (newline);
228: }
229:
230: LINEPTR drawact (noadname, noadtree, linelist)
231: MISCPTR noadname;
232: NOADPTR noadtree;
233: LINEPTR linelist;
234: {
235: NOADPTR noadwalk;
236: LINEPTR nuline;
237: for (noadwalk = noadtree->son;
238: noadwalk && (noadwalk->defnode->name != noadname->info);
239: noadwalk = noadwalk->brother)
240: dprintf "%s %s",
241: idprint(noadwalk->defnode->name),
242: idprint(noadname->info)
243: );
244: ;
245: if (noadwalk) {
246: ((LINEPTR) tail ((BOXPTR) noadwalk->linelist))->next = linelist;
247: nuline = noadwalk->linelist;
248: noadwalk->linelist = NULL;
249: return (nuline);
250:
251: } else {
252: fprintf (stderr, "ideal: can't find %s to draw it\n",
253: idprint (noadname->info)
254: );
255: return (linelist);
256: }
257: }
258:
259: LINEPTR stract (strstmt, noadtree, linelist)
260: STRPTR strstmt;
261: NOADPTR noadtree;
262: LINEPTR linelist;
263: {
264: LINEPTR newline;
265: INTLPTR atpt;
266: atpt = expreval (strstmt->at, noadtree);
267: if (!known(atpt)){
268: fprintf (stderr, "ideal: indeterminate string location\n >>>string ignored\n");
269: newline = linelist;
270: } else {
271: dprintf "Adding string %s\n",
272: strstmt->string);
273: newline = textgen (
274: strstmt->command,
275: strstmt->string,
276: Re(atpt),
277: Im(atpt)
278: );
279: newline->next = linelist;
280: }
281: intlfree (atpt);
282: return (newline);
283: }
284:
285: LINEPTR circact (noadtree, linelist)
286: NOADPTR noadtree;
287: LINEPTR linelist;
288: {
289: LINEPTR newline;
290: INTLPTR radius, center;
291: radius = varfind (lookup ("radius"), noadtree);
292: center = varfind (lookup ("center"), noadtree);
293: if (!known(radius) || !known(center)) {
294: fprintf (stderr, "ideal: indeterminate circle\n >>>ignored\n");
295: newline = linelist;
296: } else {
297: float rad;
298: rad = Re(radius);
299: dprintf "Adding circle %f %f %f\n",
300: Re(center),
301: Im(center),
302: rad
303: );
304: newline = circgen (
305: Re(center),
306: Im(center),
307: rad
308: );
309: newline->next = linelist;
310: }
311: intlfree (radius);
312: intlfree (center);
313: return (newline);
314: }
315:
316: LINEPTR arcact (noadtree, linelist)
317: NOADPTR noadtree;
318: LINEPTR linelist;
319: {
320: LINEPTR newline;
321: INTLPTR start, center, end;
322: INTLPTR temp;
323: float radius;
324: float startang, midang, endang;
325: center = varfind (lookup ("center"), noadtree);
326: start = varfind (lookup ("start"), noadtree);
327: end = varfind (lookup ("end"), noadtree);
328: temp = varfind (lookup ("startang"), noadtree);
329: startang = Re(temp);
330: tryfree(temp);
331: temp = varfind (lookup ("midang"), noadtree);
332: midang = Re(temp);
333: tryfree(temp);
334: temp = varfind (lookup ("endang"), noadtree);
335: endang = Re(temp);
336: tryfree(temp);
337: if (!radflag) {
338: dtor(startang);
339: dtor(midang);
340: dtor(endang);
341: }
342: startang = rprin (startang);
343: midang = rprin (midang);
344: endang = rprin (endang);
345: if ((fabs(startang - midang) < EPSILON) && (startang > endang))
346: endang += 2*PI;
347: radius = ((DEPPTR) (varfind (lookup ("radius"), noadtree))->left)->coeff;
348: if (!known(center) || !known(start) || !known(end)) {
349: fprintf (stderr, "ideal: indeterminate arc\n >>>ignored\n");
350: newline = linelist;
351: } else {
352: angorder (&startang, midang, &endang);
353: dprintf "Adding arc %f %f %f %f %f\n",
354: Re(center),
355: Im(center),
356: radius,
357: startang,
358: endang
359: );
360: newline = angularc (
361: Re(center),
362: Im(center),
363: radius,
364: startang,
365: endang
366: );
367: newline->next = linelist;
368: }
369: intlfree (center);
370: intlfree (start);
371: intlfree (end);
372: return (newline);
373: }
374:
375: LINEPTR splact (splstmt, noadtree, linelist)
376: EXPRPTR splstmt;
377: NOADPTR noadtree;
378: LINEPTR linelist;
379: {
380: EXPRNODE knotlist;
381: EXPRPTR knotwalk;
382: EXPRPTR splwalk;
383: LINEPTR nuline;
384:
385: if (when_bug & 0200) bug_on;
386: knotwalk = &knotlist;
387: knotwalk->next = NULL;
388: for (splwalk = splstmt;
389: splwalk;
390: splwalk = splwalk->next
391: ) {
392: knotwalk->next = exprgen (
393: (EXPR) expreval (
394: splwalk->expr,
395: noadtree
396: )
397: );
398: if (!known(((INTLPTR) knotwalk->next->expr))) {
399: fprintf (stderr, "ideal: unknown spline knot\n >>>spline ignored\n");
400: return (linelist);
401: }
402: knotwalk = knotwalk->next;
403: dprintf "spline knot: %f %f\n",
404: Re(((INTLPTR) knotwalk->expr)),
405: Im(((INTLPTR) knotwalk->expr))
406: );
407: }
408: nuline = splgen (knotlist.next);
409: nuline->next = linelist;
410: return (nuline);
411: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.