blob: 67735fcdcab0f369c6521c3d660b34c9f20599b7 [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
David Turner02c3aed2002-07-08 23:02:32 +0000184 if ( *p == ':' && p > q )
David Turner222cec82002-02-21 11:48:48 +0000185 {
Werner Lemberg460355a2004-02-24 07:52:45 +0000186 FT_Int n, i, len = (FT_Int)( p - q );
Werner Lemberg68e9f922002-09-27 11:09:23 +0000187 FT_Int level = -1, found = -1;
David Turner02c3aed2002-07-08 23:02:32 +0000188
Werner Lembergaf8df852002-02-22 00:58:04 +0000189
David Turner222cec82002-02-21 11:48:48 +0000190 for ( n = 0; n < trace_count; n++ )
191 {
192 const char* toggle = ft_trace_toggles[n];
David Turner02c3aed2002-07-08 23:02:32 +0000193
Werner Lembergaf8df852002-02-22 00:58:04 +0000194
David Turner222cec82002-02-21 11:48:48 +0000195 for ( i = 0; i < len; i++ )
196 {
197 if ( toggle[i] != q[i] )
198 break;
199 }
David Turner02c3aed2002-07-08 23:02:32 +0000200
David Turner222cec82002-02-21 11:48:48 +0000201 if ( i == len && toggle[i] == 0 )
202 {
203 found = n;
204 break;
205 }
206 }
David Turner02c3aed2002-07-08 23:02:32 +0000207
David Turner222cec82002-02-21 11:48:48 +0000208 /* read level */
209 p++;
210 if ( *p )
211 {
212 level = *p++ - '0';
Werner Lemberg92c9f102004-09-04 06:53:36 +0000213 if ( level < 0 || level > 7 )
David Turner222cec82002-02-21 11:48:48 +0000214 level = -1;
215 }
David Turner02c3aed2002-07-08 23:02:32 +0000216
David Turner222cec82002-02-21 11:48:48 +0000217 if ( found >= 0 && level >= 0 )
218 {
219 if ( found == trace_any )
220 {
Werner Lemberg460355a2004-02-24 07:52:45 +0000221 /* special case for `any' */
David Turner222cec82002-02-21 11:48:48 +0000222 for ( n = 0; n < trace_count; n++ )
223 ft_trace_levels[n] = level;
224 }
225 else
Werner Lembergaf8df852002-02-22 00:58:04 +0000226 ft_trace_levels[found] = level;
David Turner222cec82002-02-21 11:48:48 +0000227 }
228 }
229 }
David Turnerd2b1f351999-12-16 23:11:37 +0000230 }
David Turnerd2b1f351999-12-16 23:11:37 +0000231 }
232
Werner Lemberg460355a2004-02-24 07:52:45 +0000233
David Turner222cec82002-02-21 11:48:48 +0000234#else /* !FT_DEBUG_LEVEL_TRACE */
David Turnerd2b1f351999-12-16 23:11:37 +0000235
Werner Lemberg460355a2004-02-24 07:52:45 +0000236
David Turner222cec82002-02-21 11:48:48 +0000237 FT_BASE_DEF( void )
David Turner88027fd2002-04-17 11:32:10 +0000238 ft_debug_init( void )
David Turner222cec82002-02-21 11:48:48 +0000239 {
240 /* nothing */
241 }
David Turnerd2b1f351999-12-16 23:11:37 +0000242
Werner Lemberg460355a2004-02-24 07:52:45 +0000243
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +0000244 FT_BASE_DEF( FT_Int )
David Turner10bf05a2004-04-21 14:30:37 +0000245 FT_Trace_Get_Count( void )
Werner Lemberg460355a2004-02-24 07:52:45 +0000246 {
David Turner10bf05a2004-04-21 14:30:37 +0000247 return 0;
Werner Lemberg460355a2004-02-24 07:52:45 +0000248 }
249
250
Wu, Chia-I (吳佳一)35bfc0f2005-11-17 01:53:07 +0000251 FT_BASE_DEF( const char * )
David Turner10bf05a2004-04-21 14:30:37 +0000252 FT_Trace_Get_Name( FT_Int idx )
253 {
254 FT_UNUSED( idx );
255
256 return NULL;
Werner Lemberg460355a2004-02-24 07:52:45 +0000257 }
258
259
David Turner222cec82002-02-21 11:48:48 +0000260#endif /* !FT_DEBUG_LEVEL_TRACE */
David Turnerd2b1f351999-12-16 23:11:37 +0000261
Werner Lemberg63408a12000-12-13 23:44:37 +0000262
David Turnerd2b1f351999-12-16 23:11:37 +0000263/* END */