1 | #ifndef MACROS_H |
2 | #define MACROS_H |
3 |
|
4 |
|
5 | #include <stdio.h> |
6 | #include <stdlib.h> |
7 | #include <stdarg.h> |
8 | #include <stdint.h> |
9 |
|
10 | #include <sys/time.h> |
11 |
|
12 | #define lnmCritical "CRITICAL" |
13 | #define lnmError "ERROR" |
14 | #define lnmWarn "WARN" |
15 | #define lnmInfo "INFO" |
16 | #define lnmDebug "DEBUG" |
17 | #define lnmTrace "TRACE" |
18 |
|
19 | #define lnm_line __LINE__ |
20 | #define lnm_file __FILE__ |
21 | #define lnm_func __func__ |
22 |
|
23 |
|
24 | uint64_t lnm_getus(void) { |
25 | uint64_t us; |
26 | struct timeval lnm_current_time; |
27 | gettimeofday(&lnm_current_time, NULL); |
28 | us = (lnm_current_time.tv_sec * 1000000ULL + lnm_current_time.tv_usec); |
29 | return us; |
30 | } |
31 |
|
32 |
|
33 | void log_print(FILE* logger, const char* verbosity, const char* format, ...) { |
34 | va_list args; |
35 | va_start(args, format); |
36 |
|
37 | // calculate buffer length |
38 | size_t buffer_size = vsnprintf(NULL, 0, format, args); |
39 | if (buffer_size > UINT16_MAX) { |
40 | printf("too big\n"); |
41 | } |
42 | char* buffer = malloc(buffer_size + 1); |
43 | va_end(args); |
44 |
|
45 | // pass to vsnprintf |
46 | va_start(args, format); |
47 | vsnprintf(buffer, buffer_size + 1, format, args); |
48 | va_end(args); |
49 |
|
50 | uint64_t timestamp = lnm_getus(); |
51 | fprintf(logger, "[%s] [%lu.%06lu] ", verbosity, timestamp/1000000, timestamp%1000000); |
52 |
|
53 | fputs(buffer, logger); |
54 | fputc('\n', logger); |
55 | free(buffer); |
56 | } |
57 |
|
58 |
|
59 | #endif // MACROS_H |
60 |
|