| #include "test-tool.h" |
| #include "git-compat-util.h" |
| #include "gettext.h" |
| |
| 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 cmd__regex(int argc, const 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-tool regex --bug\n" |
| "test-tool 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; |
| } |