]> git.ipfire.org Git - thirdparty/git.git/blame - t/helper/test-regex.c
Merge branch 'ea/blame-use-oideq'
[thirdparty/git.git] / t / helper / test-regex.c
CommitLineData
9038531f 1#include "test-tool.h"
d8acfe1e
NTND
2#include "gettext.h"
3
4struct reg_flag {
5 const char *name;
6 int flag;
7};
8
9static struct reg_flag reg_flags[] = {
aba8187e
CMAB
10 { "EXTENDED", REG_EXTENDED },
11 { "NEWLINE", REG_NEWLINE },
12 { "ICASE", REG_ICASE },
13 { "NOTBOL", REG_NOTBOL },
14 { "NOTEOL", REG_NOTEOL },
d8acfe1e 15#ifdef REG_STARTEND
aba8187e 16 { "STARTEND", REG_STARTEND },
d8acfe1e
NTND
17#endif
18 { NULL, 0 }
19};
c9184159 20
949782d8 21static int test_regex_bug(void)
c9184159
RJ
22{
23 char *pat = "[^={} \t]+";
24 char *str = "={}\nfred";
25 regex_t r;
26 regmatch_t m[1];
27
28 if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))
29 die("failed regcomp() for pattern '%s'", pat);
30 if (regexec(&r, str, 1, m, 0))
31 die("no match of pattern '%s' to string '%s'", pat, str);
32
33 /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957 */
34 if (m[0].rm_so == 3) /* matches '\n' when it should not */
35 die("regex bug confirmed: re-build git with NO_REGEX=1");
36
949782d8
NTND
37 return 0;
38}
39
9038531f 40int cmd__regex(int argc, const char **argv)
949782d8 41{
d8acfe1e
NTND
42 const char *pat;
43 const char *str;
aba8187e 44 int ret, silent = 0, flags = 0;
d8acfe1e
NTND
45 regex_t r;
46 regmatch_t m[1];
aba8187e 47 char errbuf[64];
d8acfe1e
NTND
48
49 argv++;
aba8187e
CMAB
50 argc--;
51
52 if (!argc)
53 goto usage;
54
55 if (!strcmp(*argv, "--bug")) {
56 if (argc == 1)
57 return test_regex_bug();
58 else
59 goto usage;
60 }
61 if (!strcmp(*argv, "--silent")) {
62 silent = 1;
d8acfe1e 63 argv++;
aba8187e
CMAB
64 argc--;
65 }
66 if (!argc)
67 goto usage;
68
69 pat = *argv++;
70 if (argc == 1)
71 str = NULL;
72 else {
73 str = *argv++;
74 while (*argv) {
75 struct reg_flag *rf;
76 for (rf = reg_flags; rf->name; rf++)
77 if (!strcmp(*argv, rf->name)) {
78 flags |= rf->flag;
79 break;
80 }
81 if (!rf->name)
82 die("do not recognize flag %s", *argv);
83 argv++;
84 }
d8acfe1e
NTND
85 }
86 git_setup_gettext();
87
aba8187e
CMAB
88 ret = regcomp(&r, pat, flags);
89 if (ret) {
90 if (silent)
91 return ret;
92
93 regerror(ret, &r, errbuf, sizeof(errbuf));
94 die("failed regcomp() for pattern '%s' (%s)", pat, errbuf);
95 }
96 if (!str)
97 return 0;
98
99 ret = regexec(&r, str, 1, m, 0);
100 if (ret) {
101 if (silent || ret == REG_NOMATCH)
102 return ret;
103
104 regerror(ret, &r, errbuf, sizeof(errbuf));
105 die("failed regexec() for subject '%s' (%s)", str, errbuf);
106 }
d8acfe1e
NTND
107
108 return 0;
aba8187e
CMAB
109usage:
110 usage("\ttest-tool regex --bug\n"
111 "\ttest-tool regex [--silent] <pattern>\n"
112 "\ttest-tool regex [--silent] <pattern> <string> [<options>]");
113 return -1;
c9184159 114}