freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] logging d46bada 03/21: [base] Add functions and variables to


From: Werner LEMBERG
Subject: [freetype2] logging d46bada 03/21: [base] Add functions and variables to print logs to a file.
Date: Wed, 2 Dec 2020 08:25:33 -0500 (EST)

branch: logging
commit d46bada285fb47549c26783bcb93efab4867ebc7
Author: Priyesh Kumar <priyeshkkumar@gmail.com>
Commit: Werner Lemberg <wl@gnu.org>

    [base] Add functions and variables to print logs to a file.
    
    * include/freetype/internal/ftdebug.h: Added dlg's header files.
    (FT_LOG): New macro to redirect trace logs to dlg's API's whenever
    `FT_LOGGING' is defined.
    (ft_logging_init, ft_logging_deinit): New functions to handle
    initialization and uninitialization of logging related variables.
    (ft_log_handler): New function to handle logs of FreeType.
    
    * src/base/ftdebug.c: Add necessary logging related variables.
    (ft_logging_init, ft_logging_deinit, ft_log_handler): Add function
    definitions.
    
    * src/base/ftinit.c (FT_Init_FreeType) [FT_LOGGING]: Call
    `ft_logging_init`.
    (FT_Done_FreeType) [FT_LOGGING]: Call `ft_logging_deinit`.
    
    * src/base/ftobjs.c (FT_New_Library): Call `ft_debug_init` only if
    `FT_LOGGING` is not defined.
---
 ChangeLog                           |  24 +++++++-
 include/freetype/internal/ftdebug.h | 110 ++++++++++++++++++++++++++++++++++--
 src/base/ftdebug.c                  |  78 ++++++++++++++++++++++++-
 src/base/ftinit.c                   |   8 +++
 src/base/ftobjs.c                   |   4 +-
 5 files changed, 215 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 89f6116..30c1623 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,27 @@
 2020-11-27  Priyesh Kumar  <priyeshkkumar@gmail.com>
 
+       [base] Add functions and variables to print logs to a file.
+
+       * include/freetype/internal/ftdebug.h: Added dlg's header files.
+       (FT_LOG): New macro to redirect trace logs to dlg's API's whenever
+       `FT_LOGGING' is defined.
+       (ft_logging_init, ft_logging_deinit): New functions to handle
+       initialization and uninitialization of logging related variables.
+       (ft_log_handler): New function to handle logs of FreeType.
+
+       * src/base/ftdebug.c: Add necessary logging related variables. 
+       (ft_logging_init, ft_logging_deinit, ft_log_handler): Add function
+       definitions.
+
+       * src/base/ftinit.c (FT_Init_FreeType) [FT_LOGGING]: Call
+       `ft_logging_init`.
+       (FT_Done_FreeType) [FT_LOGGING]: Call `ft_logging_deinit`.
+
+       * src/base/ftobjs.c (FT_New_Library): Call `ft_debug_init` only if
+       `FT_LOGGING` is not defined.
+
+2020-11-27  Priyesh Kumar  <priyeshkkumar@gmail.com>
+
        [builds] Necessary changes to make 'dlg' compile.
 
        * autogen.sh (copy_submodule_files): New script to copy all the
@@ -38,7 +60,7 @@
 
        * src/cff/cffobjs.c (cff_iriver_init): Always default to Adobe engine.
        * src/cid/cidobjs.c (cid_driver_init): Ditto.
-        * src/type1/t1objs.c (T1_Driver_Init): Ditto.
+       * src/type1/t1objs.c (T1_Driver_Init): Ditto.
 
 2020-11-09  Werner Lemberg  <wl@gnu.org>
 
diff --git a/include/freetype/internal/ftdebug.h 
b/include/freetype/internal/ftdebug.h
index df5357a..d56eca0 100644
--- a/include/freetype/internal/ftdebug.h
+++ b/include/freetype/internal/ftdebug.h
@@ -31,9 +31,21 @@
 
 #include "compiler-macros.h"
 
+#ifdef FT_LOGGING
+#include <../src/dlg/dlg/dlg.h>
+#include <../src/dlg/dlg/output.h>
+#endif
+
 
 FT_BEGIN_HEADER
 
+  /* force the definition of FT_DEBUG_LEVEL_TRACE if FT_LOGGING is */
+  /* already defined.                                              */
+  /*                                                               */
+#ifdef FT_LOGGING
+#undef  FT_DEBUG_LEVEL_TRACE
+#define FT_DEBUG_LEVEL_TRACE
+#endif
 
   /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
   /* is already defined; this simplifies the following #ifdefs            */
@@ -84,19 +96,43 @@ FT_BEGIN_HEADER
    *
    */
 
-#ifdef FT_DEBUG_LEVEL_TRACE
 
-  /* we need two macros here to make cpp expand `FT_COMPONENT' */
-#define FT_TRACE_COMP( x )   FT_TRACE_COMP_( x )
-#define FT_TRACE_COMP_( x )  trace_ ## x
+  /*************************************************************************
+   *
+   * If FT_LOGGING is enabled, tracing messages are sent to dlg's API.
+   * If FT_LOGGING is disabled, tracing messages are sent to `FT_Message`
+   * (defined in ftdebug.c).
+   *
+   */
+#ifdef FT_LOGGING
+
+#define FT_LOG( level, varformat )                                         \
+          do                                                               \
+          {                                                                \
+            if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \
+              dlg_trace varformat;                                         \
+          } while( 0 )
+
+#else /* !FT_LOGGING */
 
-#define FT_TRACE( level, varformat )                                       \
+#define FT_LOG( level, varformat )                                         \
           do                                                               \
           {                                                                \
             if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \
               FT_Message varformat;                                        \
           } while ( 0 )
 
+#endif /* !FT_LOGGING */
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  /* we need two macros here to make cpp expand `FT_COMPONENT' */
+#define FT_TRACE_COMP( x )   FT_TRACE_COMP_( x )
+#define FT_TRACE_COMP_( x )  trace_ ## x
+
+#define FT_TRACE( level, varformat )  FT_LOG( level, varformat )
+
 #else /* !FT_DEBUG_LEVEL_TRACE */
 
 #define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */
@@ -204,7 +240,27 @@ FT_BEGIN_HEADER
 
 #ifdef FT_DEBUG_LEVEL_ERROR
 
-#define FT_ERROR( varformat )  FT_Message  varformat
+  /*************************************************************************
+   *
+   * If FT_LOGGING is enabled, error messages are sent to dlg's API.
+   * If FT_LOGGING is disabled, error messages are sent to `FT_Message`
+   * (defined in ftdebug.c).
+   *
+   */
+#ifdef FT_LOGGING
+
+#define FT_ERROR( varformat )    \
+          do                     \
+          {                      \
+            dlg_trace varformat; \
+          } while ( 0 )
+
+#else /* !FT_LOGGING */
+
+#define FT_ERROR( varformat )  FT_Message varformat
+
+#endif /* !FT_LOGGING */
+
 
 #else  /* !FT_DEBUG_LEVEL_ERROR */
 
@@ -277,6 +333,48 @@ FT_BEGIN_HEADER
   FT_BASE( void )
   ft_debug_init( void );
 
+
+#ifdef FT_LOGGING
+
+  /**************************************************************************
+   *
+   * 'dlg' uses output handlers to control how and where log messages are
+   * printed.  Therefore we need to define a default output handler for
+   * FreeType.
+   */
+  FT_BASE( void )
+  ft_log_handler( const struct dlg_origin*  origin,
+                  const char*               string,
+                  void*                     data );
+
+
+  /**************************************************************************
+   *
+   * `ft_default_log_handler` stores the function pointer that is used
+   * internally by FreeType to print logs to a file.
+   *
+   * It is defined in `ftdebug.c`.
+   */
+  extern dlg_handler  ft_default_log_handler;
+
+
+  /**************************************************************************
+   *
+   * If FT_LOGGING macro is enabled, FreeType needs to initialize and
+   * un-initialize `FILE*`.
+   *
+   * These functions are defined in `ftdebug.c`.
+   *
+   */
+  FT_BASE( void )
+  ft_logging_init( void );
+
+  FT_BASE( void )
+  ft_logging_deinit( void );
+
+#endif /* FT_LOGGING */
+
+
 FT_END_HEADER
 
 #endif /* FTDEBUG_H_ */
diff --git a/src/base/ftdebug.c b/src/base/ftdebug.c
index 62cf680..b554c6a 100644
--- a/src/base/ftdebug.c
+++ b/src/base/ftdebug.c
@@ -45,6 +45,28 @@
 #include <freetype/internal/ftdebug.h>
 
 
+#ifdef FT_LOGGING
+
+  /**************************************************************************
+   *
+   * Variables used to control logging.
+   *
+   * 1. `ft_default_trace_level` stores the value of trace levels, which are
+   *    provided to FreeType using the `FT2_DEBUG` environment variable.
+   *
+   * 2. `ft_fileptr` stores the `FILE*` handle.
+   *
+   * Use `static` to avoid 'unused variable' warnings.
+   *
+   */
+  static const char*  ft_default_trace_level = NULL;
+  static FILE*        ft_fileptr             = NULL;
+
+  dlg_handler  ft_default_log_handler = NULL;
+
+#endif /* FT_LOGGING*/
+
+
 #ifdef FT_DEBUG_LEVEL_ERROR
 
   /* documentation is in ftdebug.h */
@@ -106,7 +128,6 @@
 #endif /* FT_DEBUG_LEVEL_ERROR */
 
 
-
 #ifdef FT_DEBUG_LEVEL_TRACE
 
   /* array of trace levels, initialized to 0; */
@@ -315,4 +336,59 @@
 #endif /* !FT_DEBUG_LEVEL_TRACE */
 
 
+#ifdef FT_LOGGING
+
+  /**************************************************************************
+   *
+   * Initialize and de-initialize 'dlg' library.
+   *
+   */
+
+  FT_BASE_DEF( void )
+  ft_logging_init( void )
+  {
+    ft_default_log_handler = ft_log_handler;
+    ft_default_trace_level = ft_getenv( "FT2_DEBUG" );
+
+    if ( ft_getenv( "FT_LOGGING_FILE" ) )
+      ft_fileptr = ft_fopen( ft_getenv( "FT_LOGGING_FILE" ), "w" );
+    else
+      ft_fileptr = stderr;
+
+    ft_debug_init();
+
+    /* Set the default output handler for 'dlg'. */
+    dlg_set_handler( ft_default_log_handler, NULL );
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_logging_deinit( void )
+  {
+    ft_fclose( ft_fileptr );
+  }
+
+
+  /*************************************************************************
+   *
+   * An output log handler for FreeType.
+   *
+   */
+  FT_BASE_DEF( void )
+  ft_log_handler( const struct dlg_origin*  origin,
+                  const char*               string,
+                  void*                     data )
+  {
+    const char*  features = "%c";
+
+    FT_UNUSED( data );
+
+
+    dlg_generic_outputf_stream( ft_fileptr, features, origin, string,
+                                dlg_default_output_styles, true );
+  }
+
+#endif /* FT_LOGGING */
+
+
 /* END */
diff --git a/src/base/ftinit.c b/src/base/ftinit.c
index 0acc75e..7f9b65a 100644
--- a/src/base/ftinit.c
+++ b/src/base/ftinit.c
@@ -202,6 +202,10 @@
     FT_Memory  memory;
 
 
+#ifdef FT_LOGGING
+    ft_logging_init();
+#endif
+
     /* check of `alibrary' delayed to `FT_New_Library' */
 
     /* First of all, allocate a new system object -- this function is part */
@@ -248,6 +252,10 @@
     /* discard memory manager */
     FT_Done_Memory( memory );
 
+#ifdef FT_LOGGING
+    ft_logging_deinit();
+#endif
+
     return FT_Err_Ok;
   }
 
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index fad57ec..6c4058f 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -5292,10 +5292,12 @@
     if ( !memory || !alibrary )
       return FT_THROW( Invalid_Argument );
 
+#ifndef FT_LOGGING
 #ifdef FT_DEBUG_LEVEL_ERROR
     /* init debugging support */
     ft_debug_init();
-#endif
+#endif /* FT_DEBUG_LEVEL_ERROR */
+#endif /* !FT_LOGGING */
 
     /* first of all, allocate the library object */
     if ( FT_NEW( library ) )



reply via email to

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