diff options
Diffstat (limited to 'liblog')
| -rw-r--r-- | liblog/logprint.c | 82 |
1 files changed, 68 insertions, 14 deletions
diff --git a/liblog/logprint.c b/liblog/logprint.c index 6fac84b4..a3d81a9a 100644 --- a/liblog/logprint.c +++ b/liblog/logprint.c @@ -17,6 +17,13 @@ #define _GNU_SOURCE /* for asprintf */ +#define COLOR_BLUE 75 +#define COLOR_DEFAULT 231 +#define COLOR_GREEN 40 +#define COLOR_ORANGE 166 +#define COLOR_RED 196 +#define COLOR_YELLOW 226 + #include <ctype.h> #include <stdio.h> #include <errno.h> @@ -39,6 +46,7 @@ struct AndroidLogFormat_t { android_LogPriority global_pri; FilterInfo *filters; AndroidLogPrintFormat format; + AndroidLogColoredOutput colored_output; }; static FilterInfo * filterinfo_new(const char * tag, android_LogPriority pri) @@ -118,6 +126,23 @@ static char filterPriToChar (android_LogPriority pri) } } +static int colorFromPri (android_LogPriority pri) +{ + switch (pri) { + case ANDROID_LOG_VERBOSE: return COLOR_DEFAULT; + case ANDROID_LOG_DEBUG: return COLOR_BLUE; + case ANDROID_LOG_INFO: return COLOR_GREEN; + case ANDROID_LOG_WARN: return COLOR_ORANGE; + case ANDROID_LOG_ERROR: return COLOR_RED; + case ANDROID_LOG_FATAL: return COLOR_RED; + case ANDROID_LOG_SILENT: return COLOR_DEFAULT; + + case ANDROID_LOG_DEFAULT: + case ANDROID_LOG_UNKNOWN: + default: return COLOR_DEFAULT; + } +} + static android_LogPriority filterPriForTag( AndroidLogFormat *p_format, const char *tag) { @@ -174,6 +199,7 @@ AndroidLogFormat *android_log_format_new() p_ret->global_pri = ANDROID_LOG_VERBOSE; p_ret->format = FORMAT_BRIEF; + p_ret->colored_output = OUTPUT_COLOR_OFF; return p_ret; } @@ -202,6 +228,11 @@ void android_log_setPrintFormat(AndroidLogFormat *p_format, p_format->format=format; } +void android_log_setColoredOutput(AndroidLogFormat *p_format) +{ + p_format->colored_output = OUTPUT_COLOR_ON; +} + /** * Returns FORMAT_OFF on invalid string */ @@ -739,20 +770,32 @@ char *android_log_formatLogLine ( */ size_t prefixLen, suffixLen; + size_t prefixColorLen = 0; + char * prefixBufTmp = prefixBuf; + size_t prefixBufTmpRemainLen = sizeof(prefixBuf); + + if (p_format->colored_output == OUTPUT_COLOR_ON) { + prefixColorLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "%c[%d;%d;%dm", 0x1B, 38, 5, colorFromPri(entry->priority)); + if(prefixColorLen >= prefixBufTmpRemainLen) + prefixColorLen = prefixBufTmpRemainLen - 1; + prefixBufTmp += prefixColorLen; + prefixBufTmpRemainLen -= prefixColorLen; + } + switch (p_format->format) { case FORMAT_TAG: - prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), + prefixLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "%c/%-8s: ", priChar, entry->tag); strcpy(suffixBuf, "\n"); suffixLen = 1; break; case FORMAT_PROCESS: - prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), + prefixLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "%c(%5d) ", priChar, entry->pid); suffixLen = snprintf(suffixBuf, sizeof(suffixBuf), " (%s)\n", entry->tag); break; case FORMAT_THREAD: - prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), + prefixLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "%c(%5d:%5d) ", priChar, entry->pid, entry->tid); strcpy(suffixBuf, "\n"); suffixLen = 1; @@ -764,21 +807,21 @@ char *android_log_formatLogLine ( suffixLen = 1; break; case FORMAT_TIME: - prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), + prefixLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "%s.%03ld %c/%-8s(%5d): ", timeBuf, entry->tv_nsec / 1000000, priChar, entry->tag, entry->pid); strcpy(suffixBuf, "\n"); suffixLen = 1; break; case FORMAT_THREADTIME: - prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), + prefixLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "%s.%03ld %5d %5d %c %-8s: ", timeBuf, entry->tv_nsec / 1000000, entry->pid, entry->tid, priChar, entry->tag); strcpy(suffixBuf, "\n"); suffixLen = 1; break; case FORMAT_LONG: - prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), + prefixLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "[ %s.%03ld %5d:%5d %c/%-8s ]\n", timeBuf, entry->tv_nsec / 1000000, entry->pid, entry->tid, priChar, entry->tag); @@ -788,7 +831,7 @@ char *android_log_formatLogLine ( break; case FORMAT_BRIEF: default: - prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), + prefixLen = snprintf(prefixBufTmp, prefixBufTmpRemainLen, "%c/%-8s(%5d): ", priChar, entry->tag, entry->pid); strcpy(suffixBuf, "\n"); suffixLen = 1; @@ -800,11 +843,22 @@ char *android_log_formatLogLine ( * possibly causing heap corruption. To avoid this we double check and * set the length at the maximum (size minus null byte) */ - if(prefixLen >= sizeof(prefixBuf)) - prefixLen = sizeof(prefixBuf) - 1; + if(prefixLen >= prefixBufTmpRemainLen) + prefixLen = prefixBufTmpRemainLen - 1; if(suffixLen >= sizeof(suffixBuf)) suffixLen = sizeof(suffixBuf) - 1; + size_t suffixColorLen = 0; + char * suffixBufTmp = suffixBuf + suffixLen; + size_t suffixBufTmpRemainLen = sizeof(suffixBuf) - suffixLen; + + if (p_format->colored_output == OUTPUT_COLOR_ON) { + suffixColorLen = snprintf(suffixBufTmp, suffixBufTmpRemainLen, "%c[%dm", 0x1B, 0); + if(suffixColorLen >= suffixBufTmpRemainLen) + suffixColorLen = suffixBufTmpRemainLen - 1; + } + + /* the following code is tragically unreadable */ size_t numLines; @@ -831,7 +885,7 @@ char *android_log_formatLogLine ( // this is an upper bound--newlines in message may be counted // extraneously - bufferSize = (numLines * (prefixLen + suffixLen)) + entry->messageLen + 1; + bufferSize = (numLines * (prefixColorLen + prefixLen + suffixLen + suffixColorLen)) + entry->messageLen + 1; if (defaultBufferSize >= bufferSize) { ret = defaultBuffer; @@ -850,11 +904,11 @@ char *android_log_formatLogLine ( if (prefixSuffixIsHeaderFooter) { strcat(p, prefixBuf); - p += prefixLen; + p += prefixColorLen + prefixLen; strncat(p, entry->message, entry->messageLen); p += entry->messageLen; strcat(p, suffixBuf); - p += suffixLen; + p += suffixLen + suffixColorLen; } else { while(pm < (entry->message + entry->messageLen)) { const char *lineStart; @@ -867,11 +921,11 @@ char *android_log_formatLogLine ( lineLen = pm - lineStart; strcat(p, prefixBuf); - p += prefixLen; + p += prefixColorLen + prefixLen; strncat(p, lineStart, lineLen); p += lineLen; strcat(p, suffixBuf); - p += suffixLen; + p += suffixLen + suffixColorLen; if (*pm == '\n') pm++; } |
