+static void show_line_header(struct grep_opt *opt, const char *name,
+ unsigned lno, ssize_t cno, char sign)
+{
+ if (opt->heading && opt->last_shown == 0) {
+ output_color(opt, name, strlen(name), opt->colors[GREP_COLOR_FILENAME]);
+ opt->output(opt, "\n", 1);
+ }
+ opt->last_shown = lno;
+
+ if (!opt->heading && opt->pathname) {
+ output_color(opt, name, strlen(name), opt->colors[GREP_COLOR_FILENAME]);
+ output_sep(opt, sign);
+ }
+ if (opt->linenum) {
+ char buf[32];
+ xsnprintf(buf, sizeof(buf), "%d", lno);
+ output_color(opt, buf, strlen(buf), opt->colors[GREP_COLOR_LINENO]);
+ output_sep(opt, sign);
+ }
+ /*
+ * Treat 'cno' as the 1-indexed offset from the start of a non-context
+ * line to its first match. Otherwise, 'cno' is 0 indicating that we are
+ * being called with a context line.
+ */
+ if (opt->columnnum && cno) {
+ char buf[32];
+ xsnprintf(buf, sizeof(buf), "%"PRIuMAX, (uintmax_t)cno);
+ output_color(opt, buf, strlen(buf), opt->colors[GREP_COLOR_COLUMNNO]);
+ output_sep(opt, sign);
+ }
+}
+