BSD 4 development
[unix-history] / usr / src / cmd / apl / aq.c
#
/*
* C library -- alloc/free
*/
#define logical int
struct fb {
logical size;
char *next;
};
int freelist[] = {
0,
-1,
};
logical slop = 2;
alloc(asize)
logical asize;
{ return ( calloc ( 1 , asize ) ); }
/*{
register logical size;
register logical np;
register logical cp;
if ((size = asize) == 0)
return(0);
size += 3;
size &= ~01;
for (;;) {
cp = freelist;
while ((np = cp->next) != -1) {
if (np->size>=size) {
if (size+slop >= np->size) {
cp->next = np->next;
return(&np->next);
}
cp = cp->next = np+size;
cp->size = np->size - size;
cp->next = np->next;
np->size = size;
return(&np->next);
}
cp = np;
}
return ( calloc ( 1 , asize ) );
/* asize = size<1024? 1024: size;
if ((cp = sbrk(asize)) == -1) {
error("workspace exceeded");
}
cp->size = asize;
free(&cp->next);
}
} */
afree(aptr)
char *aptr;
{if ( aptr == 0 ) return;
cfree ( aptr ); }
/* {
register logical ptr;
register logical cp;
register logical np;
if (aptr == 0) return;
ptr = aptr-4;
cp = freelist;
while ((np = cp->next) < ptr)
cp = np;
if (ptr+ptr->size == np) {
ptr->size += np->size;
ptr->next = np->next;
np = ptr;
} else
ptr->next = np;
if (cp+cp->size == ptr) {
cp->size += ptr->size;
cp->next = ptr->next;
} else
cp->next = ptr;
} */