V10/cmd/ideal/util.c

Compare this file to the similar file:
Show the results in this format:

#include "ideal.h"
#include "y.tab.h"

#define SYMSIZE	5000

static char *symtab[SYMSIZE+1]	= {
	"(unnamed)"
};
static int syminstal	= 1;

int lookup(identifier)
char *identifier;
{
	register int i;
	i = 0;
	symtab[syminstal] = identifier;
	while (strcmp(identifier, symtab[i]))
		i++;
	if (i == syminstal) {
		dprintf "installing NAME: %s\n", identifier);
		if (i < SYMSIZE) {
			if (!(symtab[i] = malloc((unsigned) (1+strlen(identifier))))) {
				fprintf(stderr,"ideal: memory overflow in lookup\n");
				exit(1);
			}
		}
		else {
			fprintf(stderr,"ideal: too many identifiers\n");
			exit(1);
		}
		strcpy(symtab[syminstal++], identifier);
	}
	return(i);
}

char *idprint(idnum)
int idnum;
{
	if ((idnum > -1) && (idnum < syminstal))
		return(symtab[idnum]);
	else {
		fprintf(stderr,"ideal: invalid identifier index: %d\n", idnum);
		return(NULL);
	}
}

extern BOXPTR boxlist;

BOXPTR findbox (sought, alarm)
int sought,
	alarm;
{
	BOXPTR bxwalk;
	for (bxwalk = boxlist;
		bxwalk && (bxwalk->name != sought);
		bxwalk = bxwalk->next)
		;
	if (!bxwalk) {
		if (!alarm)
			fprintf (stderr, "ideal: undefined box:  %s\n", idprint (sought));
		return (boxgen (sought, (STMTPTR) NULL));
	} else
		return (bxwalk);
}


INTLPTR varfind (name, givennoad)
int name;
NOADPTR givennoad;
{
	/* finds simple variable 'name' from 'givennoad' */
	register VARPTR varwalk;
	if (!givennoad) {
		fprintf (stderr, "ideal: no such variable, %s\n  >>>Returning 0.0\n",
			idprint (name)
		);
		return (commagen (0.0, 0.0));
	}
	dprintf "Looking for %s in %s\n", idprint (name), idprint (givennoad->defnode->name));
	for (varwalk = givennoad->edgevarlist;
		varwalk && THENAME(varwalk) != name;
		varwalk = varwalk->next)
		;
	if (!varwalk)
		for (varwalk = givennoad->boxvarlist;
			varwalk && THENAME(varwalk) != name;
			varwalk = varwalk->next)
			;
	if (!varwalk)
		return (varfind (name, givennoad->father));
	else
		return (intlgen (
			';',
			(EXPR) depadd ((DEPPTR) NULL, 0.0, varwalk->deplist, 1.0),
			(EXPR) depadd ((DEPPTR) NULL, 0.0, varwalk->next->deplist, 1.0)
			));
}

INTLPTR pathfind (ptname, givennoad)
NAMEPTR ptname;
NOADPTR givennoad;
{
	/* finds compound variable 'ptname' from 'givennoad' */
	int i;
	STMTPTR putwalk;
	NOADPTR noadwalk;
	if (!ptname->next)
		return (varfind (ptname->name, givennoad));
	for (i = 0; i < 2; i++) {
		noadwalk = givennoad->son;
		for (putwalk = nextstmt (PUT, givennoad->defnode->parm->stmtlist);
			putwalk && ((PUTPTR) putwalk->stmt)->name != ptname->name;
			putwalk = nextstmt (PUT, putwalk->next))
			noadwalk = noadwalk->brother;
		if (!putwalk)
			for (putwalk = nextstmt (PUT, findbox (givennoad->defnode->parm->name,FALSE)->stmtlist);
				putwalk && ((PUTPTR) putwalk->stmt)->name != ptname->name;
				putwalk = nextstmt (PUT, putwalk->next))
				noadwalk = noadwalk->brother;
		if (putwalk) {
			dprintf "found %s, now looking for %s\n",
				idprint (ptname->name),
				idprint (ptname->next->name)
			);
			return (pathfind (ptname->next, noadwalk));
		}
		if (!(givennoad = givennoad->father)) {
			dprintf "reached root of noad tree\n");
			break;
		} else {
			dprintf "looking for %s at father of %s\n",
				idprint (ptname->name),
				idprint (givennoad->defnode->name)
			);
		}
	}
	fprintf (stderr, "ideal: invalid variable path name beginning %s\n  >>>Returning 0.0\n",
		idprint (ptname->name));
	return (commagen (0.0, 0.0));
}

BOXPTR tail (head)
BOXPTR head;
{
	while (head->next)
		head = head->next;
	return (head);
}

void forget (sought)
int sought;
{
	BOXPTR bxwalk;
	BOXPTR prevbox;
	prevbox = NULL;
	for (bxwalk = boxlist;
		bxwalk && (bxwalk->name != sought);
		bxwalk = bxwalk->next)
		prevbox = bxwalk;
	if (bxwalk) {
		if (prevbox) {
			prevbox->next = bxwalk->next;
		} else {
			boxlist = bxwalk->next;
		}
		boxfree (bxwalk);
	}
}

void exprprint (exprn)
EXPR exprn;
{
	INTLPTR intl;
	EXTLPTR extl;
	if (!exprn)
		return;
	if (((EXTLPTR) exprn)->leaf) {
		extl = (EXTLPTR) exprn;
		switch (extl->kind) {
		case PATH:
			{
			NAMEPTR pathwalk;
			for (pathwalk = extl->info.path;
				pathwalk->next;
				pathwalk = pathwalk->next)
				fprintf (stderr, "%s.", idprint (pathwalk->name));
			fprintf (stderr, "%s", idprint (pathwalk->name));
			}
			break;
		case CONST:
			fprintf (stderr, "%f", extl->info.const);
			break;
		}
	} else {
		intl = (INTLPTR) exprn;
		switch (intl->oper) {
		case NAME:
			fprintf (stderr, "%s(", idprint ((int) intl->left));
			exprprint (((EXPRPTR) intl->right)->expr);
			fprintf (stderr, ")");
			break;
		case '=':
		case '~':
			exprprint ((EXPR) intl->right);
			break;
		case ',':
			fprintf (stderr, "(");
			exprprint ((EXPR) intl->left);
			fprintf (stderr, ",");
			exprprint ((EXPR) intl->right);
			fprintf (stderr, ")");
			break;
		case ';':
			fprintf (stderr, "(");
			depprint ((DEPPTR) intl->left);
			fprintf (stderr, ",");
			depprint ((DEPPTR) intl->right);
			fprintf (stderr, ")");
			break;
		default:
			fprintf (stderr, "(");
			exprprint ((EXPR) intl->left);
			fprintf (stderr, " %c ", intl->oper);
			exprprint ((EXPR) intl->right);
			fprintf (stderr, ")");
			break;
		}
	}
}

STMTPTR nextstmt (kind, curstmt)
int kind;
STMTPTR curstmt;
{
	register STMTPTR stmtwalk;
	stmtwalk = curstmt;
	for (stmtwalk;
		stmtwalk && (stmtwalk->kind != kind);
		stmtwalk = stmtwalk->next)
		;
	return (stmtwalk);
}

EXPR bracket (alpha, x, y)
EXPR alpha,
	x,
	y;
{
	return (
		(EXPR) intlgen (
			'+',
			x,
			(EXPR) intlgen (
				'*',
				alpha,
				(EXPR) intlgen (
					'-',
					y,
					x
				)
			)
		)
	);
}

void depprint (depnd)
DEPPTR depnd;
{
	for (depnd;
		depnd->next;
		depnd = depnd->next)
		fprintf (stderr, "%f %s(%s) + ",
			depnd->coeff,
			ISREAL(depnd->var)?"re":"im",
			idprint (THENAME(depnd->var))
		);
	fprintf (stderr, "%f", depnd->coeff);
	if (depnd->var)
		fprintf (stderr, " %s(%s)",
			ISREAL(depnd->var)?"re":"im",
			idprint (THENAME(depnd->var))
		);
}

void dexch (a,b)
double *a;
double *b;
{
	double temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void fexch (a,b)
float *a;
float *b;
{
	float temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

float rprin (angle)
float angle;
{
	while (angle < 0.0)
		angle += 2*PI;
	while (angle > 2*PI + EPSILON)
		angle -= 2*PI;
	return (angle);
}

/*
float dprin (angle)
float angle;
{
	while (angle < 0.0)
		angle += 360;
	while (angle > 2*PI)
		angle -= 360;
	return (angle);
}
*/

void angorder (startang, midang, endang)
float *startang;
float midang;
float *endang;
{
	if (
		((*endang < -EPSILON +  midang) && (midang < -EPSILON +  *startang))
	||	((*startang < -EPSILON +  *endang) && (*endang < -EPSILON +  midang))
	||	((midang < -EPSILON +  *startang) && (*startang < -EPSILON +  *endang))
	)
		fexch (startang, endang);
}

STMTPTR reverse (stmtlist)
STMTPTR stmtlist;
{
	STMTPTR curstmt, prevstmt, temp;
	prevstmt = curstmt = stmtlist;
	temp = NULL;
	while (curstmt) {
		curstmt = prevstmt->next;
		prevstmt->next = temp;
		temp = prevstmt;
		prevstmt = curstmt;
	}
	return (temp);
}

void impossible (msg)
char *msg;
{
	fprintf (stderr, "ideal: %s: can't happen\n", msg);
	exit (1);
}