changeset 966:8862d9dece66

Use color output on consoles
author Sebastien Decugis <sdecugis@freediameter.net>
date Tue, 12 Mar 2013 17:38:24 +0100
parents 9b37f34c1b1f
children 6808de455810
files libfdproto/log.c
diffstat 1 files changed, 26 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libfdproto/log.c	Tue Mar 12 17:23:37 2013 +0100
+++ b/libfdproto/log.c	Tue Mar 12 17:38:24 2013 +0100
@@ -44,6 +44,7 @@
 int fd_g_debug_lvl = INFO;
 
 static void fd_internal_logger( int, const char *, va_list );
+static int use_colors = 0; /* 0: not init, 1: yes, 2: no */
 
 /* These may be used to pass specific debug requests via the command-line parameters */
 char * fd_debug_one_function = NULL;
@@ -90,22 +91,39 @@
 {
     char buf[25];
     FILE *fstr = fd_g_debug_fstr ?: stdout;
+    int local_use_color = 0;
 
     /* logging has been decided by macros outside already */
 
     /* add timestamp */
-    fprintf(fd_g_debug_fstr, "%s  ", fd_log_time(NULL, buf, sizeof(buf)));
+    fprintf(fstr, "%s  ", fd_log_time(NULL, buf, sizeof(buf)));
+    
+    /* Use colors on stdout ? */
+    if (!use_colors) {
+	if (isatty(STDOUT_FILENO))
+		use_colors = 1;
+	else
+		use_colors = 2;
+    }
+    
+    /* now, this time log, do we use colors? */
+    if ((fstr == stdout) && (use_colors == 1))
+	    local_use_color = 1;
+    
     switch(loglevel) {
-	    case FD_LOG_DEBUG:  fprintf(fd_g_debug_fstr, " DBG   "); break;
-	    case FD_LOG_NOTICE: fprintf(fd_g_debug_fstr, "NOTI   "); break;
-	    case FD_LOG_ERROR:  fprintf(fd_g_debug_fstr, "ERROR  "); break;
-	    default:            fprintf(fd_g_debug_fstr, " ???   ");
+	    case FD_LOG_DEBUG:  fprintf(fstr, local_use_color ? "\e[0;37m" : " DBG   "); break;
+	    case FD_LOG_NOTICE: fprintf(fstr, local_use_color ? "\e[1;37m" : "NOTI   "); break;
+	    case FD_LOG_ERROR:  fprintf(fstr, local_use_color ? "\e[0;31m" : "ERROR  "); break;
+	    default:            fprintf(fstr, local_use_color ? "\e[0;31m" : " ???   ");
     }
-    vfprintf(fd_g_debug_fstr, format, ap);
+    vfprintf(fstr, format, ap);
     if (format && (format[strlen(format)-1] != '\n')) {
-        fprintf(fd_g_debug_fstr, "\n");
+        fprintf(fstr, "\n");
     }
-    fflush(fd_g_debug_fstr);
+    if (local_use_color)
+	     fprintf(fstr, "\e[00m");
+    
+    fflush(fstr);
 }
 
 /* Log a debug message */
"Welcome to our mercurial repository"