1*c03c5b1cSMartin Matuska /* ****************************************************************** 2*c03c5b1cSMartin Matuska * debug 3*c03c5b1cSMartin Matuska * Part of FSE library 4*c03c5b1cSMartin Matuska * Copyright (c) 2013-2020, Yann Collet, Facebook, Inc. 5*c03c5b1cSMartin Matuska * 6*c03c5b1cSMartin Matuska * You can contact the author at : 7*c03c5b1cSMartin Matuska * - Source repository : https://github.com/Cyan4973/FiniteStateEntropy 8*c03c5b1cSMartin Matuska * 9*c03c5b1cSMartin Matuska * This source code is licensed under both the BSD-style license (found in the 10*c03c5b1cSMartin Matuska * LICENSE file in the root directory of this source tree) and the GPLv2 (found 11*c03c5b1cSMartin Matuska * in the COPYING file in the root directory of this source tree). 12*c03c5b1cSMartin Matuska * You may select, at your option, one of the above-listed licenses. 13*c03c5b1cSMartin Matuska ****************************************************************** */ 14*c03c5b1cSMartin Matuska 15*c03c5b1cSMartin Matuska 16*c03c5b1cSMartin Matuska /* 17*c03c5b1cSMartin Matuska * The purpose of this header is to enable debug functions. 18*c03c5b1cSMartin Matuska * They regroup assert(), DEBUGLOG() and RAWLOG() for run-time, 19*c03c5b1cSMartin Matuska * and DEBUG_STATIC_ASSERT() for compile-time. 20*c03c5b1cSMartin Matuska * 21*c03c5b1cSMartin Matuska * By default, DEBUGLEVEL==0, which means run-time debug is disabled. 22*c03c5b1cSMartin Matuska * 23*c03c5b1cSMartin Matuska * Level 1 enables assert() only. 24*c03c5b1cSMartin Matuska * Starting level 2, traces can be generated and pushed to stderr. 25*c03c5b1cSMartin Matuska * The higher the level, the more verbose the traces. 26*c03c5b1cSMartin Matuska * 27*c03c5b1cSMartin Matuska * It's possible to dynamically adjust level using variable g_debug_level, 28*c03c5b1cSMartin Matuska * which is only declared if DEBUGLEVEL>=2, 29*c03c5b1cSMartin Matuska * and is a global variable, not multi-thread protected (use with care) 30*c03c5b1cSMartin Matuska */ 31*c03c5b1cSMartin Matuska 32*c03c5b1cSMartin Matuska #ifndef DEBUG_H_12987983217 33*c03c5b1cSMartin Matuska #define DEBUG_H_12987983217 34*c03c5b1cSMartin Matuska 35*c03c5b1cSMartin Matuska #if defined (__cplusplus) 36*c03c5b1cSMartin Matuska extern "C" { 37*c03c5b1cSMartin Matuska #endif 38*c03c5b1cSMartin Matuska 39*c03c5b1cSMartin Matuska 40*c03c5b1cSMartin Matuska /* static assert is triggered at compile time, leaving no runtime artefact. 41*c03c5b1cSMartin Matuska * static assert only works with compile-time constants. 42*c03c5b1cSMartin Matuska * Also, this variant can only be used inside a function. */ 43*c03c5b1cSMartin Matuska #define DEBUG_STATIC_ASSERT(c) (void)sizeof(char[(c) ? 1 : -1]) 44*c03c5b1cSMartin Matuska 45*c03c5b1cSMartin Matuska 46*c03c5b1cSMartin Matuska /* DEBUGLEVEL is expected to be defined externally, 47*c03c5b1cSMartin Matuska * typically through compiler command line. 48*c03c5b1cSMartin Matuska * Value must be a number. */ 49*c03c5b1cSMartin Matuska #ifndef DEBUGLEVEL 50*c03c5b1cSMartin Matuska # define DEBUGLEVEL 0 51*c03c5b1cSMartin Matuska #endif 52*c03c5b1cSMartin Matuska 53*c03c5b1cSMartin Matuska 54*c03c5b1cSMartin Matuska /* DEBUGFILE can be defined externally, 55*c03c5b1cSMartin Matuska * typically through compiler command line. 56*c03c5b1cSMartin Matuska * note : currently useless. 57*c03c5b1cSMartin Matuska * Value must be stderr or stdout */ 58*c03c5b1cSMartin Matuska #ifndef DEBUGFILE 59*c03c5b1cSMartin Matuska # define DEBUGFILE stderr 60*c03c5b1cSMartin Matuska #endif 61*c03c5b1cSMartin Matuska 62*c03c5b1cSMartin Matuska 63*c03c5b1cSMartin Matuska /* recommended values for DEBUGLEVEL : 64*c03c5b1cSMartin Matuska * 0 : release mode, no debug, all run-time checks disabled 65*c03c5b1cSMartin Matuska * 1 : enables assert() only, no display 66*c03c5b1cSMartin Matuska * 2 : reserved, for currently active debug path 67*c03c5b1cSMartin Matuska * 3 : events once per object lifetime (CCtx, CDict, etc.) 68*c03c5b1cSMartin Matuska * 4 : events once per frame 69*c03c5b1cSMartin Matuska * 5 : events once per block 70*c03c5b1cSMartin Matuska * 6 : events once per sequence (verbose) 71*c03c5b1cSMartin Matuska * 7+: events at every position (*very* verbose) 72*c03c5b1cSMartin Matuska * 73*c03c5b1cSMartin Matuska * It's generally inconvenient to output traces > 5. 74*c03c5b1cSMartin Matuska * In which case, it's possible to selectively trigger high verbosity levels 75*c03c5b1cSMartin Matuska * by modifying g_debug_level. 76*c03c5b1cSMartin Matuska */ 77*c03c5b1cSMartin Matuska 78*c03c5b1cSMartin Matuska #if (DEBUGLEVEL>=1) 79*c03c5b1cSMartin Matuska # include <assert.h> 80*c03c5b1cSMartin Matuska #else 81*c03c5b1cSMartin Matuska # ifndef assert /* assert may be already defined, due to prior #include <assert.h> */ 82*c03c5b1cSMartin Matuska # define assert(condition) ((void)0) /* disable assert (default) */ 83*c03c5b1cSMartin Matuska # endif 84*c03c5b1cSMartin Matuska #endif 85*c03c5b1cSMartin Matuska 86*c03c5b1cSMartin Matuska #if (DEBUGLEVEL>=2) 87*c03c5b1cSMartin Matuska # include <stdio.h> 88*c03c5b1cSMartin Matuska extern int g_debuglevel; /* the variable is only declared, 89*c03c5b1cSMartin Matuska it actually lives in debug.c, 90*c03c5b1cSMartin Matuska and is shared by the whole process. 91*c03c5b1cSMartin Matuska It's not thread-safe. 92*c03c5b1cSMartin Matuska It's useful when enabling very verbose levels 93*c03c5b1cSMartin Matuska on selective conditions (such as position in src) */ 94*c03c5b1cSMartin Matuska 95*c03c5b1cSMartin Matuska # define RAWLOG(l, ...) { \ 96*c03c5b1cSMartin Matuska if (l<=g_debuglevel) { \ 97*c03c5b1cSMartin Matuska fprintf(stderr, __VA_ARGS__); \ 98*c03c5b1cSMartin Matuska } } 99*c03c5b1cSMartin Matuska # define DEBUGLOG(l, ...) { \ 100*c03c5b1cSMartin Matuska if (l<=g_debuglevel) { \ 101*c03c5b1cSMartin Matuska fprintf(stderr, __FILE__ ": " __VA_ARGS__); \ 102*c03c5b1cSMartin Matuska fprintf(stderr, " \n"); \ 103*c03c5b1cSMartin Matuska } } 104*c03c5b1cSMartin Matuska #else 105*c03c5b1cSMartin Matuska # define RAWLOG(l, ...) {} /* disabled */ 106*c03c5b1cSMartin Matuska # define DEBUGLOG(l, ...) {} /* disabled */ 107*c03c5b1cSMartin Matuska #endif 108*c03c5b1cSMartin Matuska 109*c03c5b1cSMartin Matuska 110*c03c5b1cSMartin Matuska #if defined (__cplusplus) 111*c03c5b1cSMartin Matuska } 112*c03c5b1cSMartin Matuska #endif 113*c03c5b1cSMartin Matuska 114*c03c5b1cSMartin Matuska #endif /* DEBUG_H_12987983217 */ 115