|
|
1.1 root 1: /* realloc fits unix version 5 requirments
2: * knows format of malloc list.
3: */
4:
5: #include <stdio.h>
6: #include <malloc.h>
7:
8: extern struct mblock *_a_scanp; /* search starts here */
9:
10: static
11: qmove(cp, ptr, sizem)
12: register unsigned sizem, *cp, *ptr;
13: {
14: for(; sizem > 0; sizem--)
15: *ptr++ = *cp++;
16: }
17:
18: /* realloc function */
19: char *
20: realloc(cp, size)
21: register char *cp;
22: unsigned size;
23: {
24: register unsigned len, siz, nlen;
25: register struct mblock *ptr, *nptr;
26:
27: siz = roundup(size + sizeof(unsigned), POW2);
28: if(siz < size)
29: return(NULL);
30: len = realsize((ptr = cp - sizeof(unsigned))->blksize);
31: ptr->blksize = len; /* mark used */
32: if(len >= siz) { /* request to shrink */
33: if((len -= siz) > LEASTFREE) {
34: ptr->blksize = siz;
35: ptr = siz + adr(ptr);
36: ptr->blksize = (len|FREE);
37: }
38: return(cp);
39: }
40: /* request to grow */
41: nptr = adr(ptr) + len;
42: if((isfree(nlen = nptr->blksize)) &&
43: ((nlen+=len) > siz)) { /*next block free and big enough */
44: if((nlen - siz) > LEASTFREE) {
45: ptr->blksize = siz;
46: ptr = siz + adr(ptr);
47: ptr->blksize = nlen - siz;
48: }
49: else {
50: ptr->blksize = realsize(nlen);
51: ptr = realsize(nlen) + adr(ptr);
52: }
53: if(nptr==_a_scanp)
54: _a_scanp=ptr;
55: return(cp);
56: }
57: if(NULL == (ptr = malloc(size)))
58: return(NULL);
59: qmove(cp, ptr, len/sizeof(unsigned) - 1);
60: free(cp);
61: return(ptr);
62: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.