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