[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH 3/5] lib/ukdebug: Option for colored output format
Colors! This commit makes use of ANSI control sequences to color console output when activated by the user configuration. Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> --- lib/ukdebug/Config.uk | 8 ++++ lib/ukdebug/print.c | 85 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/lib/ukdebug/Config.uk b/lib/ukdebug/Config.uk index 799593b8..e4177bec 100644 --- a/lib/ukdebug/Config.uk +++ b/lib/ukdebug/Config.uk @@ -73,6 +73,14 @@ config LIBUKDEBUG_PRINT_SRCNAME bool "Print source code location of messages" default y +config LIBUKDEBUG_ANSI_COLOR + bool "Colored output" + default n + help + Use ANSI control sequences to colorize console output. + Before activating this option, please make sure that + your console output/display supports ANSI. + config LIBUKDEBUG_ENABLE_ASSERT bool "Enable assertions" default y diff --git a/lib/ukdebug/print.c b/lib/ukdebug/print.c index 1a12898e..6dbcda06 100644 --- a/lib/ukdebug/print.c +++ b/lib/ukdebug/print.c @@ -45,6 +45,44 @@ #include <uk/errptr.h> #include <uk/arch/lcpu.h> +#if CONFIG_LIBUKDEBUG_ANSI_COLOR +#define LVLC_RESET UK_ANSI_MOD_RESET +#define LVLC_TS UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_GREEN) +#define LVLC_SP UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_BLUE) +#define LVLC_LIBNAME UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_YELLOW) +#define LVLC_SRCNAME UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_CYAN) +#define LVLC_DEBUG UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_WHITE) +#define LVLC_KERN UK_ANSI_MOD_BOLD \ + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_BLUE) +#define LVLC_INFO UK_ANSI_MOD_BOLD \ + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_GREEN) +#define LVLC_WARN UK_ANSI_MOD_BOLD \ + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_YELLOW) +#define LVLC_ERROR UK_ANSI_MOD_BOLD \ + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_RED) +#define LVLC_ERROR_MSG UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_RED) +#define LVLC_CRIT UK_ANSI_MOD_BOLD \ + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_WHITE) \ + UK_ANSI_MOD_COLORBG(UK_ANSI_COLOR_RED) + +#define LVLC_CRIT_MSG UK_ANSI_MOD_BOLD \ + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_RED) +#else +#define LVLC_RESET "" +#define LVLC_TS "" +#define LVLC_SP "" +#define LVLC_LIBNAME "" +#define LVLC_SRCNAME "" +#define LVLC_DEBUG "" +#define LVLC_KERN "" +#define LVLC_INFO "" +#define LVLC_WARN "" +#define LVLC_ERROR "" +#define LVLC_ERROR_MSG "" +#define LVLC_CRIT "" +#define LVLC_CRIT_MSG "" +#endif /* !CONFIG_LIBUKDEBUG_ANSI_COLOR */ + #define BUFLEN 192 /* special level for printk redirection, used internally only */ #define KLVL_DEBUG (-1) @@ -81,7 +119,8 @@ static void _print_timestamp(struct _vprint_console *cons) __nsec rem_usec = ukarch_time_subsec(nansec); rem_usec = ukarch_time_nsec_to_usec(rem_usec); - len = __uk_snprintf(buf, BUFLEN, "[%5" __PRInsec ".%06" __PRInsec "] ", + len = __uk_snprintf(buf, BUFLEN, LVLC_RESET LVLC_TS + "[%5" __PRInsec ".%06" __PRInsec "] ", sec, rem_usec); cons->cout((char *)buf, len); } @@ -96,7 +135,8 @@ static void _print_stack(struct _vprint_console *cons) stackb = (ukarch_read_sp() & STACK_MASK_TOP) + __STACK_SIZE; - len = __uk_snprintf(buf, BUFLEN, "<%p> ", (void *) stackb); + len = __uk_snprintf(buf, BUFLEN, LVLC_RESET LVLC_SP + "<%p> ", (void *) stackb); cons->cout((char *)buf, len); } #endif @@ -113,21 +153,25 @@ static void _vprint(struct _vprint_console *cons, const char *lptr = NULL; const char *nlptr = NULL; + /* + * Note: We reset the console colors earlier in order to exclude + * background colors for trailing white spaces. + */ switch (lvl) { case KLVL_DEBUG: - msghdr = "dbg: "; + msghdr = LVLC_RESET LVLC_DEBUG "dbg:" LVLC_RESET " "; break; case KLVL_CRIT: - msghdr = "CRIT: "; + msghdr = LVLC_RESET LVLC_CRIT "CRIT:" LVLC_RESET " "; break; case KLVL_ERR: - msghdr = "ERR: "; + msghdr = LVLC_RESET LVLC_ERROR "ERR:" LVLC_RESET " "; break; case KLVL_WARN: - msghdr = "Warn: "; + msghdr = LVLC_RESET LVLC_WARN "Warn:" LVLC_RESET " "; break; case KLVL_INFO: - msghdr = "Info: "; + msghdr = LVLC_RESET LVLC_INFO "Info:" LVLC_RESET " "; break; default: /* unknown type: ignore */ @@ -153,12 +197,13 @@ static void _vprint(struct _vprint_console *cons, #if CONFIG_LIBUKDEBUG_PRINT_TIME _print_timestamp(cons); #endif - cons->cout(DECONST(char *, msghdr), 6); + cons->cout(DECONST(char *, msghdr), strlen(msghdr)); #if CONFIG_LIBUKDEBUG_PRINT_STACK _print_stack(cons); #endif if (libname) { - cons->cout("[", 1); + cons->cout(LVLC_RESET LVLC_LIBNAME "[", + strlen(LVLC_RESET LVLC_LIBNAME) + 1); cons->cout(DECONST(char *, libname), strlen(libname)); cons->cout("] ", 2); @@ -167,13 +212,15 @@ static void _vprint(struct _vprint_console *cons, if (srcname) { char lnobuf[6]; + cons->cout(LVLC_RESET LVLC_SRCNAME "<", + strlen(LVLC_RESET LVLC_SRCNAME) + 1); cons->cout(DECONST(char *, srcname), strlen(srcname)); cons->cout(" @ ", 3); cons->cout(lnobuf, __uk_snprintf(lnobuf, sizeof(lnobuf), - "%-5u", srcline)); - cons->cout(": ", 2); + "%4u", srcline)); + cons->cout("> ", 2); } #endif cons->newline = 0; @@ -186,7 +233,23 @@ static void _vprint(struct _vprint_console *cons, } else { llen = len; } + + /* Message body */ + switch (lvl) { + case KLVL_CRIT: + cons->cout(LVLC_RESET LVLC_CRIT_MSG, + strlen(LVLC_RESET LVLC_CRIT_MSG)); + break; + case KLVL_ERR: + cons->cout(LVLC_RESET LVLC_ERROR_MSG, + strlen(LVLC_RESET LVLC_ERROR_MSG)); + break; + default: + cons->cout(LVLC_RESET, strlen(LVLC_RESET)); + } cons->cout((char *)lptr, llen); + cons->cout(LVLC_RESET, strlen(LVLC_RESET)); + len -= llen; lptr = nlptr + 1; } -- 2.20.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |