a34b05d2e6
This opens an OpenBSD-mirabile (aka MirBSD) repository. ### MirBSD is: # Copyright (c) 1982-2003 by Thorsten "mirabile" Glaser <x86@ePost.de> # Copyright © 1968-2003 The authors of And contributors to UNIX®, the # C Language, BSD/Berkeley Unix; 386BSD, NetBSD 1.1 and OpenBSD. # # Anyone who obtained a copy of this work is hereby permitted to freely use, # distribute, modify, merge, sublicence, give away or sell it as long as the # authors are given due credit and the following notice is retained: # # This work is provided "as is", with no explicit or implicit warranty what- # soever. Use it only at your own risk. In no event may an author or contri- # butor be held liable for any damage, directly or indirectly, that origina- # ted through or is caused by creation or modification of this work. MirBSD is my private tree. MirBSD does not differ very much from OpenBSD and intentionally tracks OpenBSD. That's why it _is_ OpenBSD, just not the official one. It's like with DarrenBSD. At time of this writing, no advertising for MirBSD must be done, because the advertising clause has not yet been sorted out. http://templeofhate.com/tglaser/MirBSD/index.php
120 lines
2.7 KiB
C
120 lines
2.7 KiB
C
/* $OpenBSD: alloc.c,v 1.5 2002/03/01 13:06:18 espie Exp $ */
|
|
/*
|
|
* Copyright (c) 2002 Marc Espie.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD
|
|
* PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
* area-based allocation built on malloc/free
|
|
*/
|
|
|
|
#include "sh.h"
|
|
|
|
struct link {
|
|
struct link *prev;
|
|
struct link *next;
|
|
};
|
|
|
|
Area *
|
|
ainit(Area *ap)
|
|
{
|
|
ap->freelist = NULL;
|
|
return ap;
|
|
}
|
|
|
|
void
|
|
afreeall(Area *ap)
|
|
{
|
|
struct link *l, *l2;
|
|
|
|
for (l = ap->freelist; l != NULL; l = l2) {
|
|
l2 = l->next;
|
|
free(l);
|
|
}
|
|
ap->freelist = NULL;
|
|
}
|
|
|
|
#define L2P(l) ( (void *)(((char *)(l)) + sizeof(struct link)) )
|
|
#define P2L(p) ( (struct link *)(((char *)(p)) - sizeof(struct link)) )
|
|
|
|
void *
|
|
alloc(size_t size, Area *ap)
|
|
{
|
|
struct link *l;
|
|
|
|
l = malloc(size + sizeof(struct link));
|
|
if (!l)
|
|
return NULL;
|
|
l->next = ap->freelist;
|
|
l->prev = NULL;
|
|
if (ap->freelist)
|
|
ap->freelist->prev = l;
|
|
ap->freelist = l;
|
|
|
|
return L2P(l);
|
|
}
|
|
|
|
void *
|
|
aresize(void *ptr, size_t size, Area *ap)
|
|
{
|
|
struct link *l, *l2, *lprev, *lnext;
|
|
|
|
if (ptr == NULL)
|
|
return alloc(size, ap);
|
|
|
|
l = P2L(ptr);
|
|
lprev = l->prev;
|
|
lnext = l->next;
|
|
|
|
l2 = realloc(l, size+sizeof(struct link));
|
|
if (l2) {
|
|
if (lprev)
|
|
lprev->next = l2;
|
|
else
|
|
ap->freelist = l2;
|
|
if (lnext)
|
|
lnext->prev = l2;
|
|
}
|
|
return L2P(l2);
|
|
}
|
|
|
|
void
|
|
afree(void *ptr, Area *ap)
|
|
{
|
|
struct link *l;
|
|
|
|
if (!ptr)
|
|
return;
|
|
|
|
l = P2L(ptr);
|
|
|
|
if (l->prev)
|
|
l->prev->next = l->next;
|
|
else
|
|
ap->freelist = l->next;
|
|
if (l->next)
|
|
l->next->prev = l->prev;
|
|
|
|
free(l);
|
|
}
|