info: refactor debug colors for win32 and other

Refactor the debug line code to use as much code as possible for the win32 and
other color codings.
Update docs with new symbol.
This commit is contained in:
Wim Taymans 2009-03-18 18:45:41 +01:00
parent 0c059ad2de
commit ca33a78881
2 changed files with 109 additions and 137 deletions

View file

@ -923,6 +923,7 @@ gst_debug_category_get_color
gst_debug_category_get_description
gst_debug_get_all_categories
gst_debug_construct_term_color
gst_debug_construct_win_color
GST_CAT_LEVEL_LOG
GST_CAT_ERROR_OBJECT
GST_CAT_WARNING_OBJECT

View file

@ -580,8 +580,6 @@ gst_debug_print_segment (gpointer ptr)
#endif /* HAVE_PRINTF_EXTENSION */
#ifndef G_OS_WIN32
/**
* gst_debug_construct_term_color:
* @colorinfo: the color info
@ -617,105 +615,6 @@ gst_debug_construct_term_color (guint colorinfo)
return g_string_free (color, FALSE);
}
/**
* gst_debug_log_default:
* @category: category to log
* @level: level of the message
* @file: the file that emitted the message, usually the __FILE__ identifier
* @function: the function that emitted the message
* @line: the line from that the message was emitted, usually __LINE__
* @message: the actual message
* @object: the object this message relates to or NULL if none
* @unused: an unused variable, reserved for some user_data.
*
* The default logging handler used by GStreamer. Logging functions get called
* whenever a macro like GST_DEBUG or similar is used. This function outputs the
* message and additional info using the glib error handler.
* You can add other handlers by using gst_debug_add_log_function().
* And you can remove this handler by calling
* gst_debug_remove_log_function(gst_debug_log_default);
*/
void
gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
const gchar * file, const gchar * function, gint line,
GObject * object, GstDebugMessage * message, gpointer unused)
{
gchar *color = NULL;
gchar *clear;
gchar *obj = NULL;
gchar pidcolor[10];
const gchar *levelcolor;
gint pid;
GstClockTime elapsed;
gboolean free_color = TRUE;
gboolean free_obj = TRUE;
static const gchar *levelcolormap[] = {
"\033[37m", /* GST_LEVEL_NONE */
"\033[31;01m", /* GST_LEVEL_ERROR */
"\033[33;01m", /* GST_LEVEL_WARNING */
"\033[32;01m", /* GST_LEVEL_INFO */
"\033[36m", /* GST_LEVEL_DEBUG */
"\033[37m" /* GST_LEVEL_LOG */
};
if (level > gst_debug_category_get_threshold (category))
return;
pid = getpid ();
/* color info */
if (gst_debug_is_colored ()) {
color = gst_debug_construct_term_color (gst_debug_category_get_color
(category));
clear = "\033[00m";
g_sprintf (pidcolor, "\033[3%1dm", pid % 6 + 31);
levelcolor = levelcolormap[level];
} else {
color = "\0";
free_color = FALSE;
clear = "";
pidcolor[0] = '\0';
levelcolor = "\0";
}
if (object) {
obj = gst_debug_print_object (object);
} else {
obj = "\0";
free_obj = FALSE;
}
elapsed = GST_CLOCK_DIFF (_priv_gst_info_start_time,
gst_util_get_timestamp ());
#if defined (GLIB_SIZEOF_VOID_P) && GLIB_SIZEOF_VOID_P == 8
/* width of %p varies depending on actual value of pointer, which can make
* output unevenly aligned if multiple threads are involved, hence the %14p
* (should really be %18p, but %14p seems a good compromise between too many
* white spaces and likely unalignment on my system) */
g_printerr ("%" GST_TIME_FORMAT
" %s%5d%s %14p %s%s%s %s%20s %s:%d:%s:%s%s %s\n", GST_TIME_ARGS (elapsed),
pidcolor, pid, clear, g_thread_self (), levelcolor,
gst_debug_level_get_name (level), clear, color,
gst_debug_category_get_name (category), file, line, function, obj, clear,
gst_debug_message_get (message));
#else
g_printerr ("%" GST_TIME_FORMAT
" %s%5d%s %10p %s%s%s %s%20s %s:%d:%s:%s%s %s\n", GST_TIME_ARGS (elapsed),
pidcolor, pid, clear, g_thread_self (), levelcolor,
gst_debug_level_get_name (level), clear, color,
gst_debug_category_get_name (category), file, line, function, obj, clear,
gst_debug_message_get (message));
#endif
if (free_color)
g_free (color);
if (free_obj)
g_free (obj);
}
#else /* !G_OS_WIN32 */
/**
* gst_debug_construct_win_color:
* @colorinfo: the color info
@ -724,12 +623,17 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
* windows' terminals (cmd.exe). As there is no mean to underline, we simply
* ignore this attribute.
*
* This function returns 0 on non-windows machines.
*
* Returns: an integer containing the color definition
*
* Since: 0.10.23
*/
gint
gst_debug_construct_win_color (guint colorinfo)
{
gint color = 0;
#ifdef G_OS_WIN32
static const guchar ansi_to_win_fg[8] = {
0, /* black */
FOREGROUND_RED, /* red */
@ -765,44 +669,91 @@ gst_debug_construct_win_color (guint colorinfo)
if (colorinfo & GST_DEBUG_BG_MASK) {
color |= ansi_to_win_bg[(colorinfo & GST_DEBUG_BG_MASK) >> 4];
}
#endif
return color;
}
/* width of %p varies depending on actual value of pointer, which can make
* output unevenly aligned if multiple threads are involved, hence the %14p
* (should really be %18p, but %14p seems a good compromise between too many
* white spaces and likely unalignment on my system) */
#if defined (GLIB_SIZEOF_VOID_P) && GLIB_SIZEOF_VOID_P == 8
#define PTR_FMT "%14p"
#else
#define PTR_FMT "%10p"
#endif
#define PID_FMT "%5d"
#define CAT_FMT "%20s %s:%d:%s:%s"
#ifdef G_OS_WIN32
static const guchar levelcolormap[] = {
/* GST_LEVEL_NONE */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
/* GST_LEVEL_ERROR */
FOREGROUND_RED | FOREGROUND_INTENSITY,
/* GST_LEVEL_WARNING */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
/* GST_LEVEL_INFO */
FOREGROUND_GREEN | FOREGROUND_INTENSITY,
/* GST_LEVEL_DEBUG */
FOREGROUND_GREEN | FOREGROUND_BLUE,
/* GST_LEVEL_LOG */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
};
static const guchar available_colors[6] = {
FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_RED | FOREGROUND_GREEN,
FOREGROUND_BLUE, FOREGROUND_RED | FOREGROUND_BLUE,
FOREGROUND_GREEN | FOREGROUND_BLUE,
};
#else
static const gchar *levelcolormap[] = {
"\033[37m", /* GST_LEVEL_NONE */
"\033[31;01m", /* GST_LEVEL_ERROR */
"\033[33;01m", /* GST_LEVEL_WARNING */
"\033[32;01m", /* GST_LEVEL_INFO */
"\033[36m", /* GST_LEVEL_DEBUG */
"\033[37m" /* GST_LEVEL_LOG */
};
#endif
/**
* gst_debug_log_default:
* @category: category to log
* @level: level of the message
* @file: the file that emitted the message, usually the __FILE__ identifier
* @function: the function that emitted the message
* @line: the line from that the message was emitted, usually __LINE__
* @message: the actual message
* @object: the object this message relates to or NULL if none
* @unused: an unused variable, reserved for some user_data.
*
* The default logging handler used by GStreamer. Logging functions get called
* whenever a macro like GST_DEBUG or similar is used. This function outputs the
* message and additional info using the glib error handler.
* You can add other handlers by using gst_debug_add_log_function().
* And you can remove this handler by calling
* gst_debug_remove_log_function(gst_debug_log_default);
*/
void
gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
const gchar * file, const gchar * function, gint line,
GObject * object, GstDebugMessage * message, gpointer unused)
{
gint pidcolor, levelcolor, color, pid;
const gint clear = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
gchar *obj = NULL;
gint pid;
GstClockTime elapsed;
gchar *obj = NULL;
gboolean free_obj = TRUE;
static const guchar levelcolormap[] = {
/* GST_LEVEL_NONE */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
/* GST_LEVEL_ERROR */
FOREGROUND_RED | FOREGROUND_INTENSITY,
/* GST_LEVEL_WARNING */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
/* GST_LEVEL_INFO */
FOREGROUND_GREEN | FOREGROUND_INTENSITY,
/* GST_LEVEL_DEBUG */
FOREGROUND_GREEN | FOREGROUND_BLUE,
/* GST_LEVEL_LOG */
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
};
static const guchar available_colors[6] = {
FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_RED | FOREGROUND_GREEN,
FOREGROUND_BLUE, FOREGROUND_RED | FOREGROUND_BLUE,
FOREGROUND_GREEN | FOREGROUND_BLUE,
};
gboolean is_colored;
if (level > gst_debug_category_get_threshold (category))
return;
pid = getpid ();
is_colored = gst_debug_is_colored ();
elapsed = GST_CLOCK_DIFF (_priv_gst_info_start_time,
gst_util_get_timestamp ());
if (object) {
obj = gst_debug_print_object (object);
@ -811,20 +762,40 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
free_obj = FALSE;
}
elapsed = GST_CLOCK_DIFF (_priv_gst_info_start_time,
gst_util_get_timestamp ());
if (is_colored) {
#ifndef G_OS_WIN32
gchar *color = NULL;
gchar *clear;
gchar pidcolor[10];
const gchar *levelcolor;
color = gst_debug_construct_term_color (gst_debug_category_get_color
(category));
clear = "\033[00m";
g_sprintf (pidcolor, "\033[3%1dm", pid % 6 + 31);
levelcolor = levelcolormap[level];
#define PRINT_FMT " %s"PID_FMT"%s "PTR_FMT" %s%s%s %s"CAT_FMT"%s %s\n"
g_printerr ("%" GST_TIME_FORMAT PRINT_FMT, GST_TIME_ARGS (elapsed),
pidcolor, pid, clear, g_thread_self (), levelcolor,
gst_debug_level_get_name (level), clear, color,
gst_debug_category_get_name (category), file, line, function, obj,
clear, gst_debug_message_get (message));
#undef PRINT_FMT
g_free (color);
#else
gint pidcolor, levelcolor, color, pid;
const gint clear = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
/* color info */
if (gst_debug_is_colored ()) {
/* timestamp */
g_printerr ("%" GST_TIME_FORMAT " ", GST_TIME_ARGS (elapsed));
/* pid */
pidcolor = available_colors[pid % 6];
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), pidcolor);
g_printerr ("%5d", pid);
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), clear);
g_printerr (PID_FMT, pid);
/* thread */
g_printerr (" %p ", g_thread_self ());
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), clear);
g_printerr (" " PTR_FMT " ", g_thread_self ());
/* level */
levelcolor = levelcolormap[level];
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), levelcolor);
@ -833,25 +804,25 @@ gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
color = gst_debug_construct_win_color (gst_debug_category_get_color
(category));
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), color);
g_printerr ("%20s %s:%d:%s:%s", gst_debug_category_get_name (category),
g_printerr (CAT_FMT, gst_debug_category_get_name (category),
file, line, function, obj);
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), clear);
/* message */
SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), clear);
g_printerr (" %s\n", gst_debug_message_get (message));
#endif
} else {
g_printerr ("%" GST_TIME_FORMAT
" %5d %p %s %20s %s:%d:%s:%s %s\n", GST_TIME_ARGS (elapsed), pid,
#define PRINT_FMT " "PID_FMT" "PTR_FMT" %s "CAT_FMT" %s\n"
g_printerr ("%" GST_TIME_FORMAT PRINT_FMT, GST_TIME_ARGS (elapsed), pid,
g_thread_self (), gst_debug_level_get_name (level),
gst_debug_category_get_name (category), file, line, function, obj,
gst_debug_message_get (message));
#undef PRINT_FMT
}
if (free_obj)
g_free (obj);
}
#endif /* !G_OS_WIN32 */
/**
* gst_debug_level_get_name:
* @level: the level to get the name for