1 /***************************************************************************/ 2 /* */ 3 /* ftdebug.c */ 4 /* */ 5 /* Debugging and logging component (body). */ 6 /* */ 7 /* Copyright 1996-2001 by */ 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9 /* */ 10 /* This file is part of the FreeType project, and may only be used, */ 11 /* modified, and distributed under the terms of the FreeType project */ 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13 /* this file you indicate that you have read the license and */ 14 /* understand and accept it fully. */ 15 /* */ 16 /***************************************************************************/ 17 18 19 /*************************************************************************/ 20 /* */ 21 /* This component contains various macros and functions used to ease the */ 22 /* debugging of the FreeType engine. Its main purpose is in assertion */ 23 /* checking, tracing, and error detection. */ 24 /* */ 25 /* There are now three debugging modes: */ 26 /* */ 27 /* - trace mode */ 28 /* */ 29 /* Error and trace messages are sent to the log file (which can be the */ 30 /* standard error output). */ 31 /* */ 32 /* - error mode */ 33 /* */ 34 /* Only error messages are generated. */ 35 /* */ 36 /* - release mode: */ 37 /* */ 38 /* No error message is sent or generated. The code is free from any */ 39 /* debugging parts. */ 40 /* */ 41 /*************************************************************************/ 42 43 44 #include <ft2build.h> 45 #include FT_FREETYPE_H 46 #include FT_INTERNAL_DEBUG_H 47 48 49 #if defined( FT_DEBUG_LEVEL_ERROR ) 50 51 FT_EXPORT_DEF( void ) FT_Message(const char * fmt,...)52 FT_Message( const char* fmt, ... ) 53 { 54 va_list ap; 55 56 57 va_start( ap, fmt ); 58 vprintf( fmt, ap ); 59 va_end( ap ); 60 } 61 62 63 FT_EXPORT_DEF( void ) FT_Panic(const char * fmt,...)64 FT_Panic( const char* fmt, ... ) 65 { 66 va_list ap; 67 68 69 va_start( ap, fmt ); 70 vprintf( fmt, ap ); 71 va_end( ap ); 72 73 exit( EXIT_FAILURE ); 74 } 75 76 #endif /* FT_DEBUG_LEVEL_ERROR */ 77 78 79 80 #ifdef FT_DEBUG_LEVEL_TRACE 81 82 /* array of trace levels, initialized to 0 */ 83 int ft_trace_levels[trace_count]; 84 85 /* define array of trace toggle names */ 86 #define FT_TRACE_DEF(x) #x , 87 88 static const char* ft_trace_toggles[trace_count + 1] = 89 { 90 #include FT_INTERNAL_TRACE_H 91 NULL 92 }; 93 94 #undef FT_TRACE_DEF 95 96 97 /*************************************************************************/ 98 /* */ 99 /* Initialize the tracing sub-system. This is done by retrieving the */ 100 /* value of the "FT2_DEBUG" environment variable. It must be a list of */ 101 /* toggles, separated by spaces, `;' or `,'. Example: */ 102 /* */ 103 /* "any:3 memory:6 stream:5" */ 104 /* */ 105 /* This will request that all levels be set to 3, except the trace level */ 106 /* for the memory and stream components which are set to 6 and 5, */ 107 /* respectively. */ 108 /* */ 109 /* See the file <freetype/internal/fttrace.h> for details of the */ 110 /* available toggle names. */ 111 /* */ 112 /* The level must be between 0 and 6; 0 means quiet (except for serious */ 113 /* runtime errors), and 6 means _very_ verbose. */ 114 /* */ 115 FT_BASE_DEF( void ) ft_debug_init(void)116 ft_debug_init( void ) 117 { 118 const char* ft2_debug = getenv( "FT2_DEBUG" ); 119 120 if ( ft2_debug ) 121 { 122 const char* p = ft2_debug; 123 const char* q; 124 125 126 for ( ; *p; p++ ) 127 { 128 /* skip leading whitespace and separators */ 129 if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) 130 continue; 131 132 /* read toggle name, followed by ':' */ 133 q = p; 134 while ( *p && *p != ':' ) 135 p++; 136 137 if ( *p == ':' && p > q ) 138 { 139 FT_Int n, i, len = (FT_Int)(p - q); 140 FT_Int level = -1, found = -1; 141 142 143 for ( n = 0; n < trace_count; n++ ) 144 { 145 const char* toggle = ft_trace_toggles[n]; 146 147 148 for ( i = 0; i < len; i++ ) 149 { 150 if ( toggle[i] != q[i] ) 151 break; 152 } 153 154 if ( i == len && toggle[i] == 0 ) 155 { 156 found = n; 157 break; 158 } 159 } 160 161 /* read level */ 162 p++; 163 if ( *p ) 164 { 165 level = *p++ - '0'; 166 if ( level < 0 || level > 6 ) 167 level = -1; 168 } 169 170 if ( found >= 0 && level >= 0 ) 171 { 172 if ( found == trace_any ) 173 { 174 /* special case for "any" */ 175 for ( n = 0; n < trace_count; n++ ) 176 ft_trace_levels[n] = level; 177 } 178 else 179 ft_trace_levels[found] = level; 180 } 181 } 182 } 183 } 184 } 185 186 #else /* !FT_DEBUG_LEVEL_TRACE */ 187 188 FT_BASE_DEF( void ) ft_debug_init(void)189 ft_debug_init( void ) 190 { 191 /* nothing */ 192 } 193 194 #endif /* !FT_DEBUG_LEVEL_TRACE */ 195 196 197 /* END */ 198