1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* ftdebug.h */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* Debugging and logging component (specification). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 1996-2001, 2002 by */ 8*37da2899SCharles.Forsyth /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9*37da2899SCharles.Forsyth /* */ 10*37da2899SCharles.Forsyth /* This file is part of the FreeType project, and may only be used, */ 11*37da2899SCharles.Forsyth /* modified, and distributed under the terms of the FreeType project */ 12*37da2899SCharles.Forsyth /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13*37da2899SCharles.Forsyth /* this file you indicate that you have read the license and */ 14*37da2899SCharles.Forsyth /* understand and accept it fully. */ 15*37da2899SCharles.Forsyth /* */ 16*37da2899SCharles.Forsyth /* */ 17*37da2899SCharles.Forsyth /* IMPORTANT: A description of FreeType's debugging support can be */ 18*37da2899SCharles.Forsyth /* found in "docs/DEBUG.TXT". Read it if you need to use or */ 19*37da2899SCharles.Forsyth /* understand this code. */ 20*37da2899SCharles.Forsyth /* */ 21*37da2899SCharles.Forsyth /***************************************************************************/ 22*37da2899SCharles.Forsyth 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth #ifndef __FTDEBUG_H__ 25*37da2899SCharles.Forsyth #define __FTDEBUG_H__ 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth 28*37da2899SCharles.Forsyth #include <ft2build.h> 29*37da2899SCharles.Forsyth #include FT_CONFIG_CONFIG_H 30*37da2899SCharles.Forsyth 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth FT_BEGIN_HEADER 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsyth 35*37da2899SCharles.Forsyth /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ 36*37da2899SCharles.Forsyth /* is already defined; this simplifies the following #ifdefs */ 37*37da2899SCharles.Forsyth /* */ 38*37da2899SCharles.Forsyth #ifdef FT_DEBUG_LEVEL_TRACE 39*37da2899SCharles.Forsyth #undef FT_DEBUG_LEVEL_ERROR 40*37da2899SCharles.Forsyth #define FT_DEBUG_LEVEL_ERROR 41*37da2899SCharles.Forsyth #endif 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth /*************************************************************************/ 45*37da2899SCharles.Forsyth /* */ 46*37da2899SCharles.Forsyth /* Define the trace enums as well as the trace levels array when they */ 47*37da2899SCharles.Forsyth /* are needed. */ 48*37da2899SCharles.Forsyth /* */ 49*37da2899SCharles.Forsyth /*************************************************************************/ 50*37da2899SCharles.Forsyth 51*37da2899SCharles.Forsyth #ifdef FT_DEBUG_LEVEL_TRACE 52*37da2899SCharles.Forsyth 53*37da2899SCharles.Forsyth #define FT_TRACE_DEF( x ) trace_ ## x , 54*37da2899SCharles.Forsyth 55*37da2899SCharles.Forsyth /* defining the enumeration */ 56*37da2899SCharles.Forsyth typedef enum 57*37da2899SCharles.Forsyth { 58*37da2899SCharles.Forsyth #include FT_INTERNAL_TRACE_H 59*37da2899SCharles.Forsyth trace_count 60*37da2899SCharles.Forsyth 61*37da2899SCharles.Forsyth } FT_Trace; 62*37da2899SCharles.Forsyth 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsyth /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ 65*37da2899SCharles.Forsyth extern int ft_trace_levels[trace_count]; 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth #undef FT_TRACE_DEF 68*37da2899SCharles.Forsyth 69*37da2899SCharles.Forsyth #endif /* FT_DEBUG_LEVEL_TRACE */ 70*37da2899SCharles.Forsyth 71*37da2899SCharles.Forsyth 72*37da2899SCharles.Forsyth /*************************************************************************/ 73*37da2899SCharles.Forsyth /* */ 74*37da2899SCharles.Forsyth /* Define the FT_TRACE macro */ 75*37da2899SCharles.Forsyth /* */ 76*37da2899SCharles.Forsyth /* IMPORTANT! */ 77*37da2899SCharles.Forsyth /* */ 78*37da2899SCharles.Forsyth /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ 79*37da2899SCharles.Forsyth /* value before using any TRACE macro. */ 80*37da2899SCharles.Forsyth /* */ 81*37da2899SCharles.Forsyth /*************************************************************************/ 82*37da2899SCharles.Forsyth 83*37da2899SCharles.Forsyth #ifdef FT_DEBUG_LEVEL_TRACE 84*37da2899SCharles.Forsyth 85*37da2899SCharles.Forsyth #define FT_TRACE( level, varformat ) \ 86*37da2899SCharles.Forsyth do \ 87*37da2899SCharles.Forsyth { \ 88*37da2899SCharles.Forsyth if ( ft_trace_levels[FT_COMPONENT] >= level ) \ 89*37da2899SCharles.Forsyth FT_Message varformat; \ 90*37da2899SCharles.Forsyth } while ( 0 ) 91*37da2899SCharles.Forsyth 92*37da2899SCharles.Forsyth #else /* !FT_DEBUG_LEVEL_TRACE */ 93*37da2899SCharles.Forsyth 94*37da2899SCharles.Forsyth #define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ 95*37da2899SCharles.Forsyth 96*37da2899SCharles.Forsyth #endif /* !FT_DEBUG_LEVEL_TRACE */ 97*37da2899SCharles.Forsyth 98*37da2899SCharles.Forsyth 99*37da2899SCharles.Forsyth /*************************************************************************/ 100*37da2899SCharles.Forsyth /* */ 101*37da2899SCharles.Forsyth /* You need two opening resp. closing parentheses! */ 102*37da2899SCharles.Forsyth /* */ 103*37da2899SCharles.Forsyth /* Example: FT_TRACE0(( "Value is %i", foo )) */ 104*37da2899SCharles.Forsyth /* */ 105*37da2899SCharles.Forsyth /*************************************************************************/ 106*37da2899SCharles.Forsyth 107*37da2899SCharles.Forsyth #define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) 108*37da2899SCharles.Forsyth #define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) 109*37da2899SCharles.Forsyth #define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) 110*37da2899SCharles.Forsyth #define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) 111*37da2899SCharles.Forsyth #define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) 112*37da2899SCharles.Forsyth #define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) 113*37da2899SCharles.Forsyth #define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) 114*37da2899SCharles.Forsyth #define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) 115*37da2899SCharles.Forsyth 116*37da2899SCharles.Forsyth 117*37da2899SCharles.Forsyth /*************************************************************************/ 118*37da2899SCharles.Forsyth /* */ 119*37da2899SCharles.Forsyth /* Define the FT_ERROR macro */ 120*37da2899SCharles.Forsyth /* */ 121*37da2899SCharles.Forsyth /*************************************************************************/ 122*37da2899SCharles.Forsyth 123*37da2899SCharles.Forsyth #ifdef FT_DEBUG_LEVEL_ERROR 124*37da2899SCharles.Forsyth 125*37da2899SCharles.Forsyth #define FT_ERROR( varformat ) FT_Message varformat 126*37da2899SCharles.Forsyth 127*37da2899SCharles.Forsyth #else /* !FT_DEBUG_LEVEL_ERROR */ 128*37da2899SCharles.Forsyth 129*37da2899SCharles.Forsyth #define FT_ERROR( varformat ) do ; while ( 0 ) /* nothing */ 130*37da2899SCharles.Forsyth 131*37da2899SCharles.Forsyth #endif /* !FT_DEBUG_LEVEL_ERROR */ 132*37da2899SCharles.Forsyth 133*37da2899SCharles.Forsyth 134*37da2899SCharles.Forsyth /*************************************************************************/ 135*37da2899SCharles.Forsyth /* */ 136*37da2899SCharles.Forsyth /* Define the FT_ASSERT macro */ 137*37da2899SCharles.Forsyth /* */ 138*37da2899SCharles.Forsyth /*************************************************************************/ 139*37da2899SCharles.Forsyth 140*37da2899SCharles.Forsyth #ifdef FT_DEBUG_LEVEL_ERROR 141*37da2899SCharles.Forsyth 142*37da2899SCharles.Forsyth #define FT_ASSERT( condition ) \ 143*37da2899SCharles.Forsyth do \ 144*37da2899SCharles.Forsyth { \ 145*37da2899SCharles.Forsyth if ( !( condition ) ) \ 146*37da2899SCharles.Forsyth FT_Panic( "assertion failed on line %d of file %s\n", \ 147*37da2899SCharles.Forsyth __LINE__, __FILE__ ); \ 148*37da2899SCharles.Forsyth } while ( 0 ) 149*37da2899SCharles.Forsyth 150*37da2899SCharles.Forsyth #else /* !FT_DEBUG_LEVEL_ERROR */ 151*37da2899SCharles.Forsyth 152*37da2899SCharles.Forsyth #define FT_ASSERT( condition ) do ; while ( 0 ) 153*37da2899SCharles.Forsyth 154*37da2899SCharles.Forsyth #endif /* !FT_DEBUG_LEVEL_ERROR */ 155*37da2899SCharles.Forsyth 156*37da2899SCharles.Forsyth 157*37da2899SCharles.Forsyth /*************************************************************************/ 158*37da2899SCharles.Forsyth /* */ 159*37da2899SCharles.Forsyth /* Define 'FT_Message' and 'FT_Panic' when needed */ 160*37da2899SCharles.Forsyth /* */ 161*37da2899SCharles.Forsyth /*************************************************************************/ 162*37da2899SCharles.Forsyth 163*37da2899SCharles.Forsyth #ifdef FT_DEBUG_LEVEL_ERROR 164*37da2899SCharles.Forsyth 165*37da2899SCharles.Forsyth #include "stdio.h" /* for vprintf() */ 166*37da2899SCharles.Forsyth 167*37da2899SCharles.Forsyth /* print a message */ 168*37da2899SCharles.Forsyth FT_EXPORT( void ) 169*37da2899SCharles.Forsyth FT_Message( const char* fmt, ... ); 170*37da2899SCharles.Forsyth 171*37da2899SCharles.Forsyth /* print a message and exit */ 172*37da2899SCharles.Forsyth FT_EXPORT( void ) 173*37da2899SCharles.Forsyth FT_Panic( const char* fmt, ... ); 174*37da2899SCharles.Forsyth 175*37da2899SCharles.Forsyth #endif /* FT_DEBUG_LEVEL_ERROR */ 176*37da2899SCharles.Forsyth 177*37da2899SCharles.Forsyth 178*37da2899SCharles.Forsyth FT_BASE( void ) 179*37da2899SCharles.Forsyth ft_debug_init( void ); 180*37da2899SCharles.Forsyth 181*37da2899SCharles.Forsyth 182*37da2899SCharles.Forsyth #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ 183*37da2899SCharles.Forsyth 184*37da2899SCharles.Forsyth /* we disable the warning `conditional expression is constant' here */ 185*37da2899SCharles.Forsyth /* in order to compile cleanly with the maximum level of warnings */ 186*37da2899SCharles.Forsyth #pragma warning( disable : 4127 ) 187*37da2899SCharles.Forsyth 188*37da2899SCharles.Forsyth #endif /* _MSC_VER */ 189*37da2899SCharles.Forsyth 190*37da2899SCharles.Forsyth 191*37da2899SCharles.Forsyth FT_END_HEADER 192*37da2899SCharles.Forsyth 193*37da2899SCharles.Forsyth #endif /* __FTDEBUG_H__ */ 194*37da2899SCharles.Forsyth 195*37da2899SCharles.Forsyth 196*37da2899SCharles.Forsyth /* END */ 197