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