|
1 /* ****************************************************************** |
|
2 debug |
|
3 Part of FSE library |
|
4 Copyright (C) 2013-present, Yann Collet. |
|
5 |
|
6 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) |
|
7 |
|
8 Redistribution and use in source and binary forms, with or without |
|
9 modification, are permitted provided that the following conditions are |
|
10 met: |
|
11 |
|
12 * Redistributions of source code must retain the above copyright |
|
13 notice, this list of conditions and the following disclaimer. |
|
14 * Redistributions in binary form must reproduce the above |
|
15 copyright notice, this list of conditions and the following disclaimer |
|
16 in the documentation and/or other materials provided with the |
|
17 distribution. |
|
18 |
|
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
20 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
23 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
24 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
25 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
27 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
28 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
29 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
30 |
|
31 You can contact the author at : |
|
32 - Source repository : https://github.com/Cyan4973/FiniteStateEntropy |
|
33 ****************************************************************** */ |
|
34 |
|
35 |
|
36 /* |
|
37 * The purpose of this header is to enable debug functions. |
|
38 * They regroup assert(), DEBUGLOG() and RAWLOG() for run-time, |
|
39 * and DEBUG_STATIC_ASSERT() for compile-time. |
|
40 * |
|
41 * By default, DEBUGLEVEL==0, which means run-time debug is disabled. |
|
42 * |
|
43 * Level 1 enables assert() only. |
|
44 * Starting level 2, traces can be generated and pushed to stderr. |
|
45 * The higher the level, the more verbose the traces. |
|
46 * |
|
47 * It's possible to dynamically adjust level using variable g_debug_level, |
|
48 * which is only declared if DEBUGLEVEL>=2, |
|
49 * and is a global variable, not multi-thread protected (use with care) |
|
50 */ |
|
51 |
|
52 #ifndef DEBUG_H_12987983217 |
|
53 #define DEBUG_H_12987983217 |
|
54 |
|
55 #if defined (__cplusplus) |
|
56 extern "C" { |
|
57 #endif |
|
58 |
|
59 |
|
60 /* static assert is triggered at compile time, leaving no runtime artefact, |
|
61 * but can only work with compile-time constants. |
|
62 * This variant can only be used inside a function. */ |
|
63 #define DEBUG_STATIC_ASSERT(c) (void)sizeof(char[(c) ? 1 : -1]) |
|
64 |
|
65 |
|
66 /* DEBUGLEVEL is expected to be defined externally, |
|
67 * typically through compiler command line. |
|
68 * Value must be a number. */ |
|
69 #ifndef DEBUGLEVEL |
|
70 # define DEBUGLEVEL 0 |
|
71 #endif |
|
72 |
|
73 /* recommended values for DEBUGLEVEL : |
|
74 * 0 : no debug, all run-time functions disabled |
|
75 * 1 : no display, enables assert() only |
|
76 * 2 : reserved, for currently active debug path |
|
77 * 3 : events once per object lifetime (CCtx, CDict, etc.) |
|
78 * 4 : events once per frame |
|
79 * 5 : events once per block |
|
80 * 6 : events once per sequence (verbose) |
|
81 * 7+: events at every position (*very* verbose) |
|
82 * |
|
83 * It's generally inconvenient to output traces > 5. |
|
84 * In which case, it's possible to selectively enable higher verbosity levels |
|
85 * by modifying g_debug_level. |
|
86 */ |
|
87 |
|
88 #if (DEBUGLEVEL>=1) |
|
89 # include <assert.h> |
|
90 #else |
|
91 # ifndef assert /* assert may be already defined, due to prior #include <assert.h> */ |
|
92 # define assert(condition) ((void)0) /* disable assert (default) */ |
|
93 # endif |
|
94 #endif |
|
95 |
|
96 #if (DEBUGLEVEL>=2) |
|
97 # include <stdio.h> |
|
98 extern int g_debuglevel; /* here, this variable is only declared, |
|
99 it actually lives in debug.c, |
|
100 and is shared by the whole process. |
|
101 It's typically used to enable very verbose levels |
|
102 on selective conditions (such as position in src) */ |
|
103 |
|
104 # define RAWLOG(l, ...) { \ |
|
105 if (l<=g_debuglevel) { \ |
|
106 fprintf(stderr, __VA_ARGS__); \ |
|
107 } } |
|
108 # define DEBUGLOG(l, ...) { \ |
|
109 if (l<=g_debuglevel) { \ |
|
110 fprintf(stderr, __FILE__ ": " __VA_ARGS__); \ |
|
111 fprintf(stderr, " \n"); \ |
|
112 } } |
|
113 #else |
|
114 # define RAWLOG(l, ...) {} /* disabled */ |
|
115 # define DEBUGLOG(l, ...) {} /* disabled */ |
|
116 #endif |
|
117 |
|
118 |
|
119 #if defined (__cplusplus) |
|
120 } |
|
121 #endif |
|
122 |
|
123 #endif /* DEBUG_H_12987983217 */ |