/* log.c: Procedures to handle logging and fatal errors. */

#define _POSIX_SOURCE

#include <stdio.h>
#include <sys/types.h>
#include <time.h>
#include <stdarg.h>
#include "log.h"
#include "dump.h"
#include "cmstring.h"
#include "util.h"

void panic(char *s)
{
    static int panic_state = 0;
    char timestr[50];
    time_t timeval;

    time(&timeval);
    strcpy(timestr, ctime(&timeval));
    timestr[strlen(timestr) - 1] = 0;

    fputs(timestr, stderr);
    fputs(panic_state ? ": RECURSIVE PANIC: " : ": PANIC: ", stderr);
    fputs(s, stderr);
    fputc('\n', stderr);

    if (!panic_state) {
	panic_state = 1;
	binary_dump();
    }
    exit(1);
}

void abort()
{
  panic("Aborted");
}

void fail_to_start(char *s)
{
    char timestr[50];
    time_t timeval;

    time(&timeval);
    strcpy(timestr, ctime(&timeval));
    timestr[strlen(timestr) - 1] = 0;

    fputs(timestr, stderr);
    fputs(": FAILED TO START: ", stderr);
    fputs(s, stderr);
    fputc('\n', stderr);

    exit(1);
}

void write_log(char *fmt, ...)
{
    char timestr[50];
    time_t timeval;
    va_list arg;
    String *str;

    va_start(arg, fmt);

    time(&timeval);
    strcpy(timestr, ctime(&timeval));
    timestr[strlen(timestr) - 1] = 0;

    str = vformat(fmt, arg);

    fputs(timestr, stderr);
    fputs(": ", stderr);
    fputs(string_chars(str), stderr);
    fputc('\n', stderr);

    string_discard(str);
    va_end(arg);
}