USG_PG3/usr/source/lexgen1/lam.c

#

int istate;
# define NALTS 4
struct {int kstates[NALTS];} svec;
jumpfr(a0,a1)
	char *a0,*a1;
{
	char keyc[100], *kcp;
	int keyi[10], *kip;
	kip=keyi; kcp=keyc;
	*kip++ = a0;
	*kip++ = a1;
	*kcp= 0;
	return(aabinary(1,keyi, kip-keyi, keyc, sizeof(istate),0));
}
definition(a0,a1,a2)
	char *a0,*a1,*a2;
{
	char keyc[100], *kcp;
	int keyi[10], *kip;
	kip=keyi; kcp=keyc;
	while(*kcp++= *a0++);
	*kcp= 0;
	return(aabinary(2,keyi, kip-keyi, keyc, a1,a2));
}
startnam(a0)
	char *a0;
{
	char keyc[100], *kcp;
	int keyi[10], *kip;
	kip=keyi; kcp=keyc;
	while(*kcp++= *a0++);
	*kcp= 0;
	return(aabinary(3,keyi, kip-keyi, keyc, sizeof(istate),0));
}
struct node {char *aakey, *aadata; struct node *lp, *rp;};
struct node *aaroot[4];
# ifdef unix
# define cfree free
calloc(m,n)
{
int storep;
storep = alloc(m*n);
if (storep == -1)
	{write(2, "memory space exceeded\n",22); exit();}
return(storep);
}
# endif
aaclen(s)
	char *s;
{
int aak;
	for(aak=1; *s++; aak++);
return(aak);
}
aacomp(s, v, l, t)
	char *s, *t;
	int *v;
{
	int c,d, *p;
p = s;
while (l--)
	if ( (c= *p++) != (d= *v++))
		return(c > d ? '>' : '<');
s= p;
while ( (c= *s++) == (d= *t++) )
	if (c== 0)
		return('=');
return(c>d ? '>' : '<');
}
aabinary(ru,vi,li,s,len,ex)
	char *s;
	int *vi;
{
struct node *p, *op, *r, *st, **pp, *gr;
	char *cp; int *xp;
	gr = 0;
	pp = &(aaroot[ru]);
 while (*pp)
	{
	p  = *pp;
	switch(aacomp(p->aakey, vi, li, s))
		{
		case '<': small:
			pp= &(p->rp);
			break;
		case '>':
			pp= &(p->lp);
			gr = p;
			break;
		case '=':
			if (ex == 2)
				goto small;
			if (ex >= 0)
				return(p->aadata);
			cfree (p->aadata, len, 1);
			cfree(p->aakey, aaclen(p->aakey)+ li*sizeof(li), 1);
			if (p->rp == 0)
				*pp = p->lp;
			else
			{
			r = p->rp;
			if (r->lp == 0)
				{
				r->lp = p->lp;
				*pp = r;
				}
			else
			{
			st = r->lp;
			while (st->lp != 0)
				{
				r = st;
				st = r->lp;
				}
			st->lp = p->lp;
			r->lp = st->rp;
			st->rp = p->rp;
			*pp = st;
			}
			}
			cfree (p, sizeof(**aaroot), 1);
			return(0);
		}
	op=p;
	}
/* not there */
if (ex==2)
	return (gr ? gr->aakey : 0);
if (ex != 0) return(0);
p = *pp= calloc(1, sizeof(**aaroot));
p->aakey = calloc(aaclen(s)+li*sizeof(li),1);
xp = p->aakey;
while (li--)
	*xp++ = *vi++;
cp=xp;
while (*cp++ = *s++);
p->aadata = calloc(len,1);
cp = p->aadata;
while (len--)
  *cp++ = 0;
p->rp = p->lp = 0;
return(p->aadata);
}