v2 fixes Junio's and Jeff's comments (both good). The sharing "!icase
|| ascii_only" is made a separate commit (6/12) because I think it
takes some seconds to realize that the conversion is correct and it's
technically not needed in 5/12 (and it's sort of the opposite of 1/12)
Interdiff
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index 0a5f877..55067ca 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -200,19 +200,30 @@ static void pickaxe(struct diff_queue_struct *q, struct
diff_options *o,
*q = outq;
}
+static void regcomp_or_die(regex_t *regex, const char *needle, int cflags)
+{
+ int err = regcomp(regex, needle, cflags);
+ if (err) {
+ /* The POSIX.2 people are surely sick */
+ char errbuf[1024];
+ regerror(err, regex, errbuf, 1024);
+ regfree(regex);
+ die("invalid regex: %s", errbuf);
+ }
+}
+
void diffcore_pickaxe(struct diff_options *o)
{
const char *needle = o->pickaxe;
int opts = o->pickaxe_opts;
regex_t regex, *regexp = NULL;
kwset_t kws = NULL;
- int err = 0;
if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
int cflags = REG_EXTENDED | REG_NEWLINE;
if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
cflags |= REG_ICASE;
- err = regcomp(®ex, needle, cflags);
+ regcomp_or_die(®ex, needle, cflags);
regexp = ®ex;
} else if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE) &&
has_non_ascii(needle)) {
@@ -220,7 +231,7 @@ void diffcore_pickaxe(struct diff_options *o)
int cflags = REG_NEWLINE | REG_ICASE;
basic_regex_quote_buf(&sb, needle);
- err = regcomp(®ex, sb.buf, cflags);
+ regcomp_or_die(®ex, sb.buf, cflags);
strbuf_release(&sb);
regexp = ®ex;
} else {
@@ -229,13 +240,6 @@ void diffcore_pickaxe(struct diff_options *o)
kwsincr(kws, needle, strlen(needle));
kwsprep(kws);
}
- if (err) {
- /* The POSIX.2 people are surely sick */
- char errbuf[1024];
- regerror(err, ®ex, errbuf, 1024);
- regfree(®ex);
- die("invalid regex: %s", errbuf);
- }
/* Might want to warn when both S and G are on; I don't care... */
pickaxe(&diff_queued_diff, o, regexp, kws,
diff --git a/grep.c b/grep.c
index cb058a5..92587a8 100644
--- a/grep.c
+++ b/grep.c
@@ -432,15 +432,8 @@ static void compile_regexp(struct grep_pat *p, struct
grep_opt *opt)
icase = opt->regflags & REG_ICASE || p->ignore_case;
ascii_only = !has_non_ascii(p->pattern);
- if (opt->fixed) {
+ if (opt->fixed || is_fixed(p->pattern, p->patternlen))
p->fixed = !icase || ascii_only;
- if (!p->fixed) {
- compile_fixed_regexp(p, opt);
- return;
- }
- } else if ((!icase || ascii_only) &&
- is_fixed(p->pattern, p->patternlen))
- p->fixed = 1;
else
p->fixed = 0;
@@ -449,6 +442,9 @@ static void compile_regexp(struct grep_pat *p, struct
grep_opt *opt)
kwsincr(p->kws, p->pattern, p->patternlen);
kwsprep(p->kws);
return;
+ } else if (opt->fixed) {
+ compile_fixed_regexp(p, opt);
+ return;
}
if (opt->pcre) {
Nguyễn Thái Ngọc Duy (12):
grep: break down an "if" stmt in preparation for next changes
test-regex: isolate the bug test code
test-regex: expose full regcomp() to the command line
grep/icase: avoid kwsset on literal non-ascii strings
grep/icase: avoid kwsset when -F is specified
grep: rewrite an if/else condition to avoid duplicate expression
grep/pcre: prepare locale-dependent tables for icase matching
gettext: add is_utf8_locale()
grep/pcre: support utf-8
diffcore-pickaxe: Add regcomp_or_die()
diffcore-pickaxe: support case insensitive match on non-ascii
grep.c: reuse "icase" variable
diffcore-pickaxe.c | 33 +++++++++++----
gettext.c | 24 ++++++++++-
gettext.h | 1 +
grep.c | 43 +++++++++++++++----
grep.h | 1 +
quote.c | 37 +++++++++++++++++
quote.h | 1 +
t/t0070-fundamental.sh | 2 +-
t/t7812-grep-icase-non-ascii.sh (new +x) | 71 ++++++++++++++++++++++++++++++++
t/t7813-grep-icase-iso.sh (new +x) | 19 +++++++++
test-regex.c | 59 +++++++++++++++++++++++++-
11 files changed, 270 insertions(+), 21 deletions(-)
create mode 100755 t/t7812-grep-icase-non-ascii.sh
create mode 100755 t/t7813-grep-icase-iso.sh
--
2.8.2.526.g02eed6d
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html