summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2c866cf)
raw | patch | inline | side by side (parent: 2c866cf)
author | Junio C Hamano <junkio@cox.net> | |
Tue, 2 May 2006 22:40:49 +0000 (15:40 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Tue, 2 May 2006 23:08:57 +0000 (16:08 -0700) |
Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-grep.c | patch | blob | history |
diff --git a/builtin-grep.c b/builtin-grep.c
index f1800a54d482d94d04f872f62d6d8ae0121ab8cb..09e3677824595d71d02fc7bfc03eef0428df8b90 100644 (file)
--- a/builtin-grep.c
+++ b/builtin-grep.c
unsigned invert:1;
unsigned name_only:1;
unsigned count:1;
+ unsigned word_regexp:1;
int regflags;
unsigned pre_context;
unsigned post_context;
return cp;
}
+static int word_char(char ch)
+{
+ return isalnum(ch) || ch == '_';
+}
+
static void show_line(struct grep_opt *opt, const char *bol, const char *eol,
const char *name, unsigned lno, char sign)
{
regex_t *exp = &p->regexp;
hit = !regexec(exp, bol, ARRAY_SIZE(pmatch),
pmatch, 0);
+
+ if (hit && opt->word_regexp) {
+ /* Match beginning must be either
+ * beginning of the line, or at word
+ * boundary (i.e. the last char must
+ * not be alnum or underscore).
+ */
+ if ((pmatch[0].rm_so < 0) ||
+ (eol - bol) <= pmatch[0].rm_so ||
+ (pmatch[0].rm_eo < 0) ||
+ (eol - bol) < pmatch[0].rm_eo)
+ die("regexp returned nonsense");
+ if (pmatch[0].rm_so != 0 &&
+ word_char(bol[pmatch[0].rm_so-1]))
+ continue; /* not a word boundary */
+ if ((eol-bol) < pmatch[0].rm_eo &&
+ word_char(bol[pmatch[0].rm_eo]))
+ continue; /* not a word boundary */
+ }
if (hit)
break;
}
opt.count = 1;
continue;
}
+ if (!strcmp("-w", arg) ||
+ !strcmp("--word-regexp", arg)) {
+ opt.word_regexp = 1;
+ continue;
+ }
if (!strncmp("-A", arg, 2) ||
!strncmp("-B", arg, 2) ||
!strncmp("-C", arg, 2) ||