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