--- /dev/null
- int main(int argc, char **argv)
+#include "git-compat-util.h"
++#include "gettext.h"
+
- exit(0);
++struct reg_flag {
++ const char *name;
++ int flag;
++};
++
++static struct reg_flag reg_flags[] = {
++ { "EXTENDED", REG_EXTENDED },
++ { "NEWLINE", REG_NEWLINE },
++ { "ICASE", REG_ICASE },
++ { "NOTBOL", REG_NOTBOL },
++#ifdef REG_STARTEND
++ { "STARTEND", REG_STARTEND },
++#endif
++ { 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;
++ const char *str;
++ int flags = 0;
++ regex_t r;
++ regmatch_t m[1];
++
++ if (argc == 2 && !strcmp(argv[1], "--bug"))
++ return test_regex_bug();
++ else if (argc < 3)
++ 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++;
++ }
++ git_setup_gettext();
++
++ if (regcomp(&r, pat, flags))
++ die("failed regcomp() for pattern '%s'", pat);
++ if (regexec(&r, str, 1, m, 0))
++ return 1;
++
++ return 0;
+}