1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include <sys/types.h>
22: #include <mcheck.h>
23: #include <regex.h>
24: #include <stdio.h>
25: #include <stdlib.h>
26: #include <locale.h>
27:
28:
29: struct
30: {
31: const char *pattern;
32: const char *string;
33: int flags, nmatch;
34: regmatch_t rm[5];
35: } tests[] = {
36:
37:
38:
39:
40: { "\xc3\x84\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
41: { { 2, 10 }, { -1, -1 } } },
42: { "[\xc3\x84x]\xc3\x96*\xc3\xb6$", "aB\xc3\x84\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
43: { { 2, 10 }, { -1, -1 } } },
44: { "[\xc3\x84x]\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
45: { { 2, 10 }, { -1, -1 } } },
46: { "[^x]\xc3\x96*\xc3\xb6$", "aB\xc3\xa4\xc3\xb6\xc3\xb6\xc3\x96", REG_ICASE, 2,
47: { { 2, 10 }, { -1, -1 } } },
48: };
49:
50: int
51: main (void)
52: {
53: regex_t re;
54: regmatch_t rm[5];
55: size_t i;
56: int n, ret = 0;
57:
58: setlocale (LC_ALL, "de_DE.UTF-8");
59: for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
60: {
61: n = regcomp (&re, tests[i].pattern, tests[i].flags);
62: if (n != 0)
63: {
64: char buf[500];
65: regerror (n, &re, buf, sizeof (buf));
66: printf ("regcomp %zd failed: %s\n", i, buf);
67: ret = 1;
68: continue;
69: }
70:
71: if (regexec (&re, tests[i].string, tests[i].nmatch, rm, 0))
72: {
73: printf ("regexec %zd failed\n", i);
74: ret = 1;
75: regfree (&re);
76: continue;
77: }
78:
79: for (n = 0; n < tests[i].nmatch; ++n)
80: if (rm[n].rm_so != tests[i].rm[n].rm_so
81: || rm[n].rm_eo != tests[i].rm[n].rm_eo)
82: {
83: if (tests[i].rm[n].rm_so == -1 && tests[i].rm[n].rm_eo == -1)
84: break;
85: printf ("regexec match failure rm[%d] %d..%d\n",
86: n, rm[n].rm_so, rm[n].rm_eo);
87: ret = 1;
88: break;
89: }
90:
91: regfree (&re);
92: }
93:
94: return ret;
95: }