1#include <errno.h>2#include <stdint.h>3#include <stdlib.h>4#include <string.h>56#include "malloc.h"7#undef realloc89void *10realloc(void *ptr, size_t nbytes)11{12 Header *oh, *prev, *next, *new;13 size_t nunits, avail, onbytes, n;1415 if (nbytes == 0) {16 free(ptr);17 ptr = NULL;18 } else if (nbytes > SIZE_MAX - sizeof(Header)-1) {19 errno = ENOMEM;20 return NULL;21 }2223 if (!ptr)24 return malloc(nbytes);2526 nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;27 oh = (Header *) ptr - 1;2829 if (oh->h.size == nunits)30 return ptr;3132 new = oh + nunits;3334 if (nunits < oh->h.size) {35 new->h.size = oh->h.size - nunits;36 oh->h.size = nunits;37 free(new + 1);38 return ptr;39 }4041 prev = _prevchunk(oh);42 next = prev->h.next;4344 if (oh + oh->h.size == next) {45 /*46 * if there is free space adjacent47 * to the current memory48 */49 avail = oh->h.size + next->h.size;5051 if (avail == nunits) {52 oh->h.size = nunits;53 prev->h.next = next->h.next;54 _freep = prev;55 return ptr;56 }5758 if (nunits < avail) {59 oh->h.size = nunits;60 prev->h.next = new;61 new->h.next = next->h.next;62 new->h.size = avail - nunits;63 _freep = new;64 return ptr;65 }66 }6768 if ((new = malloc(nbytes)) == NULL)69 return NULL;7071 n = (oh->h.size - 1) * sizeof(Header);72 if (n > nbytes)73 n = nbytes;74 memcpy(new, ptr, n);75 free(ptr);7677 return new;78}