// Libera un árbol escribiendo qué nodo libera en cada momento.
#include <stdio.h>
#include <stdlib.h>

#include "logic.h"

static void free_traced(Logic *e) {
    if (e == NULL) {
        return;
    }
    switch (e->kind) {
    case LOGIC_CONSTANT:
    case LOGIC_INPUT:
        break;
    case LOGIC_NOT:
        free_traced(e->as.child);
        break;
    case LOGIC_AND:
    case LOGIC_OR:
        free_traced(e->as.pair.left);
        free_traced(e->as.pair.right);
        break;
    }
    printf("libero ");
    if (e->kind == LOGIC_NOT) {
        printf("un not\n");
    } else if (e->kind == LOGIC_AND) {
        printf("un and\n");
    } else if (e->kind == LOGIC_OR) {
        printf("un or\n");
    } else {
        logic_print(e, stdout);
        printf("\n");
    }
    free(e);
}

int main(void) {
    Logic *formula = logic_or(logic_and(logic_input('a'), logic_not(logic_input('b'))),
                              logic_input('c'));
    if (formula == NULL) {
        fprintf(stderr, "no hay memoria\n");
        return 1;
    }
    free_traced(formula);
    return 0;
}
