mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
96 lines
1.3 KiB
C
96 lines
1.3 KiB
C
/*
|
|
* C library -- alloc/free
|
|
*/
|
|
|
|
#define logical char *
|
|
|
|
struct fb {
|
|
logical size;
|
|
char *next;
|
|
};
|
|
|
|
int _freelist[] {
|
|
0,
|
|
-1,
|
|
};
|
|
logical _slop 4;
|
|
|
|
char *
|
|
malloc(asize)
|
|
logical asize;
|
|
{
|
|
register logical rsize;
|
|
register logical np;
|
|
register logical cp;
|
|
|
|
if ((rsize = asize) == 0)
|
|
return(-1);
|
|
rsize += 3;
|
|
rsize = _andptr(rsize,~01);
|
|
for (;;)
|
|
{
|
|
for (cp=_freelist; (np= cp->next) != -1; cp=np)
|
|
{
|
|
if (np->size >= rsize)
|
|
{
|
|
if (_addptr(rsize,_slop) >= np->size)
|
|
{
|
|
cp->next = np->next;
|
|
return(&np->next);
|
|
}
|
|
cp = cp->next = _addptr(np , rsize);
|
|
cp->size = np->size - rsize;
|
|
cp->next = np->next;
|
|
np->size = rsize;
|
|
return(&np->next);
|
|
}
|
|
}
|
|
asize = (rsize < 1024) ? 1024: rsize;
|
|
if ((cp = sbrk(asize)) == -1)
|
|
{
|
|
return (-1);
|
|
}
|
|
cp->size = asize;
|
|
free(&cp->next);
|
|
}
|
|
}
|
|
|
|
free(aptr)
|
|
char *aptr;
|
|
{
|
|
register logical ptr;
|
|
register logical cp;
|
|
register logical np;
|
|
|
|
ptr = aptr-4;
|
|
cp = _freelist;
|
|
while ((np = cp->next) < ptr)
|
|
cp = np;
|
|
if (_addptr(ptr,ptr->size) == np)
|
|
{
|
|
ptr->size = _addptr(ptr->size,np->size);
|
|
ptr->next = np->next;
|
|
np = ptr;
|
|
}
|
|
else
|
|
ptr->next = np;
|
|
|
|
if (_addptr(cp,cp->size) == ptr)
|
|
{
|
|
cp->size = _addptr(cp->size,ptr->size);
|
|
cp->next = ptr->next;
|
|
}
|
|
else
|
|
cp->next = ptr;
|
|
}
|
|
|
|
/* Fudge routines */
|
|
_addptr (a,b)
|
|
{
|
|
return(a+b);
|
|
}
|
|
_andptr (a,b)
|
|
{
|
|
return(a&b);
|
|
}
|