threads / bug / 19424

git-grep colouring bug with -w option.

Subject: git-grep colouring bug with -w option.

## tl;dr

3 messages between May 20, 2009 and May 21, 2009.

replies: 2people: 2as markdown or json

Dmitry Gryazin· May 20, 2009, 18:38 UTC · lore

I've found that "git-grep --color -w VirtualKeybord" works not correct for string like:

vkbd = RVirtualKeyboard(main_window, "VirtualKeyboard")
My script in attachment reproduces this bug.
René Scharfe· May 20, 2009, 21:31 UTC · re: Dmitry Gryazin · lore

[PATCH] grep: fix word-regexp colouring

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;
 }
 
-- 
1.6.3.1
Dmitry Gryazin· May 21, 2009, 04:29 UTC · re: René Scharfe · lore

Re: [PATCH] grep: fix word-regexp colouring

René Scharfe wrote:
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;
>  }
>  
>   
Thanks.
ACK

← back to recent threads