/*
 *  Logging utility
 *
 *  (c) Adrian Smith 2012-2015, triode1@btinternet.com
 *  Philippe, philippe_44@outlook.com
 *
 * See LICENSE
 * 
 */

#pragma once

typedef enum { lSILENCE = 0, lERROR, lWARN, lINFO, lDEBUG, lSDEBUG } log_level;

const char *logtime(void);
void logprint_ex(log_level *current_level, const char *func, int line, const char *fmt, ...);
log_level debug2level(char *level);
char *level2debug(log_level level);
void logdump(const char* data, size_t size);

typedef void (*log_sink_fn)(const char* source, const char* line, log_level level);
void cross_set_logger(log_sink_fn fn);
void cross_set_levels(log_level util_level, log_level raop_level);

#define LOG_ERROR(fmt, ...)  if (*loglevel >= lERROR)  logprint_ex(loglevel, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_WARN(fmt, ...)   if (*loglevel >= lWARN)   logprint_ex(loglevel, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...)   if (*loglevel >= lINFO)   logprint_ex(loglevel, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_DEBUG(fmt, ...)  if (*loglevel >= lDEBUG)  logprint_ex(loglevel, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_SDEBUG(fmt, ...) if (*loglevel >= lSDEBUG) logprint_ex(loglevel, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
