1 | /* POSIX regex testsuite from IEEE 2003.2. |
2 | Copyright (C) 1998-2022 Free Software Foundation, Inc. |
3 | This file is part of the GNU C Library. |
4 | |
5 | The GNU C Library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, see |
17 | <https://www.gnu.org/licenses/>. */ |
18 | |
19 | #include <sys/types.h> |
20 | #include <regex.h> |
21 | #include <stdio.h> |
22 | #include <string.h> |
23 | |
24 | /* Data structure to describe the tests. */ |
25 | struct test |
26 | { |
27 | int start; |
28 | int end; |
29 | const char *reg; |
30 | const char *str; |
31 | int options; |
32 | } tests[] = |
33 | { |
34 | #include "ptestcases.h" |
35 | }; |
36 | |
37 | |
38 | int |
39 | main (int argc, char *argv[]) |
40 | { |
41 | size_t cnt; |
42 | int errors = 0; |
43 | |
44 | for (cnt = 0; cnt < sizeof (tests) / sizeof (tests[0]); ++cnt) |
45 | if (tests[cnt].str == NULL) |
46 | { |
47 | printf (format: "\n%s\n%.*s\n" , tests[cnt].reg, |
48 | (int) strlen (tests[cnt].reg), |
49 | "-----------------------------------------------------" ); |
50 | } |
51 | else if (tests[cnt].reg == NULL) |
52 | printf (format: "!!! %s\n" , tests[cnt].str); |
53 | else |
54 | { |
55 | regex_t re; |
56 | regmatch_t match[20]; |
57 | int err; |
58 | |
59 | printf (format: "regexp: \"%s\", string: \"%s\" -> " , tests[cnt].reg, |
60 | tests[cnt].str); |
61 | |
62 | /* Compile the expression. */ |
63 | err = regcomp (preg: &re, pattern: tests[cnt].reg, cflags: tests[cnt].options); |
64 | if (err != 0) |
65 | { |
66 | if (tests[cnt].start == -2) |
67 | puts (s: "compiling failed, OK" ); |
68 | else |
69 | { |
70 | char buf[100]; |
71 | regerror (errcode: err, preg: &re, errbuf: buf, errbuf_size: sizeof (buf)); |
72 | printf (format: "FAIL: %s\n" , buf); |
73 | ++errors; |
74 | } |
75 | |
76 | continue; |
77 | } |
78 | else if (tests[cnt].start == -2) |
79 | { |
80 | puts (s: "compiling suceeds, FAIL" ); |
81 | errors++; |
82 | continue; |
83 | } |
84 | |
85 | /* Run the actual test. */ |
86 | err = regexec (preg: &re, String: tests[cnt].str, nmatch: 20, pmatch: match, eflags: 0); |
87 | |
88 | if (err != 0) |
89 | { |
90 | if (tests[cnt].start == -1) |
91 | puts (s: "no match, OK" ); |
92 | else |
93 | { |
94 | puts (s: "no match, FAIL" ); |
95 | ++errors; |
96 | } |
97 | } |
98 | else |
99 | { |
100 | if (match[0].rm_so == 0 && tests[cnt].start == 0 |
101 | && match[0].rm_eo == 0 && tests[cnt].end == 0) |
102 | puts (s: "match, OK" ); |
103 | else if (match[0].rm_so + 1 == tests[cnt].start |
104 | && match[0].rm_eo == tests[cnt].end) |
105 | puts (s: "match, OK" ); |
106 | else |
107 | { |
108 | printf (format: "wrong match (%d to %d): FAIL\n" , |
109 | match[0].rm_so, match[0].rm_eo); |
110 | ++errors; |
111 | } |
112 | } |
113 | |
114 | /* Free all resources. */ |
115 | regfree (preg: &re); |
116 | } |
117 | |
118 | printf (format: "\n%Zu tests, %d errors\n" , cnt, errors); |
119 | |
120 | return errors != 0; |
121 | } |
122 | |