|
|
1.1 ! root 1: /**************************************************************** ! 2: Copyright 1990 by AT&T Bell Laboratories and Bellcore. ! 3: ! 4: Permission to use, copy, modify, and distribute this software ! 5: and its documentation for any purpose and without fee is hereby ! 6: granted, provided that the above copyright notice appear in all ! 7: copies and that both that the copyright notice and this ! 8: permission notice and warranty disclaimer appear in supporting ! 9: documentation, and that the names of AT&T Bell Laboratories or ! 10: Bellcore or any of their entities not be used in advertising or ! 11: publicity pertaining to distribution of the software without ! 12: specific, written prior permission. ! 13: ! 14: AT&T and Bellcore disclaim all warranties with regard to this ! 15: software, including all implied warranties of merchantability ! 16: and fitness. In no event shall AT&T or Bellcore be liable for ! 17: any special, indirect or consequential damages or any damages ! 18: whatsoever resulting from loss of use, data or profits, whether ! 19: in an action of contract, negligence or other tortious action, ! 20: arising out of or in connection with the use or performance of ! 21: this software. ! 22: ****************************************************************/ ! 23: ! 24: #ifndef CRAY ! 25: #define STACKMIN 512 ! 26: #define MINBLK (2*sizeof(struct mem) + 16) ! 27: #define MSTUFF _malloc_stuff_ ! 28: #define F MSTUFF.free ! 29: #define B MSTUFF.busy ! 30: #define SBGULP 8192 ! 31: char *memcpy(); ! 32: ! 33: struct mem { ! 34: struct mem *next; ! 35: unsigned len; ! 36: }; ! 37: ! 38: struct { ! 39: struct mem *free; ! 40: char *busy; ! 41: } MSTUFF; ! 42: ! 43: char * ! 44: malloc(size) ! 45: register unsigned size; ! 46: { ! 47: register struct mem *p, *q, *r, *s; ! 48: unsigned register k, m; ! 49: extern char *sbrk(); ! 50: char *top, *top1; ! 51: ! 52: size = (size+7) & ~7; ! 53: r = (struct mem *) &F; ! 54: for (p = F, q = 0; p; r = p, p = p->next) { ! 55: if ((k = p->len) >= size && (!q || m > k)) { m = k; q = p; s = r; } ! 56: } ! 57: if (q) { ! 58: if (q->len - size >= MINBLK) { /* split block */ ! 59: p = (struct mem *) (((char *) (q+1)) + size); ! 60: p->next = q->next; ! 61: p->len = q->len - size - sizeof(struct mem); ! 62: s->next = p; ! 63: q->len = size; ! 64: } ! 65: else s->next = q->next; ! 66: } ! 67: else { ! 68: top = B ? B : (char *)(((long)sbrk(0) + 7) & ~7); ! 69: if (F && (char *)(F+1) + F->len == B) ! 70: { q = F; F = F->next; } ! 71: else q = (struct mem *) top; ! 72: top1 = (char *)(q+1) + size; ! 73: if (top1 > top) { ! 74: if (sbrk((int)(top1-top+SBGULP)) == (char *) -1) ! 75: return 0; ! 76: r = (struct mem *)top1; ! 77: r->len = SBGULP - sizeof(struct mem); ! 78: r->next = F; ! 79: F = r; ! 80: top1 += SBGULP; ! 81: } ! 82: q->len = size; ! 83: B = top1; ! 84: } ! 85: return (char *) (q+1); ! 86: } ! 87: ! 88: free(f) ! 89: char *f; ! 90: { ! 91: struct mem *p, *q, *r; ! 92: char *pn, *qn; ! 93: ! 94: if (!f) return; ! 95: q = (struct mem *) (f - sizeof(struct mem)); ! 96: qn = f + q->len; ! 97: for (p = F, r = (struct mem *) &F; ; r = p, p = p->next) { ! 98: if (qn == (char *) p) { ! 99: q->len += p->len + sizeof(struct mem); ! 100: p = p->next; ! 101: } ! 102: pn = p ? ((char *) (p+1)) + p->len : 0; ! 103: if (pn == (char *) q) { ! 104: p->len += sizeof(struct mem) + q->len; ! 105: q->len = 0; ! 106: q->next = p; ! 107: r->next = p; ! 108: break; ! 109: } ! 110: if (pn < (char *) q) { ! 111: r->next = q; ! 112: q->next = p; ! 113: break; ! 114: } ! 115: } ! 116: } ! 117: ! 118: char * ! 119: realloc(f, size) ! 120: char *f; ! 121: unsigned size; ! 122: { ! 123: struct mem *p; ! 124: char *q, *f1; ! 125: unsigned s1; ! 126: ! 127: if (!f) return malloc(size); ! 128: p = (struct mem *) (f - sizeof(struct mem)); ! 129: s1 = p->len; ! 130: free(f); ! 131: if (s1 > size) s1 = size + 7 & ~7; ! 132: if (!p->len) { ! 133: f1 = (char *)(p->next + 1); ! 134: memcpy(f1, f, s1); ! 135: f = f1; ! 136: } ! 137: q = malloc(size); ! 138: if (q && q != f) ! 139: memcpy(q, f, s1); ! 140: return q; ! 141: } ! 142: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.