USG_PG3/usr/source/lexgen1/access.c

# include "../lexgen1/ldefs.c"
# define NALTS 6


slide(a0,a1,a2)
{
char *cp;
if (a0>NST) error("%d states", NST);
switch(a1)
	{
	case 0:
		if (xslide[a0]) return(xslide[a0]);
		cp=xslide[a0]=calloc(a2,1);
		while(a2--)
			*cp++ = 0;
		return(xslide[a0]);
	case 1:
		return(xslide[a0]);
	case -1:
		if (xslide[a0])
			cfree(xslide[a0],2,1);
		xslide[a0] = 0;
	}
return(0);
}


addslide(i,j)
{
int *p, *q, leng, *tp, temp[NRULES];
if(i==j) return;
leng = 2*NALTS*sizeof(i);
q= p = slide(i,0,leng);
p++;
if (*q==0) *q = leng/sizeof(i);
while (*p)
	if (*p++ == j)
		return;
leng = *q;
if (p-q >= leng-1)
	{
	leng =* 2;
	tp = temp;
	while (*tp++ = *q++);
	slide(i,-1,0);
	q= p = slide(i, 0, leng*sizeof(p));
	tp=temp;
	while (*p = *tp++) p++;
	*q = leng;
	}
*p = j;
}


addmove(i,c,j)
{
int *p, *q, leng, *tp, temp[NRULES];
int **pp;
leng = NALTS*sizeof(i);
pp = move(i,c,0,leng);
if(*pp == 0)
	{
	*pp = j;
	return;
	}
p = *pp;
if (!ptr(p))
	{
	i = p;
	if(i==j) return;
	*pp = p = calloc(leng,1);
	p [0]= NALTS;
	p[1] = i;
	p[2] = 0;
	}
q=p;
p++;
while (*p)
	if (*p++ == j)
		return;
leng = *q;
if (p-q >= leng-1)
	{
	leng =* 2;
	tp = temp;
	while (*tp++ = *q++);
	cfree(*pp,  leng, 1);
	q = p = *pp = calloc(leng*sizeof(p), 1);
	tp=temp;
	while (*p = *tp++) p++;
	*q = leng;
	}
*p++ = j;
*p = 0;
}


addstop(i,j)
{
int *p, *q, v;
q= p = stops(i,0);
for (; v = *p; p++)
	if (v == j)
		return;
	else if (j > 0 && (v > j || v < 0 ))
		{ *p = j; j= v;}
if (p-q >= NALTS-1)
	error("too many stops state %d",i);
else
	*p = j;
}


stops(a0,a1)
{
char *cp; int a2;
if (a0>NST) error("%d states", NST);
switch(a1)
	{
	case 0:
		if (xstop[a0]) return(xstop[a0]);
		cp=xstop[a0]=calloc(a2=NALTS*sizeof(a2),1);
		while(a2--)
			*cp++ = 0;
		return(xstop[a0]);
	case 1:
		return(xstop[a0]);
	case -1:
		if (xstop[a0])
			cfree(xstop[a0],10,1);
		xstop[a0] = 0;
	}
return(0);
}


ptr(a)
{
if (a== -1) return (0);
if (a<0) return(1);
if (a<1024) return(0);
return(1);
}


new( ii, sz)
{
char *p;
if (ii>NST) error("new state overflow");
if (xnew[ii] != 0) return(xnew[ii]);
xnew[ii] = p = calloc(sz, 1);
while (sz--)
	*p++ = 0;
return(xnew[ii]);
}