v6 fixes comments from Ramsay and Eric. Interdiff below. The only
thing to add is, I decided not to replace !icase_non_ascii with
icase_ascii_only. I went with spelling out "!icase || ascii_only". I
think it expresses the intention better.

diff --git a/grep.c b/grep.c
index 2e4f71d..aed4fe0 100644
--- a/grep.c
+++ b/grep.c
@@ -412,11 +412,11 @@ static void compile_fixed_regexp(struct grep_pat *p, 
struct grep_opt *opt)
        basic_regex_quote_buf(&sb, p->pattern);
        err = regcomp(&p->regexp, sb.buf, opt->regflags & ~REG_EXTENDED);
        if (opt->debug)
-               fprintf(stderr, "fixed%s\n", sb.buf);
+               fprintf(stderr, "fixed %s\n", sb.buf);
        strbuf_release(&sb);
        if (err) {
                char errbuf[1024];
-               regerror(err, &p->regexp, errbuf, 1024);
+               regerror(err, &p->regexp, errbuf, sizeof(errbuf));
                regfree(&p->regexp);
                compile_regexp_failed(p, errbuf);
        }
@@ -424,19 +424,18 @@ static void compile_fixed_regexp(struct grep_pat *p, 
struct grep_opt *opt)
 
 static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
 {
-       int icase_non_ascii;
+       int icase, ascii_only;
        int err;
 
        p->word_regexp = opt->word_regexp;
        p->ignore_case = opt->ignore_case;
-       icase_non_ascii =
-               (opt->regflags & REG_ICASE || p->ignore_case) &&
-               has_non_ascii(p->pattern);
+       icase          = opt->regflags & REG_ICASE || p->ignore_case;
+       ascii_only     = !has_non_ascii(p->pattern);
 
-       if (!icase_non_ascii && is_fixed(p->pattern, p->patternlen))
+       if ((!icase || ascii_only) && is_fixed(p->pattern, p->patternlen))
                p->fixed = 1;
        else if (opt->fixed) {
-               p->fixed = !icase_non_ascii;
+               p->fixed = !icase || ascii_only;
                if (!p->fixed) {
                        compile_fixed_regexp(p, opt);
                        return;
diff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh
index 5ed69a6..991ed2a 100755
--- a/t/t0070-fundamental.sh
+++ b/t/t0070-fundamental.sh
@@ -31,7 +31,7 @@ test_expect_success 'git_mkstemps_mode does not fail if fd 0 
is not open' '
 
 test_expect_success 'check for a bug in the regex routines' '
        # if this test fails, re-build git with NO_REGEX=1
-       test-regex
+       test-regex --bug
 '
 
 test_done
diff --git a/t/t7812-grep-icase-non-ascii.sh b/t/t7812-grep-icase-non-ascii.sh
index a5475bb..4176625 100755
--- a/t/t7812-grep-icase-non-ascii.sh
+++ b/t/t7812-grep-icase-non-ascii.sh
@@ -38,12 +38,12 @@ test_expect_success GETTEXT_LOCALE,LIBPCRE 'grep pcre utf-8 
string with "+"' '
 test_expect_success REGEX_LOCALE 'grep literal string, with -F' '
        git grep --debug -i -F "TILRAUN: Halló Heimur!"  2>&1 >/dev/null |
                 grep fixed >debug1 &&
-       echo "fixedTILRAUN: Halló Heimur!" >expect1 &&
+       echo "fixed TILRAUN: Halló Heimur!" >expect1 &&
        test_cmp expect1 debug1 &&
 
        git grep --debug -i -F "TILRAUN: HALLÓ HEIMUR!"  2>&1 >/dev/null |
                 grep fixed >debug2 &&
-       echo "fixedTILRAUN: HALLÓ HEIMUR!" >expect2 &&
+       echo "fixed TILRAUN: HALLÓ HEIMUR!" >expect2 &&
        test_cmp expect2 debug2
 '
 
@@ -52,12 +52,12 @@ test_expect_success REGEX_LOCALE 'grep string with regex, 
with -F' '
 
        git grep --debug -i -F "^*TILR^AUN:.* \\Halló \$He[]imur!\$" 2>&1 
>/dev/null |
                 grep fixed >debug1 &&
-       echo "fixed\\^*TILR^AUN:\\.\\* \\\\Halló \$He\\[]imur!\\\$" >expect1 &&
+       echo "fixed \\^*TILR^AUN:\\.\\* \\\\Halló \$He\\[]imur!\\\$" >expect1 &&
        test_cmp expect1 debug1 &&
 
        git grep --debug -i -F "^*TILR^AUN:.* \\HALLÓ \$HE[]IMUR!\$"  2>&1 
>/dev/null |
                 grep fixed >debug2 &&
-       echo "fixed\\^*TILR^AUN:\\.\\* \\\\HALLÓ \$HE\\[]IMUR!\\\$" >expect2 &&
+       echo "fixed \\^*TILR^AUN:\\.\\* \\\\HALLÓ \$HE\\[]IMUR!\\\$" >expect2 &&
        test_cmp expect2 debug2
 '
 
diff --git a/test-regex.c b/test-regex.c
index 3b5641c..d1a952c 100644
--- a/test-regex.c
+++ b/test-regex.c
@@ -17,6 +17,25 @@ static struct reg_flag reg_flags[] = {
        { NULL, 0 }
 };
 
+static int test_regex_bug(void)
+{
+       char *pat = "[^={} \t]+";
+       char *str = "={}\nfred";
+       regex_t r;
+       regmatch_t m[1];
+
+       if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))
+               die("failed regcomp() for pattern '%s'", pat);
+       if (regexec(&r, str, 1, m, 0))
+               die("no match of pattern '%s' to string '%s'", pat, str);
+
+       /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */
+       if (m[0].rm_so == 3) /* matches '\n' when it should not */
+               die("regex bug confirmed: re-build git with NO_REGEX=1");
+
+       return 0;
+}
+
 int main(int argc, char **argv)
 {
        const char *pat;
@@ -25,40 +44,32 @@ int main(int argc, char **argv)
        regex_t r;
        regmatch_t m[1];
 
-       if (argc == 1) {
-               /* special case, bug check */
-               pat = "[^={} \t]+";
-               str = "={}\nfred";
-               flags = REG_EXTENDED | REG_NEWLINE;
-       } else {
+       if (argc == 2 && !strcmp(argv[1], "--bug"))
+               return test_regex_bug();
+       else if (argc < 3)
+               die("usage: test-regex --bug\n"
+                   "       test-regex <pattern> <string> [<options>]");
+
+       argv++;
+       pat = *argv++;
+       str = *argv++;
+       while (*argv) {
+               struct reg_flag *rf;
+               for (rf = reg_flags; rf->name; rf++)
+                       if (!strcmp(*argv, rf->name)) {
+                               flags |= rf->flag;
+                               break;
+                       }
+               if (!rf->name)
+                       die("do not recognize %s", *argv);
                argv++;
-               pat = *argv++;
-               str = *argv++;
-               while (*argv) {
-                       struct reg_flag *rf;
-                       for (rf = reg_flags; rf->name; rf++)
-                               if (!strcmp(*argv, rf->name)) {
-                                       flags |= rf->flag;
-                                       break;
-                               }
-                       if (!rf->name)
-                               die("do not recognize %s", *argv);
-                       argv++;
-               }
-               git_setup_gettext();
        }
+       git_setup_gettext();
 
        if (regcomp(&r, pat, flags))
                die("failed regcomp() for pattern '%s'", pat);
-       if (regexec(&r, str, 1, m, 0)) {
-               if (argc == 1)
-                       die("no match of pattern '%s' to string '%s'", pat, 
str);
+       if (regexec(&r, str, 1, m, 0))
                return 1;
-       }
-
-       /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */
-       if (argc == 1 && m[0].rm_so == 3) /* matches '\n' when it should not */
-               die("regex bug confirmed: re-build git with NO_REGEX=1");
 
-       exit(0);
+       return 0;
 }
-- 
2.7.0.377.g4cd97dd

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to