Flecs v3.2
A fast entity component system (ECS) for C & C++
Loading...
Searching...
No Matches
log.h
Go to the documentation of this file.
1
28#ifndef FLECS_LOG_H
29#define FLECS_LOG_H
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35#ifdef FLECS_LOG
36
48
49FLECS_API
50void _ecs_deprecated(
51 const char *file,
52 int32_t line,
53 const char *msg);
54
61FLECS_API
62void _ecs_log_push(int32_t level);
63
70FLECS_API
71void _ecs_log_pop(int32_t level);
72
80FLECS_API
81bool ecs_should_log(int32_t level);
82
86
88FLECS_API
89const char* ecs_strerror(
90 int32_t error_code);
91
92#else // FLECS_LOG
93
97
98#define _ecs_deprecated(file, line, msg)\
99 (void)file;\
100 (void)line;\
101 (void)msg
102
103#define _ecs_log_push(level)
104#define _ecs_log_pop(level)
105#define ecs_should_log(level) false
106
107#define ecs_strerror(error_code)\
108 (void)error_code
109
110#endif // FLECS_LOG
111
112
116
117FLECS_API
118void _ecs_print(
119 int32_t level,
120 const char *file,
121 int32_t line,
122 const char *fmt,
123 ...);
124
125FLECS_API
126void _ecs_printv(
127 int level,
128 const char *file,
129 int32_t line,
130 const char *fmt,
131 va_list args);
132
133FLECS_API
134void _ecs_log(
135 int32_t level,
136 const char *file,
137 int32_t line,
138 const char *fmt,
139 ...);
140
141FLECS_API
142void _ecs_logv(
143 int level,
144 const char *file,
145 int32_t line,
146 const char *fmt,
147 va_list args);
148
149FLECS_API
150void _ecs_abort(
151 int32_t error_code,
152 const char *file,
153 int32_t line,
154 const char *fmt,
155 ...);
156
157FLECS_API
158bool _ecs_assert(
159 bool condition,
160 int32_t error_code,
161 const char *condition_str,
162 const char *file,
163 int32_t line,
164 const char *fmt,
165 ...);
166
167FLECS_API
168void _ecs_parser_error(
169 const char *name,
170 const char *expr,
171 int64_t column,
172 const char *fmt,
173 ...);
174
175FLECS_API
176void _ecs_parser_errorv(
177 const char *name,
178 const char *expr,
179 int64_t column,
180 const char *fmt,
181 va_list args);
182
183
187
188#ifndef FLECS_LEGACY /* C89 doesn't support variadic macros */
189
190/* Base logging function. Accepts a custom level */
191#define ecs_print(level, ...)\
192 _ecs_print(level, __FILE__, __LINE__, __VA_ARGS__)
193
194#define ecs_printv(level, fmt, args)\
195 _ecs_printv(level, __FILE__, __LINE__, fmt, args)
196
197#define ecs_log(level, ...)\
198 _ecs_log(level, __FILE__, __LINE__, __VA_ARGS__)
199
200#define ecs_logv(level, fmt, args)\
201 _ecs_logv(level, __FILE__, __LINE__, fmt, args)
202
203/* Tracing. Used for logging of infrequent events */
204#define _ecs_trace(file, line, ...) _ecs_log(0, file, line, __VA_ARGS__)
205#define ecs_trace(...) _ecs_trace(__FILE__, __LINE__, __VA_ARGS__)
206
207/* Warning. Used when an issue occurs, but operation is successful */
208#define _ecs_warn(file, line, ...) _ecs_log(-2, file, line, __VA_ARGS__)
209#define ecs_warn(...) _ecs_warn(__FILE__, __LINE__, __VA_ARGS__)
210
211/* Error. Used when an issue occurs, and operation failed. */
212#define _ecs_err(file, line, ...) _ecs_log(-3, file, line, __VA_ARGS__)
213#define ecs_err(...) _ecs_err(__FILE__, __LINE__, __VA_ARGS__)
214
215/* Fatal. Used when an issue occurs, and the application cannot continue. */
216#define _ecs_fatal(file, line, ...) _ecs_log(-4, file, line, __VA_ARGS__)
217#define ecs_fatal(...) _ecs_fatal(__FILE__, __LINE__, __VA_ARGS__)
218
219/* Optionally include warnings about using deprecated features */
220#ifndef FLECS_NO_DEPRECATED_WARNINGS
221#define ecs_deprecated(...)\
222 _ecs_deprecated(__FILE__, __LINE__, __VA_ARGS__)
223#else
224#define ecs_deprecated(...)
225#endif // FLECS_NO_DEPRECATED_WARNINGS
226
227/* If no tracing verbosity is defined, pick default based on build config */
228#if !(defined(FLECS_LOG_0) || defined(FLECS_LOG_1) || defined(FLECS_LOG_2) || defined(FLECS_LOG_3))
229#if !defined(FLECS_NDEBUG)
230#define FLECS_LOG_3 /* Enable all tracing in debug mode. May slow things down */
231#else
232#define FLECS_LOG_0 /* Only enable infrequent tracing in release mode */
233#endif // !defined(FLECS_NDEBUG)
234#endif // !(defined(FLECS_LOG_0) || defined(FLECS_LOG_1) || defined(FLECS_LOG_2) || defined(FLECS_LOG_3))
235
236
237/* Define/undefine macros based on compiled-in tracing level. This can optimize
238 * out tracing statements from a build, which improves performance. */
239
240#if defined(FLECS_LOG_3) /* All debug tracing enabled */
241#define ecs_dbg_1(...) ecs_log(1, __VA_ARGS__);
242#define ecs_dbg_2(...) ecs_log(2, __VA_ARGS__);
243#define ecs_dbg_3(...) ecs_log(3, __VA_ARGS__);
244
245#define ecs_log_push_1() _ecs_log_push(1);
246#define ecs_log_push_2() _ecs_log_push(2);
247#define ecs_log_push_3() _ecs_log_push(3);
248
249#define ecs_log_pop_1() _ecs_log_pop(1);
250#define ecs_log_pop_2() _ecs_log_pop(2);
251#define ecs_log_pop_3() _ecs_log_pop(3);
252
253#define ecs_should_log_1() ecs_should_log(1)
254#define ecs_should_log_2() ecs_should_log(2)
255#define ecs_should_log_3() ecs_should_log(3)
256
257#define FLECS_LOG_2
258#define FLECS_LOG_1
259#define FLECS_LOG_0
260
261#elif defined(FLECS_LOG_2) /* Level 2 and below debug tracing enabled */
262#define ecs_dbg_1(...) ecs_log(1, __VA_ARGS__);
263#define ecs_dbg_2(...) ecs_log(2, __VA_ARGS__);
264#define ecs_dbg_3(...)
265
266#define ecs_log_push_1() _ecs_log_push(1);
267#define ecs_log_push_2() _ecs_log_push(2);
268#define ecs_log_push_3()
269
270#define ecs_log_pop_1() _ecs_log_pop(1);
271#define ecs_log_pop_2() _ecs_log_pop(2);
272#define ecs_log_pop_3()
273
274#define ecs_should_log_1() ecs_should_log(1)
275#define ecs_should_log_2() ecs_should_log(2)
276#define ecs_should_log_3() false
277
278#define FLECS_LOG_1
279#define FLECS_LOG_0
280
281#elif defined(FLECS_LOG_1) /* Level 1 debug tracing enabled */
282#define ecs_dbg_1(...) ecs_log(1, __VA_ARGS__);
283#define ecs_dbg_2(...)
284#define ecs_dbg_3(...)
285
286#define ecs_log_push_1() _ecs_log_push(1);
287#define ecs_log_push_2()
288#define ecs_log_push_3()
289
290#define ecs_log_pop_1() _ecs_log_pop(1);
291#define ecs_log_pop_2()
292#define ecs_log_pop_3()
293
294#define ecs_should_log_1() ecs_should_log(1)
295#define ecs_should_log_2() false
296#define ecs_should_log_3() false
297
298#define FLECS_LOG_0
299
300#elif defined(FLECS_LOG_0) /* No debug tracing enabled */
301#define ecs_dbg_1(...)
302#define ecs_dbg_2(...)
303#define ecs_dbg_3(...)
304
305#define ecs_log_push_1()
306#define ecs_log_push_2()
307#define ecs_log_push_3()
308
309#define ecs_log_pop_1()
310#define ecs_log_pop_2()
311#define ecs_log_pop_3()
312
313#define ecs_should_log_1() false
314#define ecs_should_log_2() false
315#define ecs_should_log_3() false
316
317#else /* No tracing enabled */
318#undef ecs_trace
319#define ecs_trace(...)
320#define ecs_dbg_1(...)
321#define ecs_dbg_2(...)
322#define ecs_dbg_3(...)
323
324#define ecs_log_push_1()
325#define ecs_log_push_2()
326#define ecs_log_push_3()
327
328#define ecs_log_pop_1()
329#define ecs_log_pop_2()
330#define ecs_log_pop_3()
331
332#endif // defined(FLECS_LOG_3)
333
334/* Default debug tracing is at level 1 */
335#define ecs_dbg ecs_dbg_1
336
337/* Default level for push/pop is 0 */
338#define ecs_log_push() _ecs_log_push(0)
339#define ecs_log_pop() _ecs_log_pop(0)
340
343#define ecs_abort(error_code, ...)\
344 _ecs_abort(error_code, __FILE__, __LINE__, __VA_ARGS__);\
345 ecs_os_abort(); abort(); /* satisfy compiler/static analyzers */
346
349#if defined(FLECS_NDEBUG) && !defined(FLECS_KEEP_ASSERT)
350#define ecs_assert(condition, error_code, ...)
351#else
352#define ecs_assert(condition, error_code, ...)\
353 if (!_ecs_assert(condition, error_code, #condition, __FILE__, __LINE__, __VA_ARGS__)) {\
354 ecs_os_abort();\
355 }\
356 assert(condition) /* satisfy compiler/static analyzers */
357#endif // FLECS_NDEBUG
358
359#define ecs_assert_var(var, error_code, ...)\
360 ecs_assert(var, error_code, __VA_ARGS__);\
361 (void)var
362
365#ifndef FLECS_NDEBUG
366#define ecs_dbg_assert(condition, error_code, ...) ecs_assert(condition, error_code, __VA_ARGS__)
367#else
368#define ecs_dbg_assert(condition, error_code, ...)
369#endif
370
371/* Silence dead code/unused label warnings when compiling without checks. */
372#define ecs_dummy_check\
373 if ((false)) {\
374 goto error;\
375 }
376
379#if defined(FLECS_NDEBUG) && !defined(FLECS_KEEP_ASSERT)
380#define ecs_check(condition, error_code, ...) ecs_dummy_check
381#else
382#ifdef FLECS_SOFT_ASSERT
383#define ecs_check(condition, error_code, ...)\
384 if (!_ecs_assert(condition, error_code, #condition, __FILE__, __LINE__, __VA_ARGS__)) {\
385 goto error;\
386 }
387#else // FLECS_SOFT_ASSERT
388#define ecs_check(condition, error_code, ...)\
389 ecs_assert(condition, error_code, __VA_ARGS__);\
390 ecs_dummy_check
391#endif
392#endif // FLECS_NDEBUG
393
396#if defined(FLECS_NDEBUG) && !defined(FLECS_KEEP_ASSERT)
397#define ecs_throw(error_code, ...) ecs_dummy_check
398#else
399#ifdef FLECS_SOFT_ASSERT
400#define ecs_throw(error_code, ...)\
401 _ecs_abort(error_code, __FILE__, __LINE__, __VA_ARGS__);\
402 goto error;
403#else
404#define ecs_throw(error_code, ...)\
405 ecs_abort(error_code, __VA_ARGS__);\
406 ecs_dummy_check
407#endif
408#endif // FLECS_NDEBUG
409
411#define ecs_parser_error(name, expr, column, ...)\
412 _ecs_parser_error(name, expr, column, __VA_ARGS__)
413
414#define ecs_parser_errorv(name, expr, column, fmt, args)\
415 _ecs_parser_errorv(name, expr, column, fmt, args)
416
417#endif // FLECS_LEGACY
418
419
423
442FLECS_API
444 int level);
445
450FLECS_API
452
459FLECS_API
461 bool enabled);
462
470FLECS_API
472 bool enabled);
473
487FLECS_API
489 bool enabled);
490
496FLECS_API
498
499
503
504#define ECS_INVALID_OPERATION (1)
505#define ECS_INVALID_PARAMETER (2)
506#define ECS_CONSTRAINT_VIOLATED (3)
507#define ECS_OUT_OF_MEMORY (4)
508#define ECS_OUT_OF_RANGE (5)
509#define ECS_UNSUPPORTED (6)
510#define ECS_INTERNAL_ERROR (7)
511#define ECS_ALREADY_DEFINED (8)
512#define ECS_MISSING_OS_API (9)
513#define ECS_OPERATION_FAILED (10)
514#define ECS_INVALID_CONVERSION (11)
515#define ECS_ID_IN_USE (12)
516#define ECS_CYCLE_DETECTED (13)
517#define ECS_LEAK_DETECTED (14)
518
519#define ECS_INCONSISTENT_NAME (20)
520#define ECS_NAME_IN_USE (21)
521#define ECS_NOT_A_COMPONENT (22)
522#define ECS_INVALID_COMPONENT_SIZE (23)
523#define ECS_INVALID_COMPONENT_ALIGNMENT (24)
524#define ECS_COMPONENT_NOT_REGISTERED (25)
525#define ECS_INCONSISTENT_COMPONENT_ID (26)
526#define ECS_INCONSISTENT_COMPONENT_ACTION (27)
527#define ECS_MODULE_UNDEFINED (28)
528#define ECS_MISSING_SYMBOL (29)
529#define ECS_ALREADY_IN_USE (30)
530
531#define ECS_ACCESS_VIOLATION (40)
532#define ECS_COLUMN_INDEX_OUT_OF_RANGE (41)
533#define ECS_COLUMN_IS_NOT_SHARED (42)
534#define ECS_COLUMN_IS_SHARED (43)
535#define ECS_COLUMN_TYPE_MISMATCH (45)
536
537#define ECS_INVALID_WHILE_READONLY (70)
538#define ECS_LOCKED_STORAGE (71)
539#define ECS_INVALID_FROM_WORKER (72)
540
541
545
546#define ECS_BLACK "\033[1;30m"
547#define ECS_RED "\033[0;31m"
548#define ECS_GREEN "\033[0;32m"
549#define ECS_YELLOW "\033[0;33m"
550#define ECS_BLUE "\033[0;34m"
551#define ECS_MAGENTA "\033[0;35m"
552#define ECS_CYAN "\033[0;36m"
553#define ECS_WHITE "\033[1;37m"
554#define ECS_GREY "\033[0;37m"
555#define ECS_NORMAL "\033[0;49m"
556#define ECS_BOLD "\033[1;49m"
557
558#ifdef __cplusplus
559}
560#endif
561
564#endif // FLECS_LOG_H
FLECS_API int ecs_log_last_error(void)
Get last logged error code.
FLECS_API void _ecs_log_pop(int32_t level)
Decrease log stack.
FLECS_API bool ecs_should_log(int32_t level)
Should current level be logged.
FLECS_API const char * ecs_strerror(int32_t error_code)
Get description for error code.
FLECS_API bool ecs_log_enable_colors(bool enabled)
Enable/disable tracing with colors.
FLECS_API int ecs_log_get_level(void)
Get current log level.
FLECS_API int ecs_log_set_level(int level)
Enable or disable log.
FLECS_API bool ecs_log_enable_timestamp(bool enabled)
Enable/disable logging timestamp.
FLECS_API void _ecs_log_push(int32_t level)
Increase log stack.
FLECS_API bool ecs_log_enable_timedelta(bool enabled)
Enable/disable logging time since last log.