/ src / log.c
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