freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] priyesh_LogLibrary e854adc: Started adding the support of lo


From: Priyesh Kumar
Subject: [freetype2] priyesh_LogLibrary e854adc: Started adding the support of logging on windows
Date: Wed, 15 Jul 2020 09:04:17 -0400 (EDT)

branch: priyesh_LogLibrary
commit e854adc669bfa5e4c865b02c1b6e011f54155004
Author: Priyesh Kumar <priyeshkkumar@gmail.com>
Commit: Priyesh Kumar <priyeshkkumar@gmail.com>

    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 b94ed3a..ff19d0b 100644
--- a/[priyesh]ChangeLog
+++ b/[priyesh]ChangeLog
@@ -1,3 +1,10 @@
+2020-07-15  Priyesh Kumar   <priyeshkkumar@gmail.com>
+
+    * 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   <priyeshkkumar@gmail.com>
 
     * include/freetype/ftlogging.h: Changed the definition of callback 
diff --git a/builds/compiler/gcc.mk b/builds/compiler/gcc.mk
index 63cd93b..0a9b97a 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 d589490..eba7ca9 100644
--- a/builds/windows/ftdebug.c
+++ b/builds/windows/ftdebug.c
@@ -44,6 +44,62 @@
 #include <freetype/freetype.h>
 #include <freetype/internal/ftdebug.h>
 
+#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 92aa89b..51dde31 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 */
 
   /**************************************************************************
    *



reply via email to

[Prev in Thread] Current Thread [Next in Thread]