// heapdemo.c — traza del asignador: tres malloc, tres free y una petición
// grande al final. Con -n se desactiva la fusión (coalescing).
//
// Uso: ./heapdemo [-n]
#include <stdio.h>
#include <string.h>
#include "mymalloc.h"

static void *do_malloc(const char *name, size_t size) {
    void *p = mm_malloc(size);
    if (p == NULL)
        printf("%s = malloc(%zu) -> NULL\n", name, size);
    else
        printf("%s = malloc(%zu) -> %zu (encabezado en %zu)\n",
               name, size, mm_offset(p), mm_offset(p) - 16);
    mm_dump();
    return p;
}

static void do_free(const char *name, void *p) {
    printf("free(%s)\n", name);
    mm_free(p);
    mm_dump();
}

int main(int argc, char *argv[]) {
    int coalesce = !(argc > 1 && strcmp(argv[1], "-n") == 0);
    mm_init(coalesce);
    printf("arena de %d bytes, fusión %s\n", ARENA_SIZE,
           coalesce ? "activada" : "desactivada");
    mm_dump();

    void *a = do_malloc("a", 96);
    void *b = do_malloc("b", 64);
    void *c = do_malloc("c", 32);
    do_free("b", b);
    do_free("a", a);
    do_free("c", c);
    do_malloc("d", 300);
    return 0;
}
