41 lines
		
	
	
	
		
			661 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			661 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdlib.h>
 | 
						|
#include <stdint.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <string.h>
 | 
						|
#include "malloc.h"
 | 
						|
 | 
						|
void* realloc(void *ptr, size_t size)
 | 
						|
{
 | 
						|
	block_t* h;
 | 
						|
	size_t nblocks;
 | 
						|
	void* newptr;
 | 
						|
 | 
						|
	if (size == 0)
 | 
						|
	{
 | 
						|
		free(ptr);
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
 | 
						|
	if (!ptr)
 | 
						|
		return malloc(size);
 | 
						|
 | 
						|
	h = BLOCKOF(ptr);
 | 
						|
 | 
						|
	nblocks = BLOCKCOUNT(size);
 | 
						|
	/* Overflow check. */
 | 
						|
	if (nblocks < size)
 | 
						|
		return NULL;
 | 
						|
	
 | 
						|
	/* Shrinking the block? Don't bother doing anything (it's never worth it). */
 | 
						|
	if (nblocks <= h->size)
 | 
						|
		return ptr;
 | 
						|
 | 
						|
	/* Allocate and copy. */
 | 
						|
 | 
						|
	newptr = malloc(size);
 | 
						|
	if (!newptr)
 | 
						|
		return NULL;
 | 
						|
	memcpy(newptr, ptr, h->size * sizeof(block_t));
 | 
						|
	free(ptr);
 | 
						|
	return newptr;
 | 
						|
}
 |