From ce43d808dc0ab015cf91b7aca9bd2b48cc717dd2 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Tue, 1 Dec 2020 12:20:43 +0100 Subject: [PATCH] [base] Implement vertical alignment of log printing. Based on a patch by Priyesh. * include/freetype/internal/fttrace.h (FT_MAX_TRACE_LEVEL_LENGTH): New macro. * src/base/ftdebug.c, builds/windows/ftdebug.c (ft_log_handler): Print logs after a fixed width to handle different lengths of `FT_COMPONENT` entries. Use `ft_strrchr` to check for final newline character. --- ChangeLog | 14 ++++++ builds/windows/ftdebug.c | 73 ++++++++++++++++++++++++----- include/freetype/internal/fttrace.h | 4 ++ src/base/ftdebug.c | 73 ++++++++++++++++++++++++----- 4 files changed, 140 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index fb6da40aa..b657c66f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2020-12-01 Werner Lemberg + + [base] Implement vertical alignment of log printing. + + Based on a patch by Priyesh. + + * include/freetype/internal/fttrace.h (FT_MAX_TRACE_LEVEL_LENGTH): + New macro. + + * src/base/ftdebug.c, builds/windows/ftdebug.c (ft_log_handler): + Print logs after a fixed width to handle different lengths of + `FT_COMPONENT` entries. + Use `ft_strrchr` to check for final newline character. + 2020-11-30 Priyesh Kumar Update logging related documentation. diff --git a/builds/windows/ftdebug.c b/builds/windows/ftdebug.c index abbe32248..c8e811e73 100644 --- a/builds/windows/ftdebug.c +++ b/builds/windows/ftdebug.c @@ -466,24 +466,73 @@ const char* string, void* data ) { - const char* features; + char features_buf[128]; + char* bufp = features_buf; FT_UNUSED( data ); - if ( ft_timestamp_flag && ft_component_flag && ft_have_newline_char ) - features = "[%h:%m %t] %c"; - else if ( ft_component_flag && ft_have_newline_char ) - features = "[%t] %c"; - else if ( ft_timestamp_flag && ft_have_newline_char ) - features = "[%h:%m] %c"; - else - features = "%c"; + if ( ft_have_newline_char ) + { + const char* features = NULL; + size_t features_length = 0; - dlg_generic_outputf_stream( ft_fileptr, features, origin, string, - dlg_default_output_styles, true ); - if ( strchr( string, '\n' ) ) +#define FEATURES_TIMESTAMP "[%h:%m] " +#define FEATURES_COMPONENT "[%t] " +#define FEATURES_TIMESTAMP_COMPONENT "[%h:%m %t] " + + if ( ft_timestamp_flag && ft_component_flag ) + { + features = FEATURES_TIMESTAMP_COMPONENT; + features_length = sizeof ( FEATURES_TIMESTAMP_COMPONENT ); + } + else if ( ft_timestamp_flag ) + { + features = FEATURES_TIMESTAMP; + features_length = sizeof ( FEATURES_TIMESTAMP ); + } + else if ( ft_component_flag ) + { + features = FEATURES_COMPONENT; + features_length = sizeof ( FEATURES_COMPONENT ); + } + + if ( ft_component_flag || ft_timestamp_flag ) + { + ft_strncpy( features_buf, features, features_length ); + bufp += features_length - 1; + } + + if ( ft_component_flag ) + { + size_t tag_length = ft_strlen( *origin->tags ); + size_t i; + + + /* To vertically align tracing messages we compensate the */ + /* different FT_COMPONENT string lengths by inserting an */ + /* appropriate amount of space characters. */ + for ( i = 0; + i < FT_MAX_TRACE_LEVEL_LENGTH - tag_length; + i++ ) + *bufp++ = ' '; + } + } + + /* Finally add the format string for the tracing message. */ + *bufp++ = '%'; + *bufp++ = 'c'; + *bufp = '\0'; + + dlg_generic_outputf_stream( ft_fileptr, + (const char*)features_buf, + origin, + string, + dlg_default_output_styles, + true ); + + if ( ft_strrchr( string, '\n' ) ) ft_have_newline_char = TRUE; else ft_have_newline_char = FALSE; diff --git a/include/freetype/internal/fttrace.h b/include/freetype/internal/fttrace.h index 58bd77413..2df204512 100644 --- a/include/freetype/internal/fttrace.h +++ b/include/freetype/internal/fttrace.h @@ -18,6 +18,10 @@ /* definitions of trace levels for FreeType 2 */ + /* the maximum string length (if the argument to `FT_TRACE_DEF` */ + /* gets used as a string) */ +#define FT_MAX_TRACE_LEVEL_LENGTH 9 + /* the first level must always be `trace_any' */ FT_TRACE_DEF( any ) diff --git a/src/base/ftdebug.c b/src/base/ftdebug.c index c84b887a7..e0b050d97 100644 --- a/src/base/ftdebug.c +++ b/src/base/ftdebug.c @@ -453,24 +453,73 @@ const char* string, void* data ) { - const char* features; + char features_buf[128]; + char* bufp = features_buf; FT_UNUSED( data ); - if ( ft_timestamp_flag && ft_component_flag && ft_have_newline_char ) - features = "[%h:%m %t] %c"; - else if ( ft_component_flag && ft_have_newline_char ) - features = "[%t] %c"; - else if ( ft_timestamp_flag && ft_have_newline_char ) - features = "[%h:%m] %c"; - else - features = "%c"; + if ( ft_have_newline_char ) + { + const char* features = NULL; + size_t features_length = 0; - dlg_generic_outputf_stream( ft_fileptr, features, origin, string, - dlg_default_output_styles, true ); - if ( strchr( string, '\n' ) ) +#define FEATURES_TIMESTAMP "[%h:%m] " +#define FEATURES_COMPONENT "[%t] " +#define FEATURES_TIMESTAMP_COMPONENT "[%h:%m %t] " + + if ( ft_timestamp_flag && ft_component_flag ) + { + features = FEATURES_TIMESTAMP_COMPONENT; + features_length = sizeof ( FEATURES_TIMESTAMP_COMPONENT ); + } + else if ( ft_timestamp_flag ) + { + features = FEATURES_TIMESTAMP; + features_length = sizeof ( FEATURES_TIMESTAMP ); + } + else if ( ft_component_flag ) + { + features = FEATURES_COMPONENT; + features_length = sizeof ( FEATURES_COMPONENT ); + } + + if ( ft_component_flag || ft_timestamp_flag ) + { + ft_strncpy( features_buf, features, features_length ); + bufp += features_length - 1; + } + + if ( ft_component_flag ) + { + size_t tag_length = ft_strlen( *origin->tags ); + size_t i; + + + /* To vertically align tracing messages we compensate the */ + /* different FT_COMPONENT string lengths by inserting an */ + /* appropriate amount of space characters. */ + for ( i = 0; + i < FT_MAX_TRACE_LEVEL_LENGTH - tag_length; + i++ ) + *bufp++ = ' '; + } + } + + /* Finally add the format string for the tracing message. */ + *bufp++ = '%'; + *bufp++ = 'c'; + *bufp = '\0'; + + dlg_generic_outputf_stream( ft_fileptr, + (const char*)features_buf, + origin, + string, + dlg_default_output_styles, + true ); + + if ( ft_strrchr( string, '\n' ) ) ft_have_newline_char = TRUE; else ft_have_newline_char = FALSE;