log.c
1 #ifndef FLASHLIGHT_LOG 2 #define FLASHLIGHT_LOG 3 #include <time.h> 4 #include "log.h" 5 6 void f_default_on_log_message(f_log_message msg) 7 { 8 if (msg.level & f_logger_get_level()) 9 { 10 switch(msg.level) 11 { 12 case F_LOG_FINE: { 13 fprintf(stderr, ANSI_COLOR_YELLOW " [%s] " ANSI_COLOR_RESET "%s\n", msg.datetime, msg.message); 14 } 15 case F_LOG_DEBUG: { 16 fprintf(stderr, ANSI_COLOR_CYAN " [%s] " ANSI_COLOR_RESET "%s\n", msg.datetime, msg.message); 17 break; 18 } 19 case F_LOG_INFO: { 20 fprintf(stderr, ANSI_COLOR_BLUE " [%s] " ANSI_COLOR_RESET "%s\n", msg.datetime, msg.message); 21 break; 22 } 23 case F_LOG_WARN: { 24 fprintf(stderr, ANSI_COLOR_YELLOW " [%s] " ANSI_COLOR_RESET "%s\n", msg.datetime, msg.message); 25 break; 26 } 27 case F_LOG_ERROR: { 28 fprintf(stderr, ANSI_COLOR_MAGENTA " [%s] " ANSI_COLOR_RESET "%s\n", msg.datetime, msg.message); 29 break; 30 } 31 } 32 } 33 } 34 35 void f_logger_set_level(enum F_LOG_LEVEL level) 36 { 37 f_log_level = level; 38 } 39 40 void f_logger_set_cb(f_logger_cb cb, volatile void* payload) 41 { 42 f_log_cb = cb; 43 f_log_payload = payload; 44 } 45 46 f_logger_cb f_logger_get_cb() 47 { 48 return f_log_cb; 49 } 50 51 volatile void* f_logger_get_payload() 52 { 53 return f_log_payload; 54 } 55 56 enum F_LOG_LEVEL f_logger_get_level() 57 { 58 return f_log_level; 59 } 60 61 void f_log(enum F_LOG_LEVEL level, char* fmt, ...) 62 { 63 time_t t = time(NULL); 64 struct tm* tm = localtime(&t); 65 char datetime[64]; 66 strftime(datetime, sizeof(datetime), "%c", tm); 67 char message[500]; 68 volatile void* payload = f_logger_get_payload(); 69 70 va_list args; 71 va_start(args, fmt); 72 vsprintf(message, fmt, args); 73 va_end(args); 74 75 f_log_message msg = {datetime, level, message}; 76 77 if (f_log_cb == NULL) 78 { 79 f_default_on_log_message(msg); 80 } 81 else 82 { 83 f_log_cb(msg, payload); 84 } 85 } 86 87 #endif