@ -45,12 +45,7 @@
# include FT_INTERNAL_DEBUG_H
# ifdef FT_DEBUG_LEVEL_TRACE
char ft_trace_levels [ trace_max ] ;
# endif
# if defined( FT_DEBUG_LEVEL_ERROR ) || defined( FT_DEBUG_LEVEL_TRACE )
# ifdef FT_DEBUG_LEVEL_ERROR
# include <stdarg.h>
@ -90,35 +85,124 @@
}
# ifdef FT_DEBUG_LEVEL_TRACE
FT_EXPORT_DEF ( void )
FT_SetTraceLevel ( FT_Trace component ,
char level )
{
if ( component > = trace_max )
return ;
/* array of trace levels, initialized to 0 */
int ft_trace_levels [ trace_count ] ;
/* if component is `trace_any', change _all_ levels at once */
if ( component = = trace_any )
{
int n ;
/* define array of trace toggle names */
# define FT_TRACE_DEF(x) #x ,
static const char * ft_trace_toggles [ trace_count + 1 ] =
{
# include FT_INTERNAL_TRACE_H
NULL
} ;
for ( n = trace_any ; n < trace_max ; n + + )
ft_trace_levels [ n ] = level ;
# undef FT_TRACE_DEF
/*************************************************************************/
/* */
/* Initialize the tracing sub-system. This is done by retrieving the */
/* value of the "FT2_DEBUG" environment variable. It must be a list of */
/* toggles, separated by spaces, `;' or `:'. Example: */
/* */
/* "any=3 memory=6 stream=5" */
/* */
/* This will request that all levels be set to 3, except the trace level */
/* for the memory and stream components which are set to 6 and 5, */
/* respectively. */
/* */
/* See the file <freetype/internal/fttrace.h> for details of the */
/* available toggle names. */
/* */
/* The level must be between 0 and 6; 0 means quiet (except for serious */
/* runtime errors), and 6 means _very_ verbose. */
/* */
FT_BASE_DEF ( void )
ft_debug_init ( void )
{
const char * ft2_debug = getenv ( " FT2_DEBUG " ) ;
if ( ft2_debug )
{
const char * p = ft2_debug ;
const char * q ;
for ( ; * p ; p + + )
{
/* skip leading whitespace and separators */
if ( * p = = ' ' | | * p = = ' \t ' | | * p = = ' : ' | | * p = = ' ; ' | | * p = = ' = ' )
continue ;
/* read toggle name, followed by '=' */
q = p ;
while ( * p & & * p ! = ' = ' )
p + + ;
if ( * p = = ' = ' & & p > q )
{
int n , i , len = p - q ;
int level = - 1 , found = - 1 ;
for ( n = 0 ; n < trace_count ; n + + )
{
const char * toggle = ft_trace_toggles [ n ] ;
for ( i = 0 ; i < len ; i + + )
{
if ( toggle [ i ] ! = q [ i ] )
break ;
}
if ( i = = len & & toggle [ i ] = = 0 )
{
found = n ;
break ;
}
}
/* read level */
p + + ;
if ( * p )
{
level = * p + + - ' 0 ' ;
if ( level < 0 | | level > 6 )
level = - 1 ;
}
if ( found > = 0 & & level > = 0 )
{
if ( found = = trace_any )
{
/* special case for "any" */
for ( n = 0 ; n < trace_count ; n + + )
ft_trace_levels [ n ] = level ;
}
else
ft_trace_levels [ found ] = level ;
}
}
}
}
else /* otherwise, only change individual component */
ft_trace_levels [ component ] = level ;
}
# endif /* FT_DEBUG_LEVEL_TRACE */
# endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */
# else /* !FT_DEBUG_LEVEL_TRACE */
FT_BASE_DEF ( void )
ft_debug_init ( void )
{
/* nothing */
}
/* ANSI C doesn't allow empty files, so we insert a dummy symbol */
extern const int ft_debug_dummy ;
# endif /* !FT_DEBUG_LEVEL_TRACE */
/* END */