We have to set the color before every line and reset it before every newline. Add a function color_fwrite() which does that for us. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- color.c | 24 ++++++++++++++++++++++++ color.h | 1 + 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/color.c b/color.c index fc0b72a..bff24ac 100644 --- a/color.c +++ b/color.c @@ -191,3 +191,27 @@ int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...) va_end(args); return r; } + +/* + * This function splits the buffer by newlines and colors the lines individually. + */ +void color_fwrite(FILE *f, const char *color, size_t count, const char *buf) +{ + if (!*color) { + fwrite(buf, count, 1, f); + return; + } + while (count) { + char *p = memchr(buf, '\n', count); + fputs(color, f); + fwrite(buf, p ? p - buf : count, 1, f); + fputs(COLOR_RESET, f); + if (!p) + return; + fputc('\n', f); + count -= p + 1 - buf; + buf = p + 1; + } +} + + diff --git a/color.h b/color.h index 6cf5c88..9fb58f5 100644 --- a/color.h +++ b/color.h @@ -19,5 +19,6 @@ int git_config_colorbool(const char *var, const char *value, int stdout_is_tty); void color_parse(const char *var, const char *value, char *dst); int color_fprintf(FILE *fp, const char *color, const char *fmt, ...); int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...); +void color_fwrite(FILE *f, const char *color, size_t count, const char *buf); #endif /* COLOR_H */ -- 1.6.1.186.g48f3bc4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html