#include "application.h"
#include "cover.h"
#include "handle.h"
#include "kissat.h"
#include "print.h"

#include <assert.h>
#include <stdbool.h>

static kissat *solver;

// *INDENT-OFF*

static void kissat_signal_handler(int sig)
{
    assert(solver);
    kissat_signal(solver, "caught", sig);
    kissat_print_statistics(solver);
    kissat_signal(solver, "raising", sig);
#ifdef QUIET
    (void)sig;
#endif
    FLUSH_COVERAGE();
} // Keep this '}' in the same line!

// *INDENT-ON*

static volatile bool ignore_alarm = false;

static void kissat_alarm_handler(void)
{
    if (ignore_alarm)
        return;
    assert(solver);
    kissat_terminate(solver);
}

#ifndef NDEBUG
extern int dump(kissat *);
#endif

#include "random.h"
#include "error.h"
#include <strings.h>

int main(int argc, char **argv)
{
    int res;
    solver = kissat_init(0);
    kissat_init_alarm(kissat_alarm_handler);
    kissat_init_signal_handler(kissat_signal_handler);
    res = kissat_application(solver, argc, argv);
    kissat_reset_signal_handler();
    ignore_alarm = true;
    kissat_reset_alarm();
    kissat_release(solver);
#ifndef NDEBUG
    if (!res)
        return dump(0);
#endif
    return res;
}
