1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#include <stdbool.h>
//#define ANY_LOG_LOCKING
#define ANY_LOG_IMPLEMENT
#define ANY_LOG_MODULE "test"
#define ANY_LOG_VALUE_BEFORE(level, module, func, message) \
"{\"module\": \"%s\", \"function\": \"%s\", \"level\": \"%s\", \"message\": \"%s\", ", \
module, func, any_log_level_strings[level], message
#define ANY_LOG_VALUE_BOOL(key, value) "\"%s\": %s", key, (value ? "true" : "false")
#define ANY_LOG_VALUE_INT(key, value) "\"%s\": %d", key, value
#define ANY_LOG_VALUE_HEX(key, value) "\"%s\": %u", key, value
#define ANY_LOG_VALUE_LONG(key, value) "\"%s\": %ld", key, value
#define ANY_LOG_VALUE_PTR(key, value) "\"%s\": \"%p\"", key, value
#define ANY_LOG_VALUE_DOUBLE(key, value) "\"%s\": %lf", key, value
#define ANY_LOG_VALUE_STRING(key, value) "\"%s \": \"%s\"", key, value
#define ANY_LOG_VALUE_GENERIC(key, stream, formatter, value) \
do { \
fprintf(stream, "\"%s\": ", key); \
formatter(stream, value); \
} while (false)
#define ANY_LOG_VALUE_AFTER(level, module, func, message) "}\n"
#include "any_log.h"
struct pair {
const char *s1, *s2;
};
void pairs_format(FILE *stream, struct pair *pairs)
{
fprintf(stream, "[");
while (pairs->s1 && pairs->s2) {
fprintf(stream, "%s -> %s", pairs->s1, pairs->s2);
pairs++;
if (pairs->s1 && pairs->s2)
fprintf(stream, ", ");
}
fprintf(stream, "]");
}
int main()
{
any_log_init(ANY_LOG_DEBUG, stdout);
FILE *streams[ANY_LOG_ALL] = {
stderr, //ANY_LOG_PANIC
stderr, //ANY_LOG_ERROR
stdout, //ANY_LOG_WARN
stdout, //ANY_LOG_INFO
stdout, //ANY_LOG_DEBUG
stdout, //ANY_LOG_TRACE
};
memcpy(any_log_streams, streams, sizeof(streams));
// Test any_log_level_to_string
log_trace("ANY_LOG_PANIC = %s", any_log_level_to_string(ANY_LOG_PANIC));
log_trace("ANY_LOG_ERROR = %s", any_log_level_to_string(ANY_LOG_ERROR));
log_trace("ANY_LOG_WARN = %s", any_log_level_to_string(ANY_LOG_WARN));
log_trace("ANY_LOG_INFO = %s", any_log_level_to_string(ANY_LOG_INFO));
log_trace("ANY_LOG_DEBUG = %s", any_log_level_to_string(ANY_LOG_DEBUG));
log_trace("ANY_LOG_TRACE = %s", any_log_level_to_string(ANY_LOG_TRACE));
log_trace("ANY_LOG_ALL = %s", any_log_level_to_string(ANY_LOG_ALL));
// Test any_log_level_from_string
log_trace("ANY_LOG_PANIC = %d = %d", ANY_LOG_PANIC,
any_log_level_from_string(ANY_LOG_PANIC_STRING));
log_trace("ANY_LOG_ERROR = %d = %d", ANY_LOG_ERROR,
any_log_level_from_string(ANY_LOG_ERROR_STRING));
log_trace("ANY_LOG_WARN = %d = %d", ANY_LOG_WARN,
any_log_level_from_string(ANY_LOG_WARN_STRING));
log_trace("ANY_LOG_INFO = %d = %d", ANY_LOG_INFO,
any_log_level_from_string(ANY_LOG_INFO_STRING));
log_trace("ANY_LOG_DEBUG = %d = %d", ANY_LOG_DEBUG,
any_log_level_from_string(ANY_LOG_DEBUG_STRING));
log_trace("ANY_LOG_TRACE = %d = %d", ANY_LOG_TRACE,
any_log_level_from_string(ANY_LOG_TRACE_STRING));
// Test any_log_value
log_value_warn("Hello",
"this is a", "string");
log_value_info("I'll try",
"d:this is ", 10,
"f:dbl", 20.3333,
"p:a", NULL);
struct pair pairs[] = {
{ "v", "v2" },
{ "p", "xp" },
{ "23", "42" },
{ NULL, NULL },
};
log_value_info("Created graphical context",
"d:width", 100,
"d:height", 200,
"p:window", NULL,
"f:scale", 1.23,
"b:hidden", true,
"g:pairs", ANY_LOG_FORMATTER(pairs_format), pairs,
"appname", "nice app");
// Test any_log_format
log_trace("Hello");
log_debug("Hello");
log_info("Hello");
log_warn("Hello");
log_error("Hello");
log_panic("Hello");
return 0;
}
|