/* (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; }