diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2009-01-17 17:29:42 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-01-17 10:42:03 -0800 |
commit | 07b57e90f7c852c4fe212ab1d91058f27469a74b (patch) | |
tree | 4f9635f2ab1d0c8d70f08e861032069e078578f2 /color.c | |
parent | 3ea95d2b0e6fa63e66de24a5084e217102ab9e8a (diff) | |
download | git-07b57e90f7c852c4fe212ab1d91058f27469a74b.tar.gz |
Add color_fwrite_lines(), a function coloring each line individually
We have to set the color before every line and reset it before every
newline. Add a function color_fwrite_lines() which does that for us.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'color.c')
-rw-r--r-- | color.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -191,3 +191,31 @@ 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. + * + * Returns 0 on success. + */ +int color_fwrite_lines(FILE *fp, const char *color, + size_t count, const char *buf) +{ + if (!*color) + return fwrite(buf, count, 1, fp) != 1; + while (count) { + char *p = memchr(buf, '\n', count); + if (p != buf && (fputs(color, fp) < 0 || + fwrite(buf, p ? p - buf : count, 1, fp) != 1 || + fputs(COLOR_RESET, fp) < 0)) + return -1; + if (!p) + return 0; + if (fputc('\n', fp) < 0) + return -1; + count -= p + 1 - buf; + buf = p + 1; + } + return 0; +} + + |