From e854adc669bfa5e4c865b02c1b6e011f54155004 Mon Sep 17 00:00:00 2001 From: Priyesh Kumar Date: Wed, 15 Jul 2020 18:33:43 +0530 Subject: [PATCH] Started adding the support of logging on windows --- [priyesh]ChangeLog | 7 + builds/compiler/gcc.mk | 2 +- builds/windows/ftdebug.c | 243 ++++++++++++++++++++++++++++- include/freetype/config/ftoption.h | 11 +- 4 files changed, 257 insertions(+), 6 deletions(-) diff --git a/[priyesh]ChangeLog b/[priyesh]ChangeLog index b94ed3a28..ff19d0b4e 100644 --- a/[priyesh]ChangeLog +++ b/[priyesh]ChangeLog @@ -1,3 +1,10 @@ +2020-07-15 Priyesh Kumar + + * builds\compiler\gcc.mk: Added a flag -std=c99 for using dlg on windows + + * builds\windows\ftdebug.c: Added support for using `FT_LOGGING` on + windows. + 2020-07-13 Priyesh Kumar * include/freetype/ftlogging.h: Changed the definition of callback diff --git a/builds/compiler/gcc.mk b/builds/compiler/gcc.mk index 63cd93b26..0a9b97ad4 100644 --- a/builds/compiler/gcc.mk +++ b/builds/compiler/gcc.mk @@ -61,7 +61,7 @@ T := -o$(space) # Use the ANSIFLAGS variable to define the compiler flags used to enfore # ANSI compliance. # -CFLAGS ?= -c -g -O3 -Wall +CFLAGS ?= -c -g -O3 -Wall -std=c99 # ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. # diff --git a/builds/windows/ftdebug.c b/builds/windows/ftdebug.c index d58949003..eba7ca9e7 100644 --- a/builds/windows/ftdebug.c +++ b/builds/windows/ftdebug.c @@ -44,6 +44,62 @@ #include #include +#ifdef FT_LOGGING + + /************************************************************************** + * + * Variable used when FT_LOGGING is enabled to control logging: + * + * 1. ft_default_trace_level: stores the value of trace levels which are + * provided to FreeType using FT2_DEBUG environment variable. + * + * 2. ft_custom_trace_level: stores the value of custom trace level which + * is provided by user at run-time. + * + * 3. ft_component: a string that holds the name of FT_COMPONENT + * + * 4. ft_fileptr: store the FILE* + * + * 5. ft_component_flag: a flag when is true, prints FT_COMPONENT along + * with log message if `-v` is defined in FT2_DEBUG + * 6. ft_timestamp_flag: a flag when is true, prints time in millisec along + * with log message if `-t` is define in FT2_DEBUG + * 7. ft_have_newline_char: It is used to differentiate between a log + * message with '\n' char and log message without '\n' char + * + * Static Variables are defined here to remove [ -Wunused-variable ] + * warning + * + */ + static const char* ft_default_trace_level = NULL; + static const char* ft_custom_trace_level = NULL; + static const char* ft_component = NULL; + static FILE* ft_fileptr = NULL; + static bool ft_component_flag = false; + static bool ft_timestamp_flag = false; + static bool ft_have_newline_char = true; + + ft_custom_log_handler custom_output_handler = NULL; + dlg_handler ft_default_log_handler = NULL; + + /* different types of dlg features to be used according to the flags */ + /* passed in FT2_DEBUG environment variable */ + + static unsigned int features_component = dlg_output_threadsafe + | dlg_output_tags; + static unsigned int features_timestamp = dlg_output_threadsafe + | dlg_output_time + | dlg_output_time_msecs; + static unsigned int features_both = dlg_output_threadsafe + | dlg_output_time_msecs + |dlg_output_time + | dlg_output_tags ; + static unsigned int features_none = dlg_output_threadsafe; + + + +#endif + #ifdef FT_DEBUG_LEVEL_ERROR @@ -207,7 +263,18 @@ FT_BASE_DEF( void ) ft_debug_init( void ) { - const char* ft2_debug = getenv( "FT2_DEBUG" ); + const char* ft2_debug = NULL; + +#ifdef FT_LOGGING + +if( ft_custom_trace_level != NULL ) + ft2_debug = ft_custom_trace_level; +else + ft2_debug = ft_default_trace_level; + +#else + ft2_debug = ft_getenv( "FT2_DEBUG" ); +#endif /* FT_LOGGIGN */ if ( ft2_debug ) @@ -218,10 +285,40 @@ for ( ; *p; p++ ) { + /* skip leading whitespace and separators */ if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) continue; +#ifdef FT_LOGGING + /* check extra arguments for logging */ + if( *p == '-' ) + { + const char* r = ++p; + if( *r == 'v' ) + { + ft_component_flag = true; + const char* s = ++r; + if( *s == 't' ) + { + ft_timestamp_flag = true; + p++; + } + p++; + } + else if( *r == 't' ) + { + ft_timestamp_flag = true; + const char* s = ++r; + if( *s == 'v' ) + { + ft_component_flag = true; + p++; + } + p++; + } + } +#endif /* read toggle name, followed by ':' */ q = p; while ( *p && *p != ':' ) @@ -281,7 +378,6 @@ ft_trace_levels = ft_trace_levels_enabled; } - #else /* !FT_DEBUG_LEVEL_TRACE */ @@ -327,4 +423,147 @@ #endif /* !FT_DEBUG_LEVEL_TRACE */ +#ifdef FT_LOGGING + + /************************************************************************** + * + * If FT_LOGGING is enabled, FreeType needs to initialize all logging + * variables to write logs. + * Therefore it uses `ft_logging_init()` function to initialize a + * loggging variables and `ft_logging_deinit()` to un-initialize the + * logging variables. + * + */ + + FT_BASE_DEF( void ) + ft_logging_init( void ) + { + ft_default_log_handler = ft_log_handler; + ft_default_trace_level = ft_getenv( "FT2_DEBUG" ); + ft_fileptr = fopen( "freetype2.log", "w" ); + + ft_debug_init(); + /* We need to set the default FreeType specific dlg's output handler */ + dlg_set_handler( ft_default_log_handler, NULL ); + + } + + FT_BASE_DEF( void ) + ft_logging_deinit( void ) + { + fclose( ft_fileptr ); + } + + /************************************************************************* + * + * TODO: + * 1. Add support for priniting FT_COMPONENT + * + */ + FT_BASE_DEF( void ) + ft_log_handler( const struct dlg_origin* origin, + const char* string, void* data ) + { + static unsigned int features ; + if( ft_timestamp_flag && ft_component_flag && ft_have_newline_char ) + features = features_both; + else if( ft_component_flag && ft_have_newline_char) + features = features_component; + else if( ft_timestamp_flag && ft_have_newline_char ) + features = features_timestamp; + else + features = features_none; + + + dlg_generic_output_stream( ft_fileptr, features, origin, string, + dlg_default_output_styles ); + + if( strchr( string, '\n' ) ) + ft_have_newline_char = true; + else + ft_have_newline_char = false; + } + + /************************************************************************** + * + * Functions to set trace levels at run-time + * 1. FT_Trace_Set_Level() - Use this function to change the trace level + * at run-time. e.g. FT_Trace_Set_Level( "any:6 io:2" ); + * + * 2. FT_Trace_Set_Default_Level() - Use this function to set the default + * value of trace levels which is provided by environment variable + * FT2_DEBUG + * + */ + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Level( const char* level ) + { + ft_custom_trace_level = level; + ft_debug_init(); + } + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Default_Level( void ) + { + ft_custom_trace_level = NULL ; + ft_debug_init(); + } + +/**************************************************************************** + * + * Functions to handle custom log handler: + * + */ + + FT_EXPORT_DEF( void ) + FT_Set_Log_Handler( ft_custom_log_handler handler ) + { + custom_output_handler = handler; + } + + FT_EXPORT_DEF( void ) + FT_Set_Default_Log_Handler() + { + custom_output_handler = NULL; + } + + FT_BASE_DEF( void ) + FT_Callback( const char* fmt, ... ) + { + va_list ap; + va_start( ap, fmt ); + custom_output_handler( ft_component , fmt, ap ); + va_end( ap ); + } + + FT_BASE_DEF( void ) + ft_add_tag( const char* tag ) + { + ft_component = tag; + dlg_add_tag( tag, NULL ); + } + + FT_BASE_DEF( void ) + ft_remove_tag( const char* tag ) + { + dlg_remove_tag( tag, NULL ); + } + +#else /* ! FT_LOGGING */ + + FT_BASE_DEF( void ) + ft_add_tag( const char* tag ) + { + /* nothing */ + } + + FT_BASE_DEF( void ) + ft_remove_tag( const char* tag ) + { + /* nothing */ + } + +#endif /* FT_LOGGING*/ + /* END */ diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h index 92aa89bab..51dde31c3 100644 --- a/include/freetype/config/ftoption.h +++ b/include/freetype/config/ftoption.h @@ -440,10 +440,15 @@ FT_BEGIN_HEADER * Enabling this macro will automatically force the `FT_DEBUG_LEVEL_ERROR` * and `FT_DEBUG_LEVEL_TRACE` macros and will allow FreeType to write * error and trace log messages to a file instead of `stderr` - * + * For writing logs to file FreeType uses an external library `dlg` + * Source Code - `src/dlg` + * + * When on Windows platform, and using a static build of dlg to link + * it with FreeType, Define the macro `DLG_STATIC` so that it gets + * linked properly(see src/dlg/include/dlg.h:76) */ -/* #define FT_LOGGING */ - +/* #define FT_LOGGING */ +/* #define DLG_STATIC */ /************************************************************************** *