|
|
1.1 root 1: #include "ideal.h"
2: #include "y.tab.h"
3:
4: #define SYMSIZE 5000
5:
6: static char *symtab[SYMSIZE+1] = {
7: "(unnamed)"
8: };
9: static int syminstal = 1;
10:
11: int lookup(identifier)
12: char *identifier;
13: {
14: register int i;
15: i = 0;
16: symtab[syminstal] = identifier;
17: while (strcmp(identifier, symtab[i]))
18: i++;
19: if (i == syminstal) {
20: dprintf "installing NAME: %s\n", identifier);
21: if (i < SYMSIZE) {
22: if (!(symtab[i] = malloc((unsigned) (1+strlen(identifier))))) {
23: fprintf(stderr,"ideal: memory overflow in lookup\n");
24: exit(1);
25: }
26: }
27: else {
28: fprintf(stderr,"ideal: too many identifiers\n");
29: exit(1);
30: }
31: strcpy(symtab[syminstal++], identifier);
32: }
33: return(i);
34: }
35:
36: char *idprint(idnum)
37: int idnum;
38: {
39: if ((idnum > -1) && (idnum < syminstal))
40: return(symtab[idnum]);
41: else {
42: fprintf(stderr,"ideal: invalid identifier index: %d\n", idnum);
43: return(NULL);
44: }
45: }
46:
47: extern BOXPTR boxlist;
48:
49: BOXPTR findbox (sought, alarm)
50: int sought,
51: alarm;
52: {
53: BOXPTR bxwalk;
54: for (bxwalk = boxlist;
55: bxwalk && (bxwalk->name != sought);
56: bxwalk = bxwalk->next)
57: ;
58: if (!bxwalk) {
59: if (!alarm)
60: fprintf (stderr, "ideal: undefined box: %s\n", idprint (sought));
61: return (boxgen (sought, (STMTPTR) NULL));
62: } else
63: return (bxwalk);
64: }
65:
66:
67: INTLPTR varfind (name, givennoad)
68: int name;
69: NOADPTR givennoad;
70: {
71: /* finds simple variable 'name' from 'givennoad' */
72: register VARPTR varwalk;
73: if (!givennoad) {
74: fprintf (stderr, "ideal: no such variable, %s\n >>>Returning 0.0\n",
75: idprint (name)
76: );
77: return (commagen (0.0, 0.0));
78: }
79: dprintf "Looking for %s in %s\n", idprint (name), idprint (givennoad->defnode->name));
80: for (varwalk = givennoad->edgevarlist;
81: varwalk && THENAME(varwalk) != name;
82: varwalk = varwalk->next)
83: ;
84: if (!varwalk)
85: for (varwalk = givennoad->boxvarlist;
86: varwalk && THENAME(varwalk) != name;
87: varwalk = varwalk->next)
88: ;
89: if (!varwalk)
90: return (varfind (name, givennoad->father));
91: else
92: return (intlgen (
93: ';',
94: (EXPR) depadd ((DEPPTR) NULL, 0.0, varwalk->deplist, 1.0),
95: (EXPR) depadd ((DEPPTR) NULL, 0.0, varwalk->next->deplist, 1.0)
96: ));
97: }
98:
99: INTLPTR pathfind (ptname, givennoad)
100: NAMEPTR ptname;
101: NOADPTR givennoad;
102: {
103: /* finds compound variable 'ptname' from 'givennoad' */
104: int i;
105: STMTPTR putwalk;
106: NOADPTR noadwalk;
107: if (!ptname->next)
108: return (varfind (ptname->name, givennoad));
109: for (i = 0; i < 2; i++) {
110: noadwalk = givennoad->son;
111: for (putwalk = nextstmt (PUT, givennoad->defnode->parm->stmtlist);
112: putwalk && ((PUTPTR) putwalk->stmt)->name != ptname->name;
113: putwalk = nextstmt (PUT, putwalk->next))
114: noadwalk = noadwalk->brother;
115: if (!putwalk)
116: for (putwalk = nextstmt (PUT, findbox (givennoad->defnode->parm->name,FALSE)->stmtlist);
117: putwalk && ((PUTPTR) putwalk->stmt)->name != ptname->name;
118: putwalk = nextstmt (PUT, putwalk->next))
119: noadwalk = noadwalk->brother;
120: if (putwalk) {
121: dprintf "found %s, now looking for %s\n",
122: idprint (ptname->name),
123: idprint (ptname->next->name)
124: );
125: return (pathfind (ptname->next, noadwalk));
126: }
127: if (!(givennoad = givennoad->father)) {
128: dprintf "reached root of noad tree\n");
129: break;
130: } else {
131: dprintf "looking for %s at father of %s\n",
132: idprint (ptname->name),
133: idprint (givennoad->defnode->name)
134: );
135: }
136: }
137: fprintf (stderr, "ideal: invalid variable path name beginning %s\n >>>Returning 0.0\n",
138: idprint (ptname->name));
139: return (commagen (0.0, 0.0));
140: }
141:
142: BOXPTR tail (head)
143: BOXPTR head;
144: {
145: while (head->next)
146: head = head->next;
147: return (head);
148: }
149:
150: void forget (sought)
151: int sought;
152: {
153: BOXPTR bxwalk;
154: BOXPTR prevbox;
155: prevbox = NULL;
156: for (bxwalk = boxlist;
157: bxwalk && (bxwalk->name != sought);
158: bxwalk = bxwalk->next)
159: prevbox = bxwalk;
160: if (bxwalk) {
161: if (prevbox) {
162: prevbox->next = bxwalk->next;
163: } else {
164: boxlist = bxwalk->next;
165: }
166: boxfree (bxwalk);
167: }
168: }
169:
170: void exprprint (exprn)
171: EXPR exprn;
172: {
173: INTLPTR intl;
174: EXTLPTR extl;
175: if (!exprn)
176: return;
177: if (((EXTLPTR) exprn)->leaf) {
178: extl = (EXTLPTR) exprn;
179: switch (extl->kind) {
180: case PATH:
181: {
182: NAMEPTR pathwalk;
183: for (pathwalk = extl->info.path;
184: pathwalk->next;
185: pathwalk = pathwalk->next)
186: fprintf (stderr, "%s.", idprint (pathwalk->name));
187: fprintf (stderr, "%s", idprint (pathwalk->name));
188: }
189: break;
190: case CONST:
191: fprintf (stderr, "%f", extl->info.const);
192: break;
193: }
194: } else {
195: intl = (INTLPTR) exprn;
196: switch (intl->oper) {
197: case NAME:
198: fprintf (stderr, "%s(", idprint ((int) intl->left));
199: exprprint (((EXPRPTR) intl->right)->expr);
200: fprintf (stderr, ")");
201: break;
202: case '=':
203: case '~':
204: exprprint ((EXPR) intl->right);
205: break;
206: case ',':
207: fprintf (stderr, "(");
208: exprprint ((EXPR) intl->left);
209: fprintf (stderr, ",");
210: exprprint ((EXPR) intl->right);
211: fprintf (stderr, ")");
212: break;
213: case ';':
214: fprintf (stderr, "(");
215: depprint ((DEPPTR) intl->left);
216: fprintf (stderr, ",");
217: depprint ((DEPPTR) intl->right);
218: fprintf (stderr, ")");
219: break;
220: default:
221: fprintf (stderr, "(");
222: exprprint ((EXPR) intl->left);
223: fprintf (stderr, " %c ", intl->oper);
224: exprprint ((EXPR) intl->right);
225: fprintf (stderr, ")");
226: break;
227: }
228: }
229: }
230:
231: STMTPTR nextstmt (kind, curstmt)
232: int kind;
233: STMTPTR curstmt;
234: {
235: register STMTPTR stmtwalk;
236: stmtwalk = curstmt;
237: for (stmtwalk;
238: stmtwalk && (stmtwalk->kind != kind);
239: stmtwalk = stmtwalk->next)
240: ;
241: return (stmtwalk);
242: }
243:
244: EXPR bracket (alpha, x, y)
245: EXPR alpha,
246: x,
247: y;
248: {
249: return (
250: (EXPR) intlgen (
251: '+',
252: x,
253: (EXPR) intlgen (
254: '*',
255: alpha,
256: (EXPR) intlgen (
257: '-',
258: y,
259: x
260: )
261: )
262: )
263: );
264: }
265:
266: void depprint (depnd)
267: DEPPTR depnd;
268: {
269: for (depnd;
270: depnd->next;
271: depnd = depnd->next)
272: fprintf (stderr, "%f %s(%s) + ",
273: depnd->coeff,
274: ISREAL(depnd->var)?"re":"im",
275: idprint (THENAME(depnd->var))
276: );
277: fprintf (stderr, "%f", depnd->coeff);
278: if (depnd->var)
279: fprintf (stderr, " %s(%s)",
280: ISREAL(depnd->var)?"re":"im",
281: idprint (THENAME(depnd->var))
282: );
283: }
284:
285: void dexch (a,b)
286: double *a;
287: double *b;
288: {
289: double temp;
290: temp = *a;
291: *a = *b;
292: *b = temp;
293: }
294:
295: void fexch (a,b)
296: float *a;
297: float *b;
298: {
299: float temp;
300: temp = *a;
301: *a = *b;
302: *b = temp;
303: }
304:
305: float rprin (angle)
306: float angle;
307: {
308: while (angle < 0.0)
309: angle += 2*PI;
310: while (angle > 2*PI + EPSILON)
311: angle -= 2*PI;
312: return (angle);
313: }
314:
315: /*
316: float dprin (angle)
317: float angle;
318: {
319: while (angle < 0.0)
320: angle += 360;
321: while (angle > 2*PI)
322: angle -= 360;
323: return (angle);
324: }
325: */
326:
327: void angorder (startang, midang, endang)
328: float *startang;
329: float midang;
330: float *endang;
331: {
332: if (
333: ((*endang < -EPSILON + midang) && (midang < -EPSILON + *startang))
334: || ((*startang < -EPSILON + *endang) && (*endang < -EPSILON + midang))
335: || ((midang < -EPSILON + *startang) && (*startang < -EPSILON + *endang))
336: )
337: fexch (startang, endang);
338: }
339:
340: STMTPTR reverse (stmtlist)
341: STMTPTR stmtlist;
342: {
343: STMTPTR curstmt, prevstmt, temp;
344: prevstmt = curstmt = stmtlist;
345: temp = NULL;
346: while (curstmt) {
347: curstmt = prevstmt->next;
348: prevstmt->next = temp;
349: temp = prevstmt;
350: prevstmt = curstmt;
351: }
352: return (temp);
353: }
354:
355: void impossible (msg)
356: char *msg;
357: {
358: fprintf (stderr, "ideal: %s: can't happen\n", msg);
359: exit (1);
360: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.