Show 38 quoted lines
> As noticed by Dmitry Gryazin: When a pattern is found but it doesn't
> start and end at word boundaries, bol is forwarded to after the match and
> the pattern is searched again. When a pattern is finally found between
> word boundaries, the match offsets are off by the number of characters
> that have been skipped.
>
> This patch corrects the offsets to be relative to the value of bol as
> passed to match_one_pattern() by its caller.
>
> Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
> ---
> grep.c | 5 +++++
> 1 files changed, 5 insertions(+), 0 deletions(-)
>
> diff --git a/grep.c b/grep.c
> index 04c777a..a649f06 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -305,6 +305,7 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
> {
> int hit = 0;
> int saved_ch = 0;
> + const char *start = bol;
>
> if ((p->token != GREP_PATTERN) &&
> ((p->token == GREP_PATTERN_HEAD) != (ctx == GREP_CONTEXT_HEAD)))
> @@ -365,6 +366,10 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
> }
> if (p->token == GREP_PATTERN_HEAD && saved_ch)
> *eol = saved_ch;
> + if (hit) {
> + pmatch[0].rm_so += bol - start;
> + pmatch[0].rm_eo += bol - start;
> + }
> return hit;
> }
>
>