#include "../../include/std/log.h" #include "../../include/std/thread.h" #include "../../include/std/misc.h" #include #include #define LOG_DEBUG static amal_mutex mutex; static bool mutex_initialized = bool_false; /* Safe to call multiple times */ static void mutex_init() { if(!mutex_initialized) { amal_mutex_init(&mutex); mutex_initialized = bool_true; } } amal_mutex* amal_log_get_mutex() { mutex_init(); return &mutex; } void amal_log_debug(const char *fmt, ...) { #ifdef LOG_DEBUG va_list args; mutex_init(); ignore_result_int(amal_mutex_lock(&mutex, NULL)); fprintf(stderr, "Debug: "); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); ignore_result_int(amal_mutex_unlock(&mutex)); #else (void)fmt; #endif } void amal_log_error(const char *fmt, ...) { va_list args; mutex_init(); ignore_result_int(amal_mutex_lock(&mutex, NULL)); fprintf(stderr, "\x1b[1;31mError:\x1b[0m "); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); ignore_result_int(amal_mutex_unlock(&mutex)); } void amal_log_info(const char *fmt, ...) { va_list args; mutex_init(); ignore_result_int(amal_mutex_lock(&mutex, NULL)); fprintf(stderr, "Info: "); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); ignore_result_int(amal_mutex_unlock(&mutex)); } void amal_log_warning(const char *fmt, ...) { va_list args; mutex_init(); ignore_result_int(amal_mutex_lock(&mutex, NULL)); fprintf(stderr, "Warning: "); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); ignore_result_int(amal_mutex_unlock(&mutex)); }