1 #ifndef LOG_H
2 #define LOG_H
3 
4 #include <stdio.h>
5 #include <errno.h>
6 #include <inttypes.h>
7 #include <string.h>
8 
9 #define LOG_LEVEL_DEBUG 10
10 #define LOG_LEVEL_INFO 20
11 #define LOG_LEVEL_WARN 30
12 #define LOG_LEVEL_ERROR 40
13 
14 #ifndef LOG_LEVEL
15 #define LOG_LEVEL LOG_LEVEL_INFO
16 #endif
17 
18 #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
19 
20 /* safe readable version of errno */
21 #define clean_errno() (errno == 0 ? "None" : strerror(errno))
22 
23 #if defined (LOG_NO_COLORS) || defined (_WIN32)
24   #define log_error(M, ...) fprintf(stderr, "ERR   " M " at %s (%s:%d) errno:%s\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno())
25   #define log_warn(M, ...)  fprintf(stderr, "WARN  " M " at %s (%s:%d) errno:%s\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno())
26   #define log_info(M, ...)  fprintf(stderr, "INFO  " M " at %s (%s:%d)\n", ##__VA_ARGS__, __func__, __FILENAME__, __LINE__)
27   #define log_debug(M, ...) fprintf(stderr, "DEBUG " M " at %s (%s:%d)\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__)
28 #else
29   #define log_error(M, ...) fprintf(stderr, "\33[31mERR\33[39m   " M "  \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno())
30   #define log_warn(M, ...)  fprintf(stderr, "\33[91mWARN\33[39m  " M "  \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno())
31   #define log_info(M, ...)  fprintf(stderr, "\33[32mINFO\33[39m  " M "  \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILENAME__, __LINE__)
32   #define log_debug(M, ...) fprintf(stderr, "\33[34mDEBUG\33[39m " M "  \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__)
33 #endif /* NOCOLORS */
34 
35 #if LOG_LEVEL > LOG_LEVEL_ERROR
36 #undef log_error
37 #define log_error(M, ...) do { if (0) fprintf(stderr, "\33[31mERR\33[39m   " M "  \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()); } while(0)
38 #endif
39 
40 #if LOG_LEVEL > LOG_LEVEL_WARN
41 #undef log_warn
42 #define log_warn(M, ...)  do { if (0) fprintf(stderr, "\33[91mWARN\33[39m  " M "  \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()); } while (0)
43 #endif
44 
45 #if LOG_LEVEL > LOG_LEVEL_INFO
46 #undef log_info
47 #define log_info(M, ...)  do { if (0) fprintf(stderr, "\33[32mINFO\33[39m  " M "  \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILENAME__, __LINE__); } while (0)
48 #endif
49 
50 #if LOG_LEVEL > LOG_LEVEL_DEBUG
51 #undef log_debug
52 #define log_debug(M, ...) do { if (0) fprintf(stderr, "\33[34mDEBUG\33[39m " M "  \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__); } while (0)
53 #endif
54 
55 #endif //LOG_H
56