Am 05.05.2018 um 04:42 schrieb Taylor Blau: > When calling match_line(), callers presently cannot determine the > relative offset of the match because match_line() discards the > 'regmatch_t' that contains this information. > > Instead, teach match_line() to take in a 'regmatch_t *' so that callers > can inspect the match's starting and ending offset from the beginning of > the line. This additional argument has no effect when opt->extended is > non-zero. > > We will later pass the starting offset from 'regmatch_t *' to > show_line() in order to display the column number of the first match. > > Signed-off-by: Taylor Blau <me@xxxxxxxxxxxx> > --- > grep.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/grep.c b/grep.c > index 65b90c10a3..1c25782355 100644 > --- a/grep.c > +++ b/grep.c > @@ -1299,17 +1299,17 @@ static int match_expr(struct grep_opt *opt, char *bol, char *eol, > } > > static int match_line(struct grep_opt *opt, char *bol, char *eol, > - enum grep_context ctx, int collect_hits) > + regmatch_t *match, enum grep_context ctx, > + int collect_hits) > { > struct grep_pat *p; > - regmatch_t match; > > if (opt->extended) > return match_expr(opt, bol, eol, ctx, collect_hits); If ->extended is set then match won't be touched... > > /* we do not call with collect_hits without being extended */ > for (p = opt->pattern_list; p; p = p->next) { > - if (match_one_pattern(p, bol, eol, ctx, &match, 0)) > + if (match_one_pattern(p, bol, eol, ctx, match, 0)) > return 1; > } > return 0; > @@ -1699,6 +1699,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle > int try_lookahead = 0; > int show_function = 0; > struct userdiff_driver *textconv = NULL; > + regmatch_t match; > enum grep_context ctx = GREP_CONTEXT_HEAD; > xdemitconf_t xecfg; > > @@ -1788,7 +1789,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle > if ((ctx == GREP_CONTEXT_HEAD) && (eol == bol)) > ctx = GREP_CONTEXT_BODY; > > - hit = match_line(opt, bol, eol, ctx, collect_hits); > + hit = match_line(opt, bol, eol, &match, ctx, collect_hits); > *eol = ch; > > if (collect_hits) > ... which leaves it uninitialized. So at least the combination of extended matches and --column should error out. Supporting it would be better, of course. That could get tricky for negations, though (e.g. git grep --not -e foo). René