File:  [MW Coherent from dump] / coherent / b / lib / libc / gen / old / realloc.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:35 2019 UTC (7 years ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

/* realloc fits unix version 5 requirments 
 * knows format of malloc list.
 */

#include <stdio.h>
#include <malloc.h>

extern struct mblock	*_a_scanp;	/* search starts here */

static
qmove(cp, ptr, sizem)
register unsigned sizem, *cp, *ptr;
{
	for(; sizem > 0; sizem--)
		*ptr++ = *cp++;
}

/* realloc function */
char *
realloc(cp, size)
register char *cp;
unsigned size;
{
	register unsigned len, siz, nlen;
	register struct mblock *ptr, *nptr;

	siz = roundup(size + sizeof(unsigned), POW2);
	if(siz < size)
		return(NULL);
	len = realsize((ptr = cp - sizeof(unsigned))->blksize);
	ptr->blksize = len;		/* mark used */
	if(len >= siz) {		/* request to shrink */
		if((len -= siz) > LEASTFREE) {
			ptr->blksize = siz;
			ptr = siz + adr(ptr);
			ptr->blksize = (len|FREE);
		}
		return(cp);
	}
	/* request to grow */
	nptr = adr(ptr) + len;
	if((isfree(nlen = nptr->blksize)) &&
	   ((nlen+=len) > siz)) { /*next block free and big enough */
		if((nlen - siz) > LEASTFREE) {
			ptr->blksize = siz;
			ptr = siz + adr(ptr);
			ptr->blksize = nlen - siz;
		}
		else {
			ptr->blksize = realsize(nlen);
			ptr = realsize(nlen) + adr(ptr);
		}
		if(nptr==_a_scanp)
			_a_scanp=ptr;
		return(cp);
	}
	if(NULL == (ptr = malloc(size)))
		return(NULL);
	qmove(cp, ptr, len/sizeof(unsigned) - 1);
	free(cp);
	return(ptr);
}

unix.superglobalmegacorp.com

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