test-regex: expose full regcomp() to the command line

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Jun 25, 2016 at 07:22 UTC d8acfe1eaf8621025c4095d3fbb88b2703b3fa54
1 file changed +49 -2
test-regex.c
+49 -2
@@ -1,4 +1,21 @@
1 #include "git-compat-util.h"
2 +#include "gettext.h"
3 +
4 +struct reg_flag {
5 + const char *name;
6 + int flag;
7 +};
8 +
9 +static struct reg_flag reg_flags[] = {
10 + { "EXTENDED", REG_EXTENDED },
11 + { "NEWLINE", REG_NEWLINE },
12 + { "ICASE", REG_ICASE },
13 + { "NOTBOL", REG_NOTBOL },
14 +#ifdef REG_STARTEND
15 + { "STARTEND", REG_STARTEND },
16 +#endif
17 + { NULL, 0 }
18 +};
19
20 static int test_regex_bug(void)
21 {
@@ -21,8 +38,38 @@ static int test_regex_bug(void)
38
39 int main(int argc, char **argv)
40 {
41 + const char *pat;
42 + const char *str;
43 + int flags = 0;
44 + regex_t r;
45 + regmatch_t m[1];
46 +
47 if (argc == 2 && !strcmp(argv[1], "--bug"))
48 return test_regex_bug();
26 - else
27 - usage("test-regex --bug");
49 + else if (argc < 3)
50 + usage("test-regex --bug\n"
51 + "test-regex <pattern> <string> [<options>]");
52 +
53 + argv++;
54 + pat = *argv++;
55 + str = *argv++;
56 + while (*argv) {
57 + struct reg_flag *rf;
58 + for (rf = reg_flags; rf->name; rf++)
59 + if (!strcmp(*argv, rf->name)) {
60 + flags |= rf->flag;
61 + break;
62 + }
63 + if (!rf->name)
64 + die("do not recognize %s", *argv);
65 + argv++;
66 + }
67 + git_setup_gettext();
68 +
69 + if (regcomp(&r, pat, flags))
70 + die("failed regcomp() for pattern '%s'", pat);
71 + if (regexec(&r, str, 1, m, 0))
72 + return 1;
73 +
74 + return 0;
75 }