aboutsummaryrefslogtreecommitdiffstats
path: root/color.c
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2009-01-17 17:29:42 +0100
committerJunio C Hamano <gitster@pobox.com>2009-01-17 10:42:03 -0800
commit07b57e90f7c852c4fe212ab1d91058f27469a74b (patch)
tree4f9635f2ab1d0c8d70f08e861032069e078578f2 /color.c
parent3ea95d2b0e6fa63e66de24a5084e217102ab9e8a (diff)
downloadgit-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.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/color.c b/color.c
index fc0b72ad59..d4ae83f9b7 100644
--- a/color.c
+++ b/color.c
@@ -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;
+}
+
+