#include <malloc.h> extern BlockHeader* freep; //! Frees a block of memory previously allocated by malloc(). /*! * Each block of memory allocated by malloc() must be freed using free(), * or the program will create memory leaks. However, all memory used by * the process is freed automatically on exit, so any memory leaks will * be restriced to an individual process. * * The memory block can no longer be used after it has been freed. * * If a NULL pointer is passed to free(), it returns immediately without * error. Otherwise, no checking is performed on the pointer. * \param ap Pointer to the start of the block to be freed. */ void __free_core(void *ap) { BlockHeader *bp, *p; /* free needs to handle a NULL pointer */ if (!ap) return; bp = (BlockHeader*) ap - 1; //printf("free: buf = %x [%d bytes]\n", ap, bp->s.size * sizeof(BlockHeader)); for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; if (bp + bp->s.size == p->s.ptr) { bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; } else p->s.ptr = bp; freep = p; }