Annotation of coherent/b/lib/libc/gen/old/realloc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.