]> git.ipfire.org Git - thirdparty/git.git/commitdiff
grep: stop modifying buffer in show_line()
authorJeff King <peff@peff.net>
Tue, 21 Sep 2021 03:48:09 +0000 (23:48 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 22 Sep 2021 18:59:50 +0000 (11:59 -0700)
When showing lines via grep (or looking for funcnames), we call
show_line() on a multi-line buffer. It finds the end of line and marks
it with a NUL. However, we don't need to do so, as the resulting line is
only used along with its "eol" marker:

 - we pass both to next_match(), which takes care to look at only the
   bytes we specified

 - we pass the line to output_color() without its matching eol marker.
   However, we do use the "match" struct we got from next_match() to
   tell it how many bytes to look at (which can never exceed the string
   we passed it).

So we can stop setting and restoring this NUL marker. That makes the
code simpler, and will allow us to take a const buffer in a future
patch.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
grep.c

diff --git a/grep.c b/grep.c
index 5b1f2da4d3c9b97dd7b4f706a8cf03d1a6a4b64b..70af01d1c1198448053b923c14c485fc6578ecf8 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -1239,7 +1239,6 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
        if (opt->color || opt->only_matching) {
                regmatch_t match;
                enum grep_context ctx = GREP_CONTEXT_BODY;
-               int ch = *eol;
                int eflags = 0;
 
                if (opt->color) {
@@ -1254,7 +1253,6 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
                        else if (sign == '=')
                                line_color = opt->colors[GREP_COLOR_FUNCTION];
                }
-               *eol = '\0';
                while (next_match(opt, bol, eol, ctx, &match, eflags)) {
                        if (match.rm_so == match.rm_eo)
                                break;
@@ -1272,7 +1270,6 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
                        rest -= match.rm_eo;
                        eflags = REG_NOTBOL;
                }
-               *eol = ch;
        }
        if (!opt->only_matching) {
                output_color(opt, bol, rest, line_color);