#include <malloc.h> extern BlockHeader* freep; void free(void *ap) { BlockHeader *bp, *p; /* free needs to handle a NULL pointer */ if (!ap) return; bp = (BlockHeader*) ap - 1; //wprintf(L"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; }