debug.h
134 lines
| 4.8 KiB
| text/x-c
|
CLexer
Gregory Szorc
|
r40157 | /* ****************************************************************** | ||
debug | ||||
Part of FSE library | ||||
Copyright (C) 2013-present, Yann Collet. | ||||
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) | ||||
Redistribution and use in source and binary forms, with or without | ||||
modification, are permitted provided that the following conditions are | ||||
met: | ||||
* Redistributions of source code must retain the above copyright | ||||
notice, this list of conditions and the following disclaimer. | ||||
* Redistributions in binary form must reproduce the above | ||||
copyright notice, this list of conditions and the following disclaimer | ||||
in the documentation and/or other materials provided with the | ||||
distribution. | ||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
You can contact the author at : | ||||
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy | ||||
****************************************************************** */ | ||||
/* | ||||
* The purpose of this header is to enable debug functions. | ||||
* They regroup assert(), DEBUGLOG() and RAWLOG() for run-time, | ||||
* and DEBUG_STATIC_ASSERT() for compile-time. | ||||
* | ||||
* By default, DEBUGLEVEL==0, which means run-time debug is disabled. | ||||
* | ||||
* Level 1 enables assert() only. | ||||
* Starting level 2, traces can be generated and pushed to stderr. | ||||
* The higher the level, the more verbose the traces. | ||||
* | ||||
* It's possible to dynamically adjust level using variable g_debug_level, | ||||
* which is only declared if DEBUGLEVEL>=2, | ||||
* and is a global variable, not multi-thread protected (use with care) | ||||
*/ | ||||
#ifndef DEBUG_H_12987983217 | ||||
#define DEBUG_H_12987983217 | ||||
#if defined (__cplusplus) | ||||
extern "C" { | ||||
#endif | ||||
Gregory Szorc
|
r42237 | /* static assert is triggered at compile time, leaving no runtime artefact. | ||
* static assert only works with compile-time constants. | ||||
* Also, this variant can only be used inside a function. */ | ||||
Gregory Szorc
|
r40157 | #define DEBUG_STATIC_ASSERT(c) (void)sizeof(char[(c) ? 1 : -1]) | ||
/* DEBUGLEVEL is expected to be defined externally, | ||||
* typically through compiler command line. | ||||
* Value must be a number. */ | ||||
#ifndef DEBUGLEVEL | ||||
# define DEBUGLEVEL 0 | ||||
#endif | ||||
Gregory Szorc
|
r42237 | |||
/* DEBUGFILE can be defined externally, | ||||
* typically through compiler command line. | ||||
* note : currently useless. | ||||
* Value must be stderr or stdout */ | ||||
#ifndef DEBUGFILE | ||||
# define DEBUGFILE stderr | ||||
#endif | ||||
Gregory Szorc
|
r40157 | /* recommended values for DEBUGLEVEL : | ||
Gregory Szorc
|
r42237 | * 0 : release mode, no debug, all run-time checks disabled | ||
* 1 : enables assert() only, no display | ||||
Gregory Szorc
|
r40157 | * 2 : reserved, for currently active debug path | ||
* 3 : events once per object lifetime (CCtx, CDict, etc.) | ||||
* 4 : events once per frame | ||||
* 5 : events once per block | ||||
* 6 : events once per sequence (verbose) | ||||
* 7+: events at every position (*very* verbose) | ||||
* | ||||
* It's generally inconvenient to output traces > 5. | ||||
Gregory Szorc
|
r42237 | * In which case, it's possible to selectively trigger high verbosity levels | ||
Gregory Szorc
|
r40157 | * by modifying g_debug_level. | ||
*/ | ||||
#if (DEBUGLEVEL>=1) | ||||
# include <assert.h> | ||||
#else | ||||
# ifndef assert /* assert may be already defined, due to prior #include <assert.h> */ | ||||
# define assert(condition) ((void)0) /* disable assert (default) */ | ||||
# endif | ||||
#endif | ||||
#if (DEBUGLEVEL>=2) | ||||
# include <stdio.h> | ||||
Gregory Szorc
|
r42237 | extern int g_debuglevel; /* the variable is only declared, | ||
it actually lives in debug.c, | ||||
and is shared by the whole process. | ||||
It's not thread-safe. | ||||
It's useful when enabling very verbose levels | ||||
on selective conditions (such as position in src) */ | ||||
Gregory Szorc
|
r40157 | |||
# define RAWLOG(l, ...) { \ | ||||
if (l<=g_debuglevel) { \ | ||||
fprintf(stderr, __VA_ARGS__); \ | ||||
} } | ||||
# define DEBUGLOG(l, ...) { \ | ||||
if (l<=g_debuglevel) { \ | ||||
fprintf(stderr, __FILE__ ": " __VA_ARGS__); \ | ||||
fprintf(stderr, " \n"); \ | ||||
} } | ||||
#else | ||||
# define RAWLOG(l, ...) {} /* disabled */ | ||||
# define DEBUGLOG(l, ...) {} /* disabled */ | ||||
#endif | ||||
#if defined (__cplusplus) | ||||
} | ||||
#endif | ||||
#endif /* DEBUG_H_12987983217 */ | ||||