mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-29 02:22:43 +00:00
5d60853225
The diffs are large mainly because of prototyping changes.
167 lines
3.5 KiB
C
167 lines
3.5 KiB
C
/****************************************************************
|
|
Copyright 1990, 1994 by AT&T Bell Laboratories and Bellcore.
|
|
|
|
Permission to use, copy, modify, and distribute this software
|
|
and its documentation for any purpose and without fee is hereby
|
|
granted, provided that the above copyright notice appear in all
|
|
copies and that both that the copyright notice and this
|
|
permission notice and warranty disclaimer appear in supporting
|
|
documentation, and that the names of AT&T Bell Laboratories or
|
|
Bellcore or any of their entities not be used in advertising or
|
|
publicity pertaining to distribution of the software without
|
|
specific, written prior permission.
|
|
|
|
AT&T and Bellcore disclaim all warranties with regard to this
|
|
software, including all implied warranties of merchantability
|
|
and fitness. In no event shall AT&T or Bellcore be liable for
|
|
any special, indirect or consequential damages or any damages
|
|
whatsoever resulting from loss of use, data or profits, whether
|
|
in an action of contract, negligence or other tortious action,
|
|
arising out of or in connection with the use or performance of
|
|
this software.
|
|
****************************************************************/
|
|
|
|
#ifndef CRAY
|
|
#define STACKMIN 512
|
|
#define MINBLK (2*sizeof(struct mem) + 16)
|
|
#define F _malloc_free_
|
|
#define SBGULP 8192
|
|
#include "string.h" /* for memcpy */
|
|
|
|
#ifdef KR_headers
|
|
#define Char char
|
|
#define Unsigned unsigned
|
|
#define Int /*int*/
|
|
#else
|
|
#define Char void
|
|
#define Unsigned size_t
|
|
#define Int int
|
|
#endif
|
|
|
|
typedef struct mem {
|
|
struct mem *next;
|
|
Unsigned len;
|
|
} mem;
|
|
|
|
mem *F;
|
|
|
|
Char *
|
|
#ifdef KR_headers
|
|
malloc(size)
|
|
register Unsigned size;
|
|
#else
|
|
malloc(register Unsigned size)
|
|
#endif
|
|
{
|
|
register mem *p, *q, *r, *s;
|
|
unsigned register k, m;
|
|
extern Char *sbrk(Int);
|
|
char *top, *top1;
|
|
|
|
size = (size+7) & ~7;
|
|
r = (mem *) &F;
|
|
for (p = F, q = 0; p; r = p, p = p->next) {
|
|
if ((k = p->len) >= size && (!q || m > k)) {
|
|
m = k;
|
|
q = p;
|
|
s = r;
|
|
}
|
|
}
|
|
if (q) {
|
|
if (q->len - size >= MINBLK) { /* split block */
|
|
p = (mem *) (((char *) (q+1)) + size);
|
|
p->next = q->next;
|
|
p->len = q->len - size - sizeof(mem);
|
|
s->next = p;
|
|
q->len = size;
|
|
}
|
|
else
|
|
s->next = q->next;
|
|
}
|
|
else {
|
|
top = (Char *)(((long)sbrk(0) + 7) & ~7);
|
|
if (F && (char *)(F+1) + F->len == top) {
|
|
q = F;
|
|
F = F->next;
|
|
}
|
|
else
|
|
q = (mem *) top;
|
|
top1 = (char *)(q+1) + size;
|
|
if (sbrk((int)(top1-top+SBGULP)) == (Char *) -1)
|
|
return 0;
|
|
r = (mem *)top1;
|
|
r->len = SBGULP - sizeof(mem);
|
|
r->next = F;
|
|
F = r;
|
|
top1 += SBGULP;
|
|
q->len = size;
|
|
}
|
|
return (Char *) (q+1);
|
|
}
|
|
|
|
void
|
|
#ifdef KR_headers
|
|
free(f)
|
|
Char *f;
|
|
#else
|
|
free(Char *f)
|
|
#endif
|
|
{
|
|
mem *p, *q, *r;
|
|
char *pn, *qn;
|
|
|
|
if (!f) return;
|
|
q = (mem *) ((char *)f - sizeof(mem));
|
|
qn = (char *)f + q->len;
|
|
for (p = F, r = (mem *) &F; ; r = p, p = p->next) {
|
|
if (qn == (Char *) p) {
|
|
q->len += p->len + sizeof(mem);
|
|
p = p->next;
|
|
}
|
|
pn = p ? ((char *) (p+1)) + p->len : 0;
|
|
if (pn == (Char *) q) {
|
|
p->len += sizeof(mem) + q->len;
|
|
q->len = 0;
|
|
q->next = p;
|
|
r->next = p;
|
|
break;
|
|
}
|
|
if (pn < (char *) q) {
|
|
r->next = q;
|
|
q->next = p;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
Char *
|
|
#ifdef KR_headers
|
|
realloc(f, size)
|
|
Char *f;
|
|
Unsigned size;
|
|
#else
|
|
realloc(Char *f, Unsigned size)
|
|
#endif
|
|
{
|
|
mem *p;
|
|
Char *q, *f1;
|
|
Unsigned s1;
|
|
|
|
if (!f) return malloc(size);
|
|
p = (mem *) ((char *)f - sizeof(mem));
|
|
s1 = p->len;
|
|
free(f);
|
|
if (s1 > size)
|
|
s1 = size + 7 & ~7;
|
|
if (!p->len) {
|
|
f1 = (Char *)(p->next + 1);
|
|
memcpy(f1, f, s1);
|
|
f = f1;
|
|
}
|
|
q = malloc(size);
|
|
if (q && q != f)
|
|
memcpy(q, f, s1);
|
|
return q;
|
|
}
|
|
#endif
|