|
|
1.1 ! root 1: /* ! 2: * realloc.c ! 3: * Fits System V requirements. ! 4: * Knows format of malloc arena. ! 5: */ ! 6: ! 7: #include <stdio.h> ! 8: #include <sys/malloc.h> ! 9: ! 10: extern char *malloc(); ! 11: ! 12: char * ! 13: realloc(cp, size) register char *cp; unsigned size; ! 14: { ! 15: register unsigned len, needed, nlen; ! 16: register MBLOCK *mp, *nmp; ! 17: ! 18: if (cp == NULL) ! 19: return malloc(size); ! 20: else if (size == 0) { ! 21: free(cp); ! 22: return NULL; ! 23: } ! 24: ! 25: /* Add space for blksize, round up to word boundary, fail if too big. */ ! 26: needed = roundup(size + sizeof(unsigned), BLOCKSIZE); ! 27: if (needed < size) ! 28: return NULL; ! 29: ! 30: /* Find mblock of the given cp and its length. */ ! 31: mp = mblockp(cp); ! 32: len = realsize(mp->blksize); ! 33: ! 34: /* Request to shrink. */ ! 35: if (len >= needed) { ! 36: if ((len -= needed) > LEASTFREE) { ! 37: /* Split block into used and free parts. */ ! 38: mp->blksize = needed; ! 39: mp = bumpp(mp, needed); ! 40: mp->blksize = (len|FREE); ! 41: __a_count++; ! 42: } ! 43: return cp; ! 44: } ! 45: ! 46: /* Request to grow. */ ! 47: nmp = bumpp(mp, len); /* next block */ ! 48: nlen = nmp->blksize; /* length of next block (+1 if free) */ ! 49: if (isfree(nlen) && (nlen += len) > needed) { ! 50: /* The next block is free and the two are big enough. */ ! 51: if ((nlen - needed) > LEASTFREE) { ! 52: /* Combine blocks, split into used and free parts. */ ! 53: mp->blksize = needed; ! 54: mp = bumpp(mp, needed); ! 55: mp->blksize = nlen - needed; ! 56: } ! 57: else { /* Combine blocks, using all of both. */ ! 58: mp->blksize = nlen = realsize(nlen); ! 59: mp = bumpp(mp, nlen); ! 60: __a_count--; ! 61: } ! 62: if (nmp == __a_scanp) ! 63: __a_scanp = mp; ! 64: return cp; ! 65: } ! 66: ! 67: /* Otherwise, malloc new arena, copy current to it, free current. */ ! 68: if ((mp = (MBLOCK *)malloc(size)) == NULL) ! 69: return NULL; ! 70: memcpy(mp, cp, len - sizeof(unsigned)); ! 71: free(cp); ! 72: return((char *)mp); ! 73: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.