1/* 2 * K&R Malloc 3 * 4 * System specifc code should implement `more_core' 5 */ 6 7#include "k_r_malloc.h" 8#include <stdlib.h> 9#include <string.h> 10 11typedef void *(*alt_realloc_t)(void *p, size_t bytes); 12alt_realloc_t alt_realloc = NULL; 13 14void * 15realloc(void *ptr, size_t size) 16{ 17 if (alt_realloc != NULL) { 18 return alt_realloc(ptr, size); 19 } 20 21 Header *bp; 22 void *new_ptr; 23 size_t old_size; 24 25 if (ptr == NULL) 26 return malloc(size); 27 bp = (Header *) ptr - 1; /* point to block header */ 28 old_size = sizeof(Header) * (bp->s.size - 1); 29 new_ptr = malloc(size); 30 if (new_ptr == NULL) { 31 return NULL; 32 } 33 if (old_size <= size) { 34 memcpy(new_ptr, ptr, old_size); 35 } else { 36 memcpy(new_ptr, ptr, size); 37 } 38 free(ptr); 39 return new_ptr; 40} 41