/*
(c) Copyright 2012 - 2018 Anton Sviridenko
https://picapica.im
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "PICA_log.h"
#include
#include
#include
//logging functions are not thread-safe, call them only from the main thread
static int PICA_loglevel = PICA_LOG_INFO;
void PICA_fatal(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
PICA_log_entry(PICA_LOG_FATAL, fmt, args);
va_end(args);
exit(-1);
}
void PICA_error(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
PICA_log_entry(PICA_LOG_ERROR, fmt, args);
va_end(args);
}
void PICA_warn(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
PICA_log_entry(PICA_LOG_WARN, fmt, args);
va_end(args);
}
void PICA_info(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
PICA_log_entry(PICA_LOG_INFO, fmt, args);
va_end(args);
}
void PICA_debug1(const char *fmt, ...)
{
if (PICA_loglevel >= PICA_LOG_DBG1)
{
va_list args;
va_start(args, fmt);
PICA_log_entry(PICA_LOG_DBG1, fmt, args);
va_end(args);
}
}
void PICA_debug2(const char *fmt, ...)
{
if (PICA_loglevel >= PICA_LOG_DBG2)
{
va_list args;
va_start(args, fmt);
PICA_log_entry(PICA_LOG_DBG2, fmt, args);
va_end(args);
}
}
void PICA_debug3(const char *fmt, ...)
{
if (PICA_loglevel >= PICA_LOG_DBG3)
{
va_list args;
va_start(args, fmt);
PICA_log_entry(PICA_LOG_DBG3, fmt, args);
va_end(args);
}
}
void PICA_log_entry(int loglevel, const char *fmt, va_list args)
{
static char buf[1024];
static const char *loglevel_txt[] = {"fatal", "error", "warning", "info", "debug1", "debug2", "debug3"};
FILE *log_file = stdout;
time_t log_time;
static char timebuf[32];
if (loglevel <= PICA_LOG_WARN)
log_file = stderr;
log_time = time(NULL);
strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", localtime(&log_time));
sprintf(buf, "[%.32s] %s: %.1000s\n", timebuf, loglevel_txt[loglevel - PICA_LOG_FATAL], fmt);
vfprintf(log_file, buf, args);
fflush(log_file);
}
void PICA_set_loglevel(int loglevel)
{
if (loglevel >= PICA_LOG_FATAL && loglevel <= PICA_LOG_DBG3)
PICA_loglevel = loglevel;
}