Add original unix v6
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
#
|
||||
/*
|
||||
* C library -- alloc/free
|
||||
*/
|
||||
|
||||
#define logical char *
|
||||
|
||||
struct fb {
|
||||
logical size;
|
||||
char *next;
|
||||
};
|
||||
|
||||
int freelist[] {
|
||||
0,
|
||||
-1,
|
||||
};
|
||||
logical slop 2;
|
||||
|
||||
alloc(asize)
|
||||
logical asize;
|
||||
{
|
||||
register logical size;
|
||||
register logical np;
|
||||
register logical cp;
|
||||
|
||||
if ((size = asize) == 0)
|
||||
return(0);
|
||||
size =+ 3;
|
||||
size =& ~01;
|
||||
for (;;) {
|
||||
for (cp=freelist; (np= cp->next) != -1; cp=np) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
asize = size<1024? 1024: size;
|
||||
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-2;
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user