USG_PG3/usr/source/agen/aabin.c

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);
}