From: Rafał Harabień Subject: [PATCH v2] include: Add optional ANSI color codes for winetests and debug macros. Message-Id: <1511098797-7685-1-git-send-email-rafalh1992@o2.pl> Date: Sun, 19 Nov 2017 14:39:57 +0100 By default colors are disabled. Use WINETEST_COLOR=1 to enable colors in tests. Use WINEDEBUG_COLOR=1 to enable colors in debug messages. Second version of the patch fixes compiler warnings. Signed-off-by: Rafał Harabień --- include/wine/test.h | 14 ++++++++++++++ libs/wine/debug.c | 14 +++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/wine/test.h b/include/wine/test.h index 4ec66d5..3388414 100644 --- a/include/wine/test.h +++ b/include/wine/test.h @@ -206,6 +206,9 @@ const char *winetest_platform = "windows"; /* report successful tests (BOOL) */ static int report_success = 0; +/* use ANSI escape codes for output coloring */ +static int winetest_color = 0; + /* passing arguments around */ static int winetest_argc; static char** winetest_argv; @@ -303,14 +306,20 @@ int broken( int condition ) int winetest_vok( int condition, const char *msg, __winetest_va_list args ) { struct tls_data *data = get_tls_data(); + const char *color_red = "\e[91m"; + const char *color_reset = "\e[39m"; if (data->todo_level) { if (condition) { + if (winetest_color) + printf("%s", color_red); printf( "%s:%d: Test succeeded inside todo block: ", data->current_file, data->current_line ); vprintf(msg, args); + if (winetest_color) + printf("%s", color_reset); InterlockedIncrement(&todo_failures); return 0; } @@ -330,9 +339,13 @@ int winetest_vok( int condition, const char *msg, __winetest_va_list args ) { if (!condition) { + if (winetest_color) + printf("%s", color_red); printf( "%s:%d: Test failed: ", data->current_file, data->current_line ); vprintf(msg, args); + if (winetest_color) + printf("%s", color_reset); InterlockedIncrement(&failures); return 0; } @@ -669,6 +682,7 @@ int main( int argc, char **argv ) if (GetEnvironmentVariableA( "WINETEST_DEBUG", p, sizeof(p) )) winetest_debug = atoi(p); if (GetEnvironmentVariableA( "WINETEST_INTERACTIVE", p, sizeof(p) )) winetest_interactive = atoi(p); if (GetEnvironmentVariableA( "WINETEST_REPORT_SUCCESS", p, sizeof(p) )) report_success = atoi(p); + if (GetEnvironmentVariableA( "WINETEST_COLOR", p, sizeof(p) )) winetest_color = atoi(p); if (!strcmp( winetest_platform, "windows" )) SetUnhandledExceptionFilter( exc_filter ); if (!winetest_interactive) SetErrorMode( SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX ); diff --git a/libs/wine/debug.c b/libs/wine/debug.c index 8b04ef9..af84e67 100644 --- a/libs/wine/debug.c +++ b/libs/wine/debug.c @@ -39,12 +39,14 @@ WINE_DECLARE_DEBUG_CHANNEL(pid); #endif static const char * const debug_classes[] = { "fixme", "err", "warn", "trace" }; +static const char * const debug_classes_color[] = { "\e[93m", "\e[91m", "\e[93m", "" }; #define MAX_DEBUG_OPTIONS 256 static unsigned char default_flags = (1 << __WINE_DBCL_ERR) | (1 << __WINE_DBCL_FIXME); static int nb_debug_options = -1; static struct __wine_debug_channel debug_options[MAX_DEBUG_OPTIONS]; +static int debug_color = 0; static struct __wine_debug_functions funcs; @@ -193,7 +195,7 @@ static void debug_usage(void) /* initialize all options at startup */ static void debug_init(void) { - char *wine_debug; + char *wine_debug, *color; struct stat st1, st2; if (nb_debug_options != -1) return; /* already initialized */ @@ -212,6 +214,8 @@ static void debug_init(void) if (!strcmp( wine_debug, "help" )) debug_usage(); parse_options( wine_debug ); } + color = getenv("WINEDEBUG_COLOR"); + if (color != NULL) debug_color = atoi(color); } /* varargs wrapper for funcs.dbg_vprintf */ @@ -406,6 +410,7 @@ static int default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_ch const char *func, const char *format, va_list args ) { int ret = 0; + const char *color_reset = "\e[39m"; #if defined(__MINGW32__) || defined(_MSC_VER) if (TRACE_ON(pid)) @@ -414,9 +419,16 @@ static int default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_ch ret += wine_dbg_printf( "%04x:", GetCurrentThreadId() ); #endif if (cls < sizeof(debug_classes)/sizeof(debug_classes[0])) + { + if (debug_color) + ret += wine_dbg_printf( "%s", debug_classes_color[cls] ); ret += wine_dbg_printf( "%s:%s:%s ", debug_classes[cls], channel->name, func ); + } if (format) ret += funcs.dbg_vprintf( format, args ); + if (debug_color) + ret += wine_dbg_printf( "%s", color_reset ); + return ret; } -- 2.7.4