Flecs v4.1
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
55FLECS_API
57 const char *file,
58 int32_t line,
59 const char *msg);
60
67FLECS_API
68void ecs_log_push_(int32_t level);
69
76FLECS_API
77void ecs_log_pop_(int32_t level);
78
86FLECS_API
87bool ecs_should_log(int32_t level);
88
92
98FLECS_API
99const char* ecs_strerror(
100 int32_t error_code);
101
102#else // FLECS_LOG
103
107
108#define ecs_deprecated_(file, line, msg)\
109 (void)file;\
110 (void)line;\
111 (void)msg
112
113#define ecs_log_push_(level)
114#define ecs_log_pop_(level)
115#define ecs_should_log(level) false
116
117#define ecs_strerror(error_code)\
118 (void)error_code
119
120#endif // FLECS_LOG
121
122
126
134FLECS_API
136 int32_t level,
137 const char *file,
138 int32_t line,
139 const char *fmt,
140 ...);
141
150FLECS_API
152 int level,
153 const char *file,
154 int32_t line,
155 const char *fmt,
156 va_list args);
157
165FLECS_API
167 int32_t level,
168 const char *file,
169 int32_t line,
170 const char *fmt,
171 ...);
172
181FLECS_API
183 int level,
184 const char *file,
185 int32_t line,
186 const char *fmt,
187 va_list args);
188
196FLECS_API
198 int32_t error_code,
199 const char *file,
200 int32_t line,
201 const char *fmt,
202 ...);
203
212FLECS_API
214 int32_t error_code,
215 const char *condition_str,
216 const char *file,
217 int32_t line,
218 const char *fmt,
219 ...);
220
228FLECS_API
230 const char *name,
231 const char *expr,
232 int64_t column,
233 const char *fmt,
234 ...);
235
244FLECS_API
246 const char *name,
247 const char *expr,
248 int64_t column,
249 const char *fmt,
250 va_list args);
251
259FLECS_API
261 const char *name,
262 const char *expr,
263 int64_t column,
264 const char *fmt,
265 ...);
266
275FLECS_API
277 const char *name,
278 const char *expr,
279 int64_t column,
280 const char *fmt,
281 va_list args);
282
283
287
288#ifndef FLECS_LEGACY /* C89 doesn't support variadic macros */
289
291#define ecs_print(level, ...)\
292 ecs_print_(level, __FILE__, __LINE__, __VA_ARGS__)
293
295#define ecs_printv(level, fmt, args)\
296 ecs_printv_(level, __FILE__, __LINE__, fmt, args)
297
299#define ecs_log(level, ...)\
300 ecs_log_(level, __FILE__, __LINE__, __VA_ARGS__)
301
303#define ecs_logv(level, fmt, args)\
304 ecs_logv_(level, __FILE__, __LINE__, fmt, args)
305
307#define ecs_trace_(file, line, ...) ecs_log_(0, file, line, __VA_ARGS__)
309#define ecs_trace(...) ecs_trace_(__FILE__, __LINE__, __VA_ARGS__)
310
312#define ecs_warn_(file, line, ...) ecs_log_(-2, file, line, __VA_ARGS__)
314#define ecs_warn(...) ecs_warn_(__FILE__, __LINE__, __VA_ARGS__)
315
317#define ecs_err_(file, line, ...) ecs_log_(-3, file, line, __VA_ARGS__)
319#define ecs_err(...) ecs_err_(__FILE__, __LINE__, __VA_ARGS__)
320
322#define ecs_fatal_(file, line, ...) ecs_log_(-4, file, line, __VA_ARGS__)
324#define ecs_fatal(...) ecs_fatal_(__FILE__, __LINE__, __VA_ARGS__)
325
327#ifndef FLECS_NO_DEPRECATED_WARNINGS
329#define ecs_deprecated(...)\
330 ecs_deprecated_(__FILE__, __LINE__, __VA_ARGS__)
331#else
332#define ecs_deprecated(...)
333#endif // FLECS_NO_DEPRECATED_WARNINGS
334
335/* If no tracing verbosity is defined, pick default based on build config */
336#if !(defined(FLECS_LOG_0) || defined(FLECS_LOG_1) || defined(FLECS_LOG_2) || defined(FLECS_LOG_3))
337#if !defined(FLECS_NDEBUG)
338#define FLECS_LOG_3 /* Enable all tracing in debug mode. May slow things down */
339#else
340#define FLECS_LOG_0 /* Only enable infrequent tracing in release mode */
341#endif // !defined(FLECS_NDEBUG)
342#endif // !(defined(FLECS_LOG_0) || defined(FLECS_LOG_1) || defined(FLECS_LOG_2) || defined(FLECS_LOG_3))
343
344
345/* Define/undefine macros based on compiled-in tracing level. This can optimize
346 * out tracing statements from a build, which improves performance. */
347
348#if defined(FLECS_LOG_3) /* All debug tracing enabled */
350#define ecs_dbg_1(...) ecs_log(1, __VA_ARGS__);
352#define ecs_dbg_2(...) ecs_log(2, __VA_ARGS__);
354#define ecs_dbg_3(...) ecs_log(3, __VA_ARGS__);
355
357#define ecs_log_push_1() ecs_log_push_(1);
359#define ecs_log_push_2() ecs_log_push_(2);
361#define ecs_log_push_3() ecs_log_push_(3);
362
364#define ecs_log_pop_1() ecs_log_pop_(1);
366#define ecs_log_pop_2() ecs_log_pop_(2);
368#define ecs_log_pop_3() ecs_log_pop_(3);
369
371#define ecs_should_log_1() ecs_should_log(1)
373#define ecs_should_log_2() ecs_should_log(2)
375#define ecs_should_log_3() ecs_should_log(3)
376
377#define FLECS_LOG_2
378#define FLECS_LOG_1
379#define FLECS_LOG_0
380
381#elif defined(FLECS_LOG_2) /* Level 2 and below debug tracing enabled */
382#define ecs_dbg_1(...) ecs_log(1, __VA_ARGS__);
383#define ecs_dbg_2(...) ecs_log(2, __VA_ARGS__);
384#define ecs_dbg_3(...)
385
386#define ecs_log_push_1() ecs_log_push_(1);
387#define ecs_log_push_2() ecs_log_push_(2);
388#define ecs_log_push_3()
389
390#define ecs_log_pop_1() ecs_log_pop_(1);
391#define ecs_log_pop_2() ecs_log_pop_(2);
392#define ecs_log_pop_3()
393
394#define ecs_should_log_1() ecs_should_log(1)
395#define ecs_should_log_2() ecs_should_log(2)
396#define ecs_should_log_3() false
397
398#define FLECS_LOG_1
399#define FLECS_LOG_0
400
401#elif defined(FLECS_LOG_1) /* Level 1 debug tracing enabled */
402#define ecs_dbg_1(...) ecs_log(1, __VA_ARGS__);
403#define ecs_dbg_2(...)
404#define ecs_dbg_3(...)
405
406#define ecs_log_push_1() ecs_log_push_(1);
407#define ecs_log_push_2()
408#define ecs_log_push_3()
409
410#define ecs_log_pop_1() ecs_log_pop_(1);
411#define ecs_log_pop_2()
412#define ecs_log_pop_3()
413
414#define ecs_should_log_1() ecs_should_log(1)
415#define ecs_should_log_2() false
416#define ecs_should_log_3() false
417
418#define FLECS_LOG_0
419
420#elif defined(FLECS_LOG_0) /* No debug tracing enabled */
421#define ecs_dbg_1(...)
422#define ecs_dbg_2(...)
423#define ecs_dbg_3(...)
424
425#define ecs_log_push_1()
426#define ecs_log_push_2()
427#define ecs_log_push_3()
428
429#define ecs_log_pop_1()
430#define ecs_log_pop_2()
431#define ecs_log_pop_3()
432
433#define ecs_should_log_1() false
434#define ecs_should_log_2() false
435#define ecs_should_log_3() false
436
437#else /* No tracing enabled */
438#undef ecs_trace
439#define ecs_trace(...)
440#define ecs_dbg_1(...)
441#define ecs_dbg_2(...)
442#define ecs_dbg_3(...)
443
444#define ecs_log_push_1()
445#define ecs_log_push_2()
446#define ecs_log_push_3()
447
448#define ecs_log_pop_1()
449#define ecs_log_pop_2()
450#define ecs_log_pop_3()
451
452#endif // defined(FLECS_LOG_3)
453
455#define ecs_dbg ecs_dbg_1
456
458#define ecs_log_push() ecs_log_push_(0)
460#define ecs_log_pop() ecs_log_pop_(0)
461
464#define ecs_abort(error_code, ...)\
465 ecs_abort_(error_code, __FILE__, __LINE__, __VA_ARGS__);\
466 ecs_os_abort(); abort(); /* satisfy compiler/static analyzers */
467
470#if defined(FLECS_NDEBUG) && !defined(FLECS_KEEP_ASSERT)
471#define ecs_assert(condition, error_code, ...)
472#else
473#define ecs_assert(condition, error_code, ...)\
474 if (!(condition)) {\
475 ecs_assert_log_(error_code, #condition, __FILE__, __LINE__, __VA_ARGS__);\
476 ecs_os_abort();\
477 }\
478 assert(condition) /* satisfy compiler/static analyzers */
479#endif // FLECS_NDEBUG
480
483#ifndef FLECS_NDEBUG
484#define ecs_dbg_assert(condition, error_code, ...) ecs_assert(condition, error_code, __VA_ARGS__)
485#else
486#define ecs_dbg_assert(condition, error_code, ...)
487#endif
488
491#ifdef FLECS_SANITIZE
492#define ecs_san_assert(condition, error_code, ...) ecs_assert(condition, error_code, __VA_ARGS__)
493#else
494#define ecs_san_assert(condition, error_code, ...)
495#endif
496
497
499#define ecs_dummy_check\
500 if ((false)) {\
501 goto error;\
502 }
503
506#if defined(FLECS_NDEBUG) && !defined(FLECS_KEEP_ASSERT)
507#define ecs_check(condition, error_code, ...) ecs_dummy_check
508#else
509#ifdef FLECS_SOFT_ASSERT
510#define ecs_check(condition, error_code, ...)\
511 if (!(condition)) {\
512 ecs_assert_log_(error_code, #condition, __FILE__, __LINE__, __VA_ARGS__);\
513 goto error;\
514 }\
515 ecs_dummy_check
516#else // FLECS_SOFT_ASSERT
517#define ecs_check(condition, error_code, ...)\
518 if (!(condition)) {\
519 ecs_assert_log_(error_code, #condition, __FILE__, __LINE__, __VA_ARGS__);\
520 ecs_os_abort();\
521 }\
522 assert(condition); /* satisfy compiler/static analyzers */ \
523 ecs_dummy_check
524#endif
525#endif // FLECS_NDEBUG
526
529#if defined(FLECS_NDEBUG) && !defined(FLECS_KEEP_ASSERT)
530#define ecs_throw(error_code, ...) ecs_dummy_check
531#else
532#ifdef FLECS_SOFT_ASSERT
533#define ecs_throw(error_code, ...)\
534 ecs_abort_(error_code, __FILE__, __LINE__, __VA_ARGS__);\
535 goto error;
536#else
537#define ecs_throw(error_code, ...)\
538 ecs_abort(error_code, __VA_ARGS__);\
539 ecs_dummy_check
540#endif
541#endif // FLECS_NDEBUG
542
544#define ecs_parser_error(name, expr, column, ...)\
545 ecs_parser_error_(name, expr, column, __VA_ARGS__)
546
548#define ecs_parser_errorv(name, expr, column, fmt, args)\
549 ecs_parser_errorv_(name, expr, column, fmt, args)
550
552#define ecs_parser_warning(name, expr, column, ...)\
553 ecs_parser_warning_(name, expr, column, __VA_ARGS__)
554
556#define ecs_parser_warningv(name, expr, column, fmt, args)\
557 ecs_parser_warningv_(name, expr, column, fmt, args)
558
559#endif // FLECS_LEGACY
560
564
583FLECS_API
585 int level);
586
591FLECS_API
593
600FLECS_API
602 bool enabled);
603
611FLECS_API
613 bool enabled);
614
628FLECS_API
630 bool enabled);
631
637FLECS_API
639
644FLECS_API
645void ecs_log_start_capture(bool capture_try);
646
651FLECS_API
653
657
659#define ECS_INVALID_OPERATION (1)
661#define ECS_INVALID_PARAMETER (2)
663#define ECS_CONSTRAINT_VIOLATED (3)
665#define ECS_OUT_OF_MEMORY (4)
667#define ECS_OUT_OF_RANGE (5)
669#define ECS_UNSUPPORTED (6)
671#define ECS_INTERNAL_ERROR (7)
673#define ECS_ALREADY_DEFINED (8)
675#define ECS_MISSING_OS_API (9)
677#define ECS_OPERATION_FAILED (10)
679#define ECS_INVALID_CONVERSION (11)
681#define ECS_CYCLE_DETECTED (13)
683#define ECS_LEAK_DETECTED (14)
685#define ECS_DOUBLE_FREE (15)
686
688#define ECS_INCONSISTENT_NAME (20)
690#define ECS_NAME_IN_USE (21)
692#define ECS_INVALID_COMPONENT_SIZE (23)
694#define ECS_INVALID_COMPONENT_ALIGNMENT (24)
696#define ECS_COMPONENT_NOT_REGISTERED (25)
698#define ECS_INCONSISTENT_COMPONENT_ID (26)
700#define ECS_INCONSISTENT_COMPONENT_ACTION (27)
702#define ECS_MODULE_UNDEFINED (28)
704#define ECS_MISSING_SYMBOL (29)
706#define ECS_ALREADY_IN_USE (30)
707
709#define ECS_ACCESS_VIOLATION (40)
711#define ECS_COLUMN_INDEX_OUT_OF_RANGE (41)
713#define ECS_COLUMN_IS_NOT_SHARED (42)
715#define ECS_COLUMN_IS_SHARED (43)
717#define ECS_COLUMN_TYPE_MISMATCH (45)
718
720#define ECS_INVALID_WHILE_READONLY (70)
722#define ECS_LOCKED_STORAGE (71)
724#define ECS_INVALID_FROM_WORKER (72)
725
726
730
732#define ECS_BLACK "\033[1;30m"
734#define ECS_RED "\033[0;31m"
736#define ECS_GREEN "\033[0;32m"
738#define ECS_YELLOW "\033[0;33m"
740#define ECS_BLUE "\033[0;34m"
742#define ECS_MAGENTA "\033[0;35m"
744#define ECS_CYAN "\033[0;36m"
746#define ECS_WHITE "\033[1;37m"
748#define ECS_GREY "\033[0;37m"
750#define ECS_NORMAL "\033[0;49m"
752#define ECS_BOLD "\033[1;49m"
753
754#ifdef __cplusplus
755}
756#endif
757
760#endif // FLECS_LOG_H
FLECS_API char * ecs_log_stop_capture(void)
Stop capturing log output.
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 void ecs_parser_warningv_(const char *name, const char *expr, int64_t column, const char *fmt, va_list args)
Log a parser warning (va_list).
FLECS_API void ecs_abort_(int32_t error_code, const char *file, int32_t line, const char *fmt,...)
Abort with error code.
FLECS_API void ecs_log_start_capture(bool capture_try)
Start capturing log output.
FLECS_API bool ecs_should_log(int32_t level)
Should current level be logged.
FLECS_API void ecs_printv_(int level, const char *file, int32_t line, const char *fmt, va_list args)
Print at the provided log level (va_list).
FLECS_API void ecs_log_(int32_t level, const char *file, int32_t line, const char *fmt,...)
Log at the provided level.
FLECS_API void ecs_assert_log_(int32_t error_code, const char *condition_str, const char *file, int32_t line, const char *fmt,...)
Log an assertion failure.
FLECS_API void ecs_print_(int32_t level, const char *file, int32_t line, const char *fmt,...)
Print at the provided log level.
FLECS_API const char * ecs_strerror(int32_t error_code)
Get description for error code.
FLECS_API void ecs_deprecated_(const char *file, int32_t line, const char *msg)
Log message indicating an operation is deprecated.
FLECS_API void ecs_log_push_(int32_t level)
Increase log stack.
FLECS_API void ecs_parser_warning_(const char *name, const char *expr, int64_t column, const char *fmt,...)
Log a parser warning.
FLECS_API void ecs_logv_(int level, const char *file, int32_t line, const char *fmt, va_list args)
Log at the provided level (va_list).
FLECS_API bool ecs_log_enable_colors(bool enabled)
Enable/disable tracing with colors.
FLECS_API void ecs_parser_error_(const char *name, const char *expr, int64_t column, const char *fmt,...)
Log a parser error.
FLECS_API int ecs_log_get_level(void)
Get current log level.
FLECS_API void ecs_parser_errorv_(const char *name, const char *expr, int64_t column, const char *fmt, va_list args)
Log a parser error (va_list).
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 bool ecs_log_enable_timedelta(bool enabled)
Enable/disable logging time since last log.