Commit | Line | Data |
---|---|---|
7e8f2e9c JG |
1 | /* |
2 | * Copyright (C) 2021 Jérémie Galarneau <jeremie.galarneau@efficios.com> | |
3 | * | |
4 | * SPDX-License-Identifier: GPL-2.0-only | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "loglevel.h" | |
9 | #include <string.h> | |
f41294ed | 10 | #include <strings.h> |
7e8f2e9c JG |
11 | #include <ctype.h> |
12 | #include <assert.h> | |
13 | ||
7e8f2e9c JG |
14 | struct loglevel_name_value { |
15 | const char *name; | |
16 | int value; | |
17 | }; | |
18 | ||
19 | static | |
20 | const struct loglevel_name_value loglevel_values[] = { | |
7e8f2e9c | 21 | { .name = "EMERG", .value = LTTNG_LOGLEVEL_EMERG }, |
85b05318 | 22 | { .name = "TRACE_EMERG", .value = LTTNG_LOGLEVEL_EMERG }, |
7e8f2e9c | 23 | { .name = "ALERT", .value = LTTNG_LOGLEVEL_ALERT }, |
85b05318 | 24 | { .name = "TRACE_ALERT", .value = LTTNG_LOGLEVEL_ALERT }, |
7e8f2e9c | 25 | { .name = "CRIT", .value = LTTNG_LOGLEVEL_CRIT }, |
85b05318 | 26 | { .name = "TRACE_CRIT", .value = LTTNG_LOGLEVEL_CRIT }, |
7e8f2e9c | 27 | { .name = "ERR", .value = LTTNG_LOGLEVEL_ERR }, |
85b05318 | 28 | { .name = "TRACE_ERR", .value = LTTNG_LOGLEVEL_ERR }, |
7e8f2e9c | 29 | { .name = "WARNING", .value = LTTNG_LOGLEVEL_WARNING }, |
85b05318 | 30 | { .name = "TRACE_WARNING", .value = LTTNG_LOGLEVEL_WARNING }, |
7e8f2e9c | 31 | { .name = "NOTICE", .value = LTTNG_LOGLEVEL_NOTICE }, |
85b05318 | 32 | { .name = "TRACE_NOTICE", .value = LTTNG_LOGLEVEL_NOTICE }, |
7e8f2e9c | 33 | { .name = "INFO", .value = LTTNG_LOGLEVEL_INFO }, |
85b05318 | 34 | { .name = "TRACE_INFO", .value = LTTNG_LOGLEVEL_INFO }, |
7e8f2e9c | 35 | { .name = "DEBUG_SYSTEM", .value = LTTNG_LOGLEVEL_DEBUG_SYSTEM }, |
85b05318 | 36 | { .name = "TRACE_DEBUG_SYSTEM", .value = LTTNG_LOGLEVEL_DEBUG_SYSTEM }, |
7e8f2e9c | 37 | { .name = "SYSTEM", .value = LTTNG_LOGLEVEL_DEBUG_SYSTEM }, |
7e8f2e9c | 38 | { .name = "DEBUG_PROGRAM", .value = LTTNG_LOGLEVEL_DEBUG_PROGRAM }, |
85b05318 | 39 | { .name = "TRACE_DEBUG_PROGRAM", .value = LTTNG_LOGLEVEL_DEBUG_PROGRAM }, |
7e8f2e9c | 40 | { .name = "PROGRAM", .value = LTTNG_LOGLEVEL_DEBUG_PROGRAM }, |
7e8f2e9c | 41 | { .name = "DEBUG_PROCESS", .value = LTTNG_LOGLEVEL_DEBUG_PROCESS }, |
85b05318 | 42 | { .name = "TRACE_DEBUG_PROCESS", .value = LTTNG_LOGLEVEL_DEBUG_PROCESS }, |
7e8f2e9c | 43 | { .name = "PROCESS", .value = LTTNG_LOGLEVEL_DEBUG_PROCESS }, |
7e8f2e9c | 44 | { .name = "DEBUG_MODULE", .value = LTTNG_LOGLEVEL_DEBUG_MODULE }, |
85b05318 | 45 | { .name = "TRACE_DEBUG_MODULE", .value = LTTNG_LOGLEVEL_DEBUG_MODULE }, |
7e8f2e9c | 46 | { .name = "MODULE", .value = LTTNG_LOGLEVEL_DEBUG_MODULE }, |
7e8f2e9c | 47 | { .name = "DEBUG_UNIT", .value = LTTNG_LOGLEVEL_DEBUG_UNIT }, |
85b05318 | 48 | { .name = "TRACE_DEBUG_UNIT", .value = LTTNG_LOGLEVEL_DEBUG_UNIT }, |
7e8f2e9c | 49 | { .name = "UNIT", .value = LTTNG_LOGLEVEL_DEBUG_UNIT }, |
7e8f2e9c | 50 | { .name = "DEBUG_FUNCTION", .value = LTTNG_LOGLEVEL_DEBUG_FUNCTION }, |
85b05318 | 51 | { .name = "TRACE_DEBUG_FUNCTION", .value = LTTNG_LOGLEVEL_DEBUG_FUNCTION }, |
7e8f2e9c | 52 | { .name = "FUNCTION", .value = LTTNG_LOGLEVEL_DEBUG_FUNCTION }, |
7e8f2e9c | 53 | { .name = "DEBUG_LINE", .value = LTTNG_LOGLEVEL_DEBUG_LINE }, |
85b05318 | 54 | { .name = "TRACE_DEBUG_LINE", .value = LTTNG_LOGLEVEL_DEBUG_LINE }, |
7e8f2e9c | 55 | { .name = "LINE", .value = LTTNG_LOGLEVEL_DEBUG_LINE }, |
7e8f2e9c | 56 | { .name = "DEBUG", .value = LTTNG_LOGLEVEL_DEBUG }, |
85b05318 | 57 | { .name = "TRACE_DEBUG", .value = LTTNG_LOGLEVEL_DEBUG }, |
7e8f2e9c JG |
58 | }; |
59 | ||
60 | static | |
61 | const struct loglevel_name_value loglevel_log4j_values[] = { | |
7e8f2e9c | 62 | { .name = "OFF", .value = LTTNG_LOGLEVEL_LOG4J_OFF }, |
85b05318 | 63 | { .name = "LOG4J_OFF", .value = LTTNG_LOGLEVEL_LOG4J_OFF }, |
7e8f2e9c | 64 | { .name = "FATAL", .value = LTTNG_LOGLEVEL_LOG4J_FATAL }, |
85b05318 | 65 | { .name = "LOG4J_FATAL", .value = LTTNG_LOGLEVEL_LOG4J_FATAL }, |
7e8f2e9c | 66 | { .name = "ERROR", .value = LTTNG_LOGLEVEL_LOG4J_ERROR }, |
85b05318 | 67 | { .name = "LOG4J_ERROR", .value = LTTNG_LOGLEVEL_LOG4J_ERROR }, |
7e8f2e9c | 68 | { .name = "WARN", .value = LTTNG_LOGLEVEL_LOG4J_WARN }, |
85b05318 | 69 | { .name = "LOG4J_WARN", .value = LTTNG_LOGLEVEL_LOG4J_WARN }, |
7e8f2e9c | 70 | { .name = "INFO", .value = LTTNG_LOGLEVEL_LOG4J_INFO }, |
85b05318 | 71 | { .name = "LOG4J_INFO", .value = LTTNG_LOGLEVEL_LOG4J_INFO }, |
7e8f2e9c | 72 | { .name = "DEBUG", .value = LTTNG_LOGLEVEL_LOG4J_DEBUG }, |
85b05318 | 73 | { .name = "LOG4J_DEBUG", .value = LTTNG_LOGLEVEL_LOG4J_DEBUG }, |
7e8f2e9c | 74 | { .name = "TRACE", .value = LTTNG_LOGLEVEL_LOG4J_TRACE }, |
85b05318 | 75 | { .name = "LOG4J_TRACE", .value = LTTNG_LOGLEVEL_LOG4J_TRACE }, |
7e8f2e9c | 76 | { .name = "ALL", .value = LTTNG_LOGLEVEL_LOG4J_ALL }, |
85b05318 | 77 | { .name = "LOG4J_ALL", .value = LTTNG_LOGLEVEL_LOG4J_ALL }, |
7e8f2e9c JG |
78 | }; |
79 | ||
80 | static | |
81 | const struct loglevel_name_value loglevel_jul_values[] = { | |
7e8f2e9c | 82 | { .name = "OFF", .value = LTTNG_LOGLEVEL_JUL_OFF }, |
85b05318 | 83 | { .name = "JUL_OFF", .value = LTTNG_LOGLEVEL_JUL_OFF }, |
7e8f2e9c | 84 | { .name = "SEVERE", .value = LTTNG_LOGLEVEL_JUL_SEVERE }, |
85b05318 | 85 | { .name = "JUL_SEVERE", .value = LTTNG_LOGLEVEL_JUL_SEVERE }, |
7e8f2e9c | 86 | { .name = "WARNING", .value = LTTNG_LOGLEVEL_JUL_WARNING }, |
85b05318 | 87 | { .name = "JUL_WARNING", .value = LTTNG_LOGLEVEL_JUL_WARNING }, |
7e8f2e9c | 88 | { .name = "INFO", .value = LTTNG_LOGLEVEL_JUL_INFO }, |
85b05318 | 89 | { .name = "JUL_INFO", .value = LTTNG_LOGLEVEL_JUL_INFO }, |
7e8f2e9c | 90 | { .name = "CONFIG", .value = LTTNG_LOGLEVEL_JUL_CONFIG }, |
85b05318 | 91 | { .name = "JUL_CONFIG", .value = LTTNG_LOGLEVEL_JUL_CONFIG }, |
7e8f2e9c | 92 | { .name = "FINE", .value = LTTNG_LOGLEVEL_JUL_FINE }, |
85b05318 | 93 | { .name = "JUL_FINE", .value = LTTNG_LOGLEVEL_JUL_FINE }, |
7e8f2e9c | 94 | { .name = "FINER", .value = LTTNG_LOGLEVEL_JUL_FINER }, |
85b05318 | 95 | { .name = "JUL_FINER", .value = LTTNG_LOGLEVEL_JUL_FINER }, |
7e8f2e9c | 96 | { .name = "FINEST", .value = LTTNG_LOGLEVEL_JUL_FINEST }, |
85b05318 | 97 | { .name = "JUL_FINEST", .value = LTTNG_LOGLEVEL_JUL_FINEST }, |
7e8f2e9c | 98 | { .name = "ALL", .value = LTTNG_LOGLEVEL_JUL_ALL }, |
85b05318 | 99 | { .name = "JUL_ALL", .value = LTTNG_LOGLEVEL_JUL_ALL }, |
7e8f2e9c JG |
100 | }; |
101 | ||
102 | static | |
103 | const struct loglevel_name_value loglevel_python_values[] = { | |
7e8f2e9c | 104 | { .name = "CRITICAL", .value = LTTNG_LOGLEVEL_PYTHON_CRITICAL }, |
85b05318 | 105 | { .name = "PYTHON_CRITICAL", .value = LTTNG_LOGLEVEL_PYTHON_CRITICAL }, |
7e8f2e9c | 106 | { .name = "ERROR", .value = LTTNG_LOGLEVEL_PYTHON_ERROR }, |
85b05318 | 107 | { .name = "PYTHON_ERROR", .value = LTTNG_LOGLEVEL_PYTHON_ERROR }, |
7e8f2e9c | 108 | { .name = "WARNING", .value = LTTNG_LOGLEVEL_PYTHON_WARNING }, |
85b05318 | 109 | { .name = "PYTHON_WARNING", .value = LTTNG_LOGLEVEL_PYTHON_WARNING }, |
7e8f2e9c | 110 | { .name = "INFO", .value = LTTNG_LOGLEVEL_PYTHON_INFO }, |
85b05318 | 111 | { .name = "PYTHON_INFO", .value = LTTNG_LOGLEVEL_PYTHON_INFO }, |
7e8f2e9c | 112 | { .name = "DEBUG", .value = LTTNG_LOGLEVEL_PYTHON_DEBUG }, |
85b05318 | 113 | { .name = "PYTNON_DEBUG", .value = LTTNG_LOGLEVEL_PYTHON_DEBUG }, |
7e8f2e9c | 114 | { .name = "NOTSET", .value = LTTNG_LOGLEVEL_PYTHON_NOTSET }, |
85b05318 | 115 | { .name = "PYTHON_NOTSET", .value = LTTNG_LOGLEVEL_PYTHON_NOTSET }, |
7e8f2e9c JG |
116 | }; |
117 | ||
118 | static | |
119 | bool string_equal_insensitive(const char *a, const char *b) | |
120 | { | |
f41294ed | 121 | return strcasecmp(a, b) == 0; |
7e8f2e9c JG |
122 | } |
123 | ||
124 | static | |
125 | int lookup_value_from_name(const struct loglevel_name_value values[], | |
126 | size_t values_count, const char *name) | |
127 | { | |
128 | size_t i; | |
129 | int ret = -1; | |
130 | ||
131 | if (!name) { | |
132 | goto end; | |
133 | } | |
134 | ||
135 | for (i = 0; i < values_count; i++) { | |
136 | if (string_equal_insensitive(values[i].name, name)) { | |
137 | /* Match found. */ | |
138 | ret = values[i].value; | |
139 | goto end; | |
140 | } | |
141 | } | |
142 | ||
143 | end: | |
144 | return ret; | |
145 | } | |
146 | ||
147 | LTTNG_HIDDEN | |
148 | int loglevel_name_to_value(const char *name, enum lttng_loglevel *loglevel) | |
149 | { | |
150 | int ret = lookup_value_from_name(loglevel_values, | |
00608d5a | 151 | ARRAY_SIZE(loglevel_values), name); |
7e8f2e9c JG |
152 | |
153 | if (ret >= 0) { | |
154 | *loglevel = (typeof(*loglevel)) ret; | |
155 | ret = 0; | |
156 | } | |
157 | ||
158 | return ret; | |
159 | } | |
160 | ||
161 | LTTNG_HIDDEN | |
162 | int loglevel_log4j_name_to_value( | |
163 | const char *name, enum lttng_loglevel_log4j *loglevel) | |
164 | { | |
165 | int ret = lookup_value_from_name(loglevel_log4j_values, | |
00608d5a | 166 | ARRAY_SIZE(loglevel_log4j_values), |
7e8f2e9c JG |
167 | name); |
168 | ||
169 | if (ret >= 0) { | |
170 | *loglevel = (typeof(*loglevel)) ret; | |
171 | ret = 0; | |
172 | } | |
173 | ||
174 | return ret; | |
175 | } | |
176 | ||
177 | LTTNG_HIDDEN | |
178 | int loglevel_jul_name_to_value( | |
179 | const char *name, enum lttng_loglevel_jul *loglevel) | |
180 | { | |
181 | int ret = lookup_value_from_name(loglevel_jul_values, | |
00608d5a | 182 | ARRAY_SIZE(loglevel_jul_values), |
7e8f2e9c JG |
183 | name); |
184 | ||
185 | if (ret >= 0) { | |
186 | *loglevel = (typeof(*loglevel)) ret; | |
187 | ret = 0; | |
188 | } | |
189 | ||
190 | return ret; | |
191 | } | |
192 | ||
193 | LTTNG_HIDDEN | |
194 | int loglevel_python_name_to_value( | |
195 | const char *name, enum lttng_loglevel_python *loglevel) | |
196 | { | |
197 | int ret = lookup_value_from_name(loglevel_python_values, | |
00608d5a | 198 | ARRAY_SIZE(loglevel_python_values), |
7e8f2e9c JG |
199 | name); |
200 | ||
201 | if (ret >= 0) { | |
202 | *loglevel = (typeof(*loglevel)) ret; | |
203 | ret = 0; | |
204 | } | |
205 | ||
206 | return ret; | |
00608d5a | 207 | } |
85b05318 JR |
208 | |
209 | static | |
210 | const char *lookup_name_from_value(const struct loglevel_name_value values[], | |
211 | size_t values_count, int loglevel) | |
212 | { | |
213 | size_t i; | |
214 | const char *name = NULL; | |
215 | ||
216 | for (i = 0; i < values_count; i++) { | |
217 | if (values[i].value == loglevel) { | |
218 | /* Match found. */ | |
219 | name = values[i].name; | |
220 | goto end; | |
221 | } | |
222 | } | |
223 | ||
224 | end: | |
225 | return name; | |
226 | } | |
227 | ||
228 | LTTNG_HIDDEN | |
229 | const char *loglevel_value_to_name(int loglevel) | |
230 | { | |
231 | return lookup_name_from_value( | |
232 | loglevel_values, ARRAY_SIZE(loglevel_values), loglevel); | |
233 | } | |
234 | ||
235 | LTTNG_HIDDEN | |
236 | const char *loglevel_log4j_value_to_name(int loglevel) | |
237 | { | |
238 | return lookup_name_from_value(loglevel_log4j_values, | |
239 | ARRAY_SIZE(loglevel_log4j_values), loglevel); | |
240 | } | |
241 | ||
242 | LTTNG_HIDDEN | |
243 | const char *loglevel_jul_value_to_name(int loglevel) | |
244 | { | |
245 | return lookup_name_from_value(loglevel_jul_values, | |
246 | ARRAY_SIZE(loglevel_jul_values), loglevel); | |
247 | } | |
248 | ||
249 | LTTNG_HIDDEN | |
250 | const char *loglevel_python_value_to_name(int loglevel) | |
251 | { | |
252 | return lookup_name_from_value(loglevel_python_values, | |
253 | ARRAY_SIZE(loglevel_python_values), loglevel); | |
254 | } |