blob: b9156d15ee3c570c712eed6ba0ba002f563172eb [file] [log] [blame]
David Turnerd2b1f351999-12-16 23:11:37 +00001/***************************************************************************/
2/* */
3/* ftdebug.c */
4/* */
5/* Debugging and logging component (body). */
6/* */
Werner Lembergb114b7c2013-03-17 22:42:07 +01007/* Copyright 1996-2001, 2002, 2004, 2008, 2013 by */
David Turnerd2b1f351999-12-16 23:11:37 +00008/* David Turner, Robert Wilhelm, and Werner Lemberg. */
9/* */
Werner Lemberg4e6dd852000-06-05 05:26:15 +000010/* This file is part of the FreeType project, and may only be used, */
11/* modified, and distributed under the terms of the FreeType project */
David Turnerd2b1f351999-12-16 23:11:37 +000012/* 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
Werner Lemberg9a754ce2000-06-02 21:31:32 +000019 /*************************************************************************/
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
Werner Lembergcc069be2000-12-08 16:17:16 +000043
44#include <ft2build.h>
David Turner88027fd2002-04-17 11:32:10 +000045#include FT_FREETYPE_H
Werner Lembergcc069be2000-12-08 16:17:16 +000046#include FT_INTERNAL_DEBUG_H
47
David Turnerd2b1f351999-12-16 23:11:37 +000048
Werner Lemberg02197282008-11-29 09:31:44 +000049#ifdef FT_DEBUG_LEVEL_ERROR
David Turnerd2b1f351999-12-16 23:11:37 +000050
Werner Lembergece8b202004-12-13 23:16:59 +000051 /* documentation is in ftdebug.h */
52
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +000053 FT_BASE_DEF( void )
Werner Lembergb114b7c2013-03-17 22:42:07 +010054 FT_Message( const char* fmt,
55 ... )
David Turnerd2b1f351999-12-16 23:11:37 +000056 {
57 va_list ap;
58
59
60 va_start( ap, fmt );
Werner Lemberg16dc51f2008-05-18 17:36:15 +000061 vfprintf( stderr, fmt, ap );
David Turnerd2b1f351999-12-16 23:11:37 +000062 va_end( ap );
63 }
64
65
Werner Lembergece8b202004-12-13 23:16:59 +000066 /* documentation is in ftdebug.h */
67
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +000068 FT_BASE_DEF( void )
Werner Lembergb114b7c2013-03-17 22:42:07 +010069 FT_Panic( const char* fmt,
70 ... )
David Turnerd2b1f351999-12-16 23:11:37 +000071 {
72 va_list ap;
73
74
75 va_start( ap, fmt );
Werner Lemberg16dc51f2008-05-18 17:36:15 +000076 vfprintf( stderr, fmt, ap );
David Turnerd2b1f351999-12-16 23:11:37 +000077 va_end( ap );
78
79 exit( EXIT_FAILURE );
80 }
81
Werner Lembergc58ce3b2013-03-13 11:06:39 +010082
83 /* documentation is in ftdebug.h */
84
85 FT_BASE_DEF( int )
86 FT_Throw( FT_Error error,
87 int line,
88 const char* file )
89 {
90 FT_UNUSED( error );
91 FT_UNUSED( line );
92 FT_UNUSED( file );
93
94 return 0;
95 }
96
David Turner222cec82002-02-21 11:48:48 +000097#endif /* FT_DEBUG_LEVEL_ERROR */
98
99
David Turnerd2b1f351999-12-16 23:11:37 +0000100
101#ifdef FT_DEBUG_LEVEL_TRACE
102
David Turner222cec82002-02-21 11:48:48 +0000103 /* array of trace levels, initialized to 0 */
Werner Lembergaf8df852002-02-22 00:58:04 +0000104 int ft_trace_levels[trace_count];
David Turner222cec82002-02-21 11:48:48 +0000105
Werner Lemberg460355a2004-02-24 07:52:45 +0000106
Werner Lembergaf8df852002-02-22 00:58:04 +0000107 /* define array of trace toggle names */
Werner Lemberg460355a2004-02-24 07:52:45 +0000108#define FT_TRACE_DEF( x ) #x ,
David Turner222cec82002-02-21 11:48:48 +0000109
Werner Lembergaf8df852002-02-22 00:58:04 +0000110 static const char* ft_trace_toggles[trace_count + 1] =
David Turner02c3aed2002-07-08 23:02:32 +0000111 {
David Turner222cec82002-02-21 11:48:48 +0000112#include FT_INTERNAL_TRACE_H
113 NULL
114 };
115
116#undef FT_TRACE_DEF
117
118
Werner Lemberg460355a2004-02-24 07:52:45 +0000119 /* documentation is in ftdebug.h */
120
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +0000121 FT_BASE_DEF( FT_Int )
Werner Lemberg460355a2004-02-24 07:52:45 +0000122 FT_Trace_Get_Count( void )
123 {
124 return trace_count;
125 }
126
127
128 /* documentation is in ftdebug.h */
129
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +0000130 FT_BASE_DEF( const char * )
Werner Lemberg391de1a2004-04-11 16:44:54 +0000131 FT_Trace_Get_Name( FT_Int idx )
Werner Lemberg460355a2004-02-24 07:52:45 +0000132 {
133 int max = FT_Trace_Get_Count();
134
135
Werner Lemberg391de1a2004-04-11 16:44:54 +0000136 if ( idx < max )
137 return ft_trace_toggles[idx];
Werner Lemberg460355a2004-02-24 07:52:45 +0000138 else
139 return NULL;
140 }
141
142
Werner Lembergaf8df852002-02-22 00:58:04 +0000143 /*************************************************************************/
144 /* */
145 /* Initialize the tracing sub-system. This is done by retrieving the */
Werner Lemberg460355a2004-02-24 07:52:45 +0000146 /* value of the `FT2_DEBUG' environment variable. It must be a list of */
147 /* toggles, separated by spaces, `;', or `,'. Example: */
Werner Lembergaf8df852002-02-22 00:58:04 +0000148 /* */
Werner Lemberg92c9f102004-09-04 06:53:36 +0000149 /* export FT2_DEBUG="any:3 memory:7 stream:5" */
Werner Lembergaf8df852002-02-22 00:58:04 +0000150 /* */
Werner Lemberg460355a2004-02-24 07:52:45 +0000151 /* This requests that all levels be set to 3, except the trace level for */
Werner Lemberg92c9f102004-09-04 06:53:36 +0000152 /* the memory and stream components which are set to 7 and 5, */
Werner Lembergaf8df852002-02-22 00:58:04 +0000153 /* respectively. */
154 /* */
Werner Lemberg460355a2004-02-24 07:52:45 +0000155 /* See the file <include/freetype/internal/fttrace.h> for details of the */
Werner Lembergaf8df852002-02-22 00:58:04 +0000156 /* available toggle names. */
157 /* */
Werner Lemberg92c9f102004-09-04 06:53:36 +0000158 /* The level must be between 0 and 7; 0 means quiet (except for serious */
159 /* runtime errors), and 7 means _very_ verbose. */
Werner Lembergaf8df852002-02-22 00:58:04 +0000160 /* */
David Turner222cec82002-02-21 11:48:48 +0000161 FT_BASE_DEF( void )
162 ft_debug_init( void )
David Turnerd2b1f351999-12-16 23:11:37 +0000163 {
David Turner222cec82002-02-21 11:48:48 +0000164 const char* ft2_debug = getenv( "FT2_DEBUG" );
David Turner02c3aed2002-07-08 23:02:32 +0000165
Werner Lemberg460355a2004-02-24 07:52:45 +0000166
David Turner222cec82002-02-21 11:48:48 +0000167 if ( ft2_debug )
David Turnerd2b1f351999-12-16 23:11:37 +0000168 {
David Turner222cec82002-02-21 11:48:48 +0000169 const char* p = ft2_debug;
170 const char* q;
David Turner02c3aed2002-07-08 23:02:32 +0000171
Werner Lembergaf8df852002-02-22 00:58:04 +0000172
David Turner222cec82002-02-21 11:48:48 +0000173 for ( ; *p; p++ )
174 {
175 /* skip leading whitespace and separators */
David Turner02c3aed2002-07-08 23:02:32 +0000176 if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
David Turner222cec82002-02-21 11:48:48 +0000177 continue;
David Turner02c3aed2002-07-08 23:02:32 +0000178
179 /* read toggle name, followed by ':' */
David Turner222cec82002-02-21 11:48:48 +0000180 q = p;
David Turner02c3aed2002-07-08 23:02:32 +0000181 while ( *p && *p != ':' )
David Turner222cec82002-02-21 11:48:48 +0000182 p++;
David Turner10bf05a2004-04-21 14:30:37 +0000183
Brian Nixon8d6025c2013-05-13 09:06:42 +0200184 if ( !*p )
185 break;
186
David Turner02c3aed2002-07-08 23:02:32 +0000187 if ( *p == ':' && p > q )
David Turner222cec82002-02-21 11:48:48 +0000188 {
Werner Lemberg460355a2004-02-24 07:52:45 +0000189 FT_Int n, i, len = (FT_Int)( p - q );
Werner Lemberg68e9f922002-09-27 11:09:23 +0000190 FT_Int level = -1, found = -1;
David Turner02c3aed2002-07-08 23:02:32 +0000191
Werner Lembergaf8df852002-02-22 00:58:04 +0000192
David Turner222cec82002-02-21 11:48:48 +0000193 for ( n = 0; n < trace_count; n++ )
194 {
195 const char* toggle = ft_trace_toggles[n];
David Turner02c3aed2002-07-08 23:02:32 +0000196
Werner Lembergaf8df852002-02-22 00:58:04 +0000197
David Turner222cec82002-02-21 11:48:48 +0000198 for ( i = 0; i < len; i++ )
199 {
200 if ( toggle[i] != q[i] )
201 break;
202 }
David Turner02c3aed2002-07-08 23:02:32 +0000203
David Turner222cec82002-02-21 11:48:48 +0000204 if ( i == len && toggle[i] == 0 )
205 {
206 found = n;
207 break;
208 }
209 }
David Turner02c3aed2002-07-08 23:02:32 +0000210
David Turner222cec82002-02-21 11:48:48 +0000211 /* read level */
212 p++;
213 if ( *p )
214 {
Brian Nixon8d6025c2013-05-13 09:06:42 +0200215 level = *p - '0';
Werner Lemberg92c9f102004-09-04 06:53:36 +0000216 if ( level < 0 || level > 7 )
David Turner222cec82002-02-21 11:48:48 +0000217 level = -1;
218 }
David Turner02c3aed2002-07-08 23:02:32 +0000219
David Turner222cec82002-02-21 11:48:48 +0000220 if ( found >= 0 && level >= 0 )
221 {
222 if ( found == trace_any )
223 {
Werner Lemberg460355a2004-02-24 07:52:45 +0000224 /* special case for `any' */
David Turner222cec82002-02-21 11:48:48 +0000225 for ( n = 0; n < trace_count; n++ )
226 ft_trace_levels[n] = level;
227 }
228 else
Werner Lembergaf8df852002-02-22 00:58:04 +0000229 ft_trace_levels[found] = level;
David Turner222cec82002-02-21 11:48:48 +0000230 }
231 }
232 }
David Turnerd2b1f351999-12-16 23:11:37 +0000233 }
David Turnerd2b1f351999-12-16 23:11:37 +0000234 }
235
Werner Lemberg460355a2004-02-24 07:52:45 +0000236
David Turner222cec82002-02-21 11:48:48 +0000237#else /* !FT_DEBUG_LEVEL_TRACE */
David Turnerd2b1f351999-12-16 23:11:37 +0000238
Werner Lemberg460355a2004-02-24 07:52:45 +0000239
David Turner222cec82002-02-21 11:48:48 +0000240 FT_BASE_DEF( void )
David Turner88027fd2002-04-17 11:32:10 +0000241 ft_debug_init( void )
David Turner222cec82002-02-21 11:48:48 +0000242 {
243 /* nothing */
244 }
David Turnerd2b1f351999-12-16 23:11:37 +0000245
Werner Lemberg460355a2004-02-24 07:52:45 +0000246
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +0000247 FT_BASE_DEF( FT_Int )
David Turner10bf05a2004-04-21 14:30:37 +0000248 FT_Trace_Get_Count( void )
Werner Lemberg460355a2004-02-24 07:52:45 +0000249 {
David Turner10bf05a2004-04-21 14:30:37 +0000250 return 0;
Werner Lemberg460355a2004-02-24 07:52:45 +0000251 }
252
253
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +0000254 FT_BASE_DEF( const char * )
David Turner10bf05a2004-04-21 14:30:37 +0000255 FT_Trace_Get_Name( FT_Int idx )
256 {
257 FT_UNUSED( idx );
258
259 return NULL;
Werner Lemberg460355a2004-02-24 07:52:45 +0000260 }
261
262
David Turner222cec82002-02-21 11:48:48 +0000263#endif /* !FT_DEBUG_LEVEL_TRACE */
David Turnerd2b1f351999-12-16 23:11:37 +0000264
Werner Lemberg63408a12000-12-13 23:44:37 +0000265
David Turnerd2b1f351999-12-16 23:11:37 +0000266/* END */