#define	NULL		0
#define	BLOK		16
#define	BUSY		1
#define	SIZEOF		2	/* size of a word */

int	*allocp, *alloct, *allocs;

alloc(nbytes)
	int	nbytes;
{
	register int *p;
	int	i;
	int	nwords, t1, *p1, *cct;
	int	*q;

	if(allocs == 0)
	{
		allocs = evnbrk(4);
		allocs[0] = (&allocs[1])|BUSY;
		allocs[1] = (&allocs[0])|BUSY;
		alloct = allocp = &allocs[1];
	}


	nwords = (nbytes+(2*SIZEOF-1))/SIZEOF;
	for(p=allocp;;)
	{
		do
		{
			if((*p & BUSY) == 0)
			{
				while((*(q=*p) & BUSY)==0)
					*p = *q;
				if(q >= &p[nwords])
				{
					allocp = &p[nwords];
					if(q > allocp)
						*allocp = *p;
					*p = allocp | BUSY;
					return p+1;
				}
			}
			q = p;
			p = *p & ~BUSY;
		} while(q>=allocp || p<allocp);

		i = (nwords+BLOK)*SIZEOF;
		while((cct=evnbrk(i))==-1)
		{
			if(i<32)
				return NULL;
			i /= SIZEOF;
			i &= ~1;/* rounded by SIZEOF actually */
		}
		if(cct != alloct + 1)
			*alloct = cct|BUSY;
		else
			*alloct = cct;
/*		*cct = alloct = &cct[i/SIZEOF-1];*/
		*cct = alloct = &cct[(i>>1)-1];
		*alloct = allocs|BUSY;
	}
}

evnbrk(i)
	int i;
{
/*	sbrk(ccedata&1);*/
	sbrk(sbrk(0)&1);
	return sbrk(i);
}

free(p)
int	*p;
{
	allocp = p-1;
	*allocp &= ~BUSY;
}
