grep: stop modifying buffer in strip_timestamp

When grepping for headers in commit objects, we receive individual lines (e.g., "author Name <email> 1234 -0000"), and then strip off the timestamp to do our match. We do so by writing a NUL byte over the whitespace separator, and then remembering to restore it later. We had to do it this way when this was added back in a4d7d2c6db (log --author/--committer: really match only with name part, 2008-09-04), because we fed the result directly to regexec(), which expects a NUL-terminated string. But since b7d36ffca0 (regex: use regexec_buf(), 2016-09-21), we have a function which can match part of a buffer. So instead of modifying the string, we can instead just move the "eol" pointer, and the rest of the code will do the right thing. This will let further patches mark more buffers as "const". Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Sep 20, 2021 at 23:46 UTC cc8e26ee8d56dbdb442796a43aa7f30d3684b036
1 file changed +3 -10
grep.c
+3 -10
@@ -922,20 +922,16 @@ static int patmatch(struct grep_pat *p, char *line, char *eol,
922 return hit;
923 }
924
925 -static int strip_timestamp(char *bol, char **eol_p)
925 +static void strip_timestamp(char *bol, char **eol_p)
926 {
927 char *eol = *eol_p;
928 - int ch;
928
929 while (bol < --eol) {
930 if (*eol != '>')
931 continue;
932 *eol_p = ++eol;
934 - ch = *eol;
935 - *eol = '\0';
936 - return ch;
933 + break;
934 }
938 - return 0;
935 }
936
937 static struct {
@@ -952,7 +948,6 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
948 regmatch_t *pmatch, int eflags)
949 {
950 int hit = 0;
955 - int saved_ch = 0;
951 const char *start = bol;
952
953 if ((p->token != GREP_PATTERN) &&
@@ -971,7 +966,7 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
966 switch (p->field) {
967 case GREP_HEADER_AUTHOR:
968 case GREP_HEADER_COMMITTER:
974 - saved_ch = strip_timestamp(bol, &eol);
969 + strip_timestamp(bol, &eol);
970 break;
971 default:
972 break;
@@ -1021,8 +1016,6 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
1016 goto again;
1017 }
1018 }
1024 - if (p->token == GREP_PATTERN_HEAD && saved_ch)
1025 - *eol = saved_ch;
1019 if (hit) {
1020 pmatch[0].rm_so += bol - start;
1021 pmatch[0].rm_eo += bol - start;