142 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************
 | |
| Copyright 1990 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 MSTUFF _malloc_stuff_
 | |
| #define F MSTUFF.free
 | |
| #define B MSTUFF.busy
 | |
| #define SBGULP 8192
 | |
| char *memcpy();
 | |
| 
 | |
| struct mem {
 | |
| 	struct mem *next;
 | |
| 	unsigned len;
 | |
| 	};
 | |
| 
 | |
| struct {
 | |
| 	struct mem *free;
 | |
| 	char *busy;
 | |
| 	} MSTUFF;
 | |
| 
 | |
| char *
 | |
| malloc(size)
 | |
| register unsigned size;
 | |
| {
 | |
| 	register struct mem *p, *q, *r, *s;
 | |
| 	unsigned register k, m;
 | |
| 	extern char *sbrk();
 | |
| 	char *top, *top1;
 | |
| 
 | |
| 	size = (size+7) & ~7;
 | |
| 	r = (struct 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 = (struct mem *) (((char *) (q+1)) + size);
 | |
| 			p->next = q->next;
 | |
| 			p->len = q->len - size - sizeof(struct mem);
 | |
| 			s->next = p;
 | |
| 			q->len = size;
 | |
| 			}
 | |
| 		else s->next = q->next;
 | |
| 		}
 | |
| 	else {
 | |
| 		top = B ? B : (char *)(((long)sbrk(0) + 7) & ~7);
 | |
| 		if (F && (char *)(F+1) + F->len == B)
 | |
| 			{ q = F; F = F->next; }
 | |
| 		else q = (struct mem *) top;
 | |
| 		top1 = (char *)(q+1) + size;
 | |
| 		if (top1 > top) {
 | |
| 			if (sbrk((int)(top1-top+SBGULP)) == (char *) -1)
 | |
| 				return 0;
 | |
| 			r = (struct mem *)top1;
 | |
| 			r->len = SBGULP - sizeof(struct mem);
 | |
| 			r->next = F;
 | |
| 			F = r;
 | |
| 			top1 += SBGULP;
 | |
| 			}
 | |
| 		q->len = size;
 | |
| 		B = top1;
 | |
| 		}
 | |
| 	return (char *) (q+1);
 | |
| 	}
 | |
| 
 | |
| free(f)
 | |
| char *f;
 | |
| {
 | |
| 	struct mem *p, *q, *r;
 | |
| 	char *pn, *qn;
 | |
| 
 | |
| 	if (!f) return;
 | |
| 	q = (struct mem *) (f - sizeof(struct mem));
 | |
| 	qn = f + q->len;
 | |
| 	for (p = F, r = (struct mem *) &F; ; r = p, p = p->next) {
 | |
| 		if (qn == (char *) p) {
 | |
| 			q->len += p->len + sizeof(struct mem);
 | |
| 			p = p->next;
 | |
| 			}
 | |
| 		pn = p ? ((char *) (p+1)) + p->len : 0;
 | |
| 		if (pn == (char *) q) {
 | |
| 			p->len += sizeof(struct 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 *
 | |
| realloc(f, size)
 | |
| char *f;
 | |
| unsigned size;
 | |
| {
 | |
| 	struct mem *p;
 | |
| 	char *q, *f1;
 | |
| 	unsigned s1;
 | |
| 
 | |
| 	if (!f) return malloc(size);
 | |
| 	p = (struct mem *) (f - sizeof(struct 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
 |