78ed81a3 |
1 | /* other.c: test (not exhaustively) non-POSIX regular expressions. */ |
2 | |
3 | #include "test.h" |
4 | |
5 | void |
6 | test_others () |
7 | { |
8 | struct re_registers regs; |
9 | |
10 | printf ("\nStarting non-POSIX tests.\n"); |
11 | t = other_test; |
12 | |
13 | test_should_match = true; |
14 | |
15 | /* The big question: does the group participate in the match, or match |
16 | the empty string? */ |
17 | re_set_syntax (RE_NO_BK_PARENS); |
18 | test_match ("(a*)*ab", "ab"); |
19 | TEST_REGISTERS ("(a*)*ab", "ab", 0, 2, 0, 0, -1, -1); |
20 | test_match ("(a*)*", ""); |
21 | TEST_REGISTERS ("(a*)*ab", "ab", 0, 0, 0, 0, -1, -1); |
22 | |
23 | /* This tests finding the highest and lowest active registers. */ |
24 | test_match ("(a(b)c(d(e)f)g)h(i(j)k(l(m)n)o)\\1\\2\\3\\4\\5\\6\\7\\8", |
25 | "abcdefghijklmnoabcdefgbdefeijklmnojlmnm"); |
26 | |
27 | /* Test that \< and \> match at the beginning and end of the string. */ |
28 | test_match ("\\<abc\\>", "abc"); |
29 | |
30 | /* May as well test \` and \' while we're at it. */ |
31 | test_match ("\\`abc\\'", "abc"); |
32 | |
33 | #if 0 |
34 | /* Test backreferencing and the fastmap -- which doesn't work. */ |
35 | test_fastmap ("(a)*\\1", "a", 0, 0); |
36 | #endif |
37 | |
38 | /* But at least we shouldn't search improperly. */ |
39 | test_search_return (-1, "(a)\\1", ""); |
40 | |
41 | re_set_syntax (RE_SYNTAX_EMACS); |
42 | |
43 | MATCH_SELF("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
44 | MATCH_SELF ("a^"); |
45 | MATCH_SELF ("a^b"); |
46 | MATCH_SELF ("$a"); |
47 | MATCH_SELF ("a$b"); |
48 | |
49 | re_set_syntax (RE_BACKSLASH_ESCAPE_IN_LISTS); |
50 | test_match ("[\\^a]", "a"); |
51 | test_match ("[\\^a]", "^"); |
52 | |
53 | /* These op characters should be ordinary if RE_CONTEXT_INVALID_OPS |
54 | isn't set. */ |
55 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_BRACES | RE_INTERVALS |
56 | | RE_NO_BK_PARENS); |
57 | MATCH_SELF ("*"); |
58 | test_match ("a|*", "*"); |
59 | test_match ("(*)", "*"); |
60 | |
61 | MATCH_SELF ("+"); |
62 | test_match ("a|+", "+"); |
63 | test_match ("(+)", "+"); |
64 | |
65 | MATCH_SELF ("?"); |
66 | test_match ("a|?", "?"); |
67 | test_match ("(?)", "?"); |
68 | |
69 | MATCH_SELF ("{1}"); |
70 | test_match ("a|{1}", "a"); |
71 | test_match ("a|{1}", "{1}"); |
72 | test_match ("({1})", "{1}"); |
73 | |
74 | test_match ("\\{", "{"); |
75 | |
76 | |
77 | re_set_syntax (RE_LIMITED_OPS); |
78 | MATCH_SELF ("|"); |
79 | MATCH_SELF ("a|"); |
80 | MATCH_SELF ("a|"); |
81 | MATCH_SELF ("a||"); |
82 | MATCH_SELF ("a||"); |
83 | MATCH_SELF ("(|)"); |
84 | |
85 | re_set_syntax (RE_SYNTAX_EMACS); |
86 | TEST_SEARCH ("^a", "b\na", 0, 3); |
87 | TEST_SEARCH ("b$", "b\na", 0, 3); |
88 | |
89 | #if 0 |
90 | /* Newline is no longer special for anchors (16 Sep 92). --karl */ |
91 | test_match_2 ("a\n^b", "a", "\nb"); |
92 | test_match_2 ("a$\nb", "a\n", "b"); |
93 | #endif |
94 | |
95 | /* Test grouping. */ |
96 | re_set_syntax (RE_NO_BK_PARENS); |
97 | |
98 | test_match ("()", ""); |
99 | test_fastmap ("()", "", 0, 0); |
100 | TEST_REGISTERS ("()", "", 0, 0, 0, 0, -1, -1); |
101 | |
102 | test_match ("((((((((()))))))))", ""); |
103 | test_fastmap ("((((((((()))))))))", "", 0, 0); |
104 | test_match ("a()b", "ab"); |
105 | TEST_REGISTERS ("a()b", "ab", 0, 2, 1, 1, -1, -1); |
106 | |
107 | test_match ("(((((((((())))))))))", ""); |
108 | test_fastmap ("(((((((((())))))))))", "", 0, 0); |
109 | |
110 | test_match ("()*", ""); |
111 | TEST_REGISTERS ("()*", "", 0, 0, 0, 0, -1, -1); /* empty string */ |
112 | test_match ("(())*", ""); |
113 | |
114 | re_set_syntax (RE_CONTEXT_INDEP_OPS); |
115 | test_match ("*", ""); |
116 | |
117 | re_set_syntax (RE_INTERVALS | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES); |
118 | test_match ("{1}", ""); /* Should remain an interval. */ |
119 | MATCH_SELF ("{1"); /* Not a valid interval. */ |
120 | |
121 | re_set_syntax (RE_NEWLINE_ALT); |
122 | test_match ("a\nb", "a"); |
123 | test_match ("a\nb", "b"); |
124 | |
125 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS); |
126 | test_match ("^a", "a"); |
127 | test_match ("(^a)", "a"); |
128 | test_match ("(a|^b)", "b"); |
129 | test_match ("a$", "a"); |
130 | test_match ("(a$)", "a"); |
131 | test_match ("a$|b", "a"); |
132 | |
133 | /* You should be able to have empty alternatives if RE_NO_EMPTY_ALTS |
134 | isn't set. */ |
135 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS); |
136 | |
137 | test_match ("|", ""); |
138 | test_match ("^|a", ""); |
139 | test_match ("^|a", "a"); |
140 | test_match ("a|", ""); |
141 | test_match ("a|", "a"); |
142 | test_match ("a|$", ""); |
143 | test_match ("a|$", "a"); |
144 | test_match ("a||b", "a"); |
145 | test_match ("a||b", ""); |
146 | test_match ("a||b", "b"); |
147 | test_match ("(|a)", ""); |
148 | test_match ("(|a)", "a"); |
149 | test_match ("(a|)", ""); |
150 | test_match ("(a|)", "a"); |
151 | |
152 | TEST_SEARCH ("a|$", "xa", 0, 2); |
153 | TEST_SEARCH ("a|$", "x", 0, 1); |
154 | TEST_SEARCH ("$|b", "x", 0, 1); |
155 | TEST_SEARCH ("$|b", "xb", 0, 2); |
156 | TEST_SEARCH ("c(a|$)", "xca", 0, 3); |
157 | TEST_SEARCH ("c(a|$)", "xc", 0, 2); |
158 | TEST_SEARCH ("c($|b)", "xcb", 0, 3); |
159 | TEST_SEARCH ("c($|b)", "xc", 0, 2); |
160 | TEST_SEARCH ("c($|b$)", "xcb", 0, 3); |
161 | TEST_SEARCH ("c($|b$)", "xc", 0, 2); |
162 | TEST_SEARCH ("c(a$|$)", "xca", 0, 3); |
163 | TEST_SEARCH ("c(a$|$)", "xc", 0, 2); |
164 | TEST_SEARCH ("(a$|b$)|$", "x", 0, 1); |
165 | TEST_SEARCH ("(a$|b$)|$", "xa", 0, 2); |
166 | TEST_SEARCH ("(a$|b$)|$", "xb", 0, 2); |
167 | TEST_SEARCH ("(a$|$)|c$", "x", 0, 1); |
168 | TEST_SEARCH ("(a$|$)|c$", "xa", 0, 2); |
169 | TEST_SEARCH ("(a$|$)|c$", "xc", 0, 2); |
170 | TEST_SEARCH ("($|b$)|c$", "x", 0, 1); |
171 | TEST_SEARCH ("($|b$)|c$", "xb", 0, 2); |
172 | TEST_SEARCH ("($|b$)|c$", "xc", 0, 2); |
173 | TEST_SEARCH ("c$|(a$|$)", "x", 0, 1); |
174 | TEST_SEARCH ("c$|(a$|$)", "xa", 0, 2); |
175 | TEST_SEARCH ("c$|(a$|$)", "xc", 0, 2); |
176 | TEST_SEARCH ("c$|($|b$)", "x", 0, 1); |
177 | TEST_SEARCH ("c$|($|b$)", "xb", 0, 2); |
178 | TEST_SEARCH ("c$|($|b$)", "xc", 0, 2); |
179 | TEST_SEARCH ("$|(a$|b$)", "x", 0, 1); |
180 | TEST_SEARCH ("$|(a$|b$)", "xa", 0, 2); |
181 | TEST_SEARCH ("$|(a$|b$)", "xb", 0, 2); |
182 | TEST_SEARCH ("c(a$|b$)|$", "x", 0, 1); |
183 | TEST_SEARCH ("c(a$|b$)|$", "xca", 0, 3); |
184 | TEST_SEARCH ("c(a$|b$)|$", "xcb", 0, 3); |
185 | TEST_SEARCH ("c(a$|$)|d$", "xc", 0, 2); |
186 | TEST_SEARCH ("c(a$|$)|d$", "xca", 0, 3); |
187 | TEST_SEARCH ("c(a$|$)|d$", "xd", 0, 2); |
188 | TEST_SEARCH ("c($|b$)|d$", "xc", 0, 2); |
189 | TEST_SEARCH ("c($|b$)|d$", "xcb", 0, 3); |
190 | TEST_SEARCH ("c($|b$)|d$", "xd", 0, 2); |
191 | TEST_SEARCH ("d(c$|e((a$|$)))", "xdc", 0, 3); |
192 | TEST_SEARCH ("d(c$|e((a$|$)))", "xde", 0, 3); |
193 | TEST_SEARCH ("d(c$|e((a$|$)))", "xdea", 0, 4); |
194 | TEST_SEARCH ("d(c$|e(($|b$)))", "xdc", 0, 3); |
195 | TEST_SEARCH ("d(c$|e(($|b$)))", "xde", 0, 3); |
196 | TEST_SEARCH ("d(c$|e(($|b$)))", "xdeb", 0, 4); |
197 | TEST_SEARCH ("d($|e((a$|b$)))", "xd", 0, 2); |
198 | TEST_SEARCH ("d($|e((a$|b$)))", "xdea", 0, 4); |
199 | TEST_SEARCH ("d($|e((a$|b$)))", "xdeb", 0, 4); |
200 | TEST_SEARCH ("a(b$|c$)|$", "x", 0, 1); |
201 | TEST_SEARCH ("a(b$|c$)|$", "xab", 0, 3); |
202 | TEST_SEARCH ("a(b$|c$)|$", "xac", 0, 3); |
203 | TEST_SEARCH ("a(b$|$)|d$", "xa", 0, 2); |
204 | TEST_SEARCH ("a(b$|$)|d$", "xab", 0, 3); |
205 | TEST_SEARCH ("a(b$|$)|d$", "xd", 0, 2); |
206 | TEST_SEARCH ("a($|c$)|d$", "xa", 0, 2); |
207 | TEST_SEARCH ("a($|c$)|d$", "xac", 0, 3); |
208 | TEST_SEARCH ("a($|c$)|d$", "xd", 0, 2); |
209 | TEST_SEARCH ("d$|a(b$|$)", "xd", 0, 2); |
210 | TEST_SEARCH ("d$|a(b$|$)", "xa", 0, 2); |
211 | TEST_SEARCH ("d$|a(b$|$)", "xab", 0, 3); |
212 | TEST_SEARCH ("d$|a($|c$)", "xd", 0, 2); |
213 | TEST_SEARCH ("d$|a($|c$)", "xa", 0, 2); |
214 | TEST_SEARCH ("d$|a($|c$)", "xac", 0, 3); |
215 | TEST_SEARCH ("$|a(b$|c$)", "x", 0, 1); |
216 | TEST_SEARCH ("$|a(b$|c$)", "xab", 0, 3); |
217 | TEST_SEARCH ("$|a(b$|c$)", "xac", 0, 3); |
218 | TEST_SEARCH ("(a)(b$|c$)|d$", "xab", 0, 3); |
219 | TEST_SEARCH ("(a)(b$|c$)|d$", "xac", 0, 3); |
220 | TEST_SEARCH ("(a)(b$|c$)|d$", "xd", 0, 2); |
221 | TEST_SEARCH ("(a)(b$|$)|d$", "xa", 0, 2); |
222 | TEST_SEARCH ("(a)(b$|$)|d$", "xab", 0, 3); |
223 | TEST_SEARCH ("(a)(b$|$)|d$", "xd", 0, 2); |
224 | TEST_SEARCH ("(a)($|c$)|d$", "xa", 0, 2); |
225 | TEST_SEARCH ("(a)($|c$)|d$", "xac", 0, 3); |
226 | TEST_SEARCH ("(a)($|c$)|d$", "xd", 0, 2); |
227 | TEST_SEARCH ("d$|(a)(b$|$)", "xd", 0, 2); |
228 | TEST_SEARCH ("d$|(a)(b$|$)", "xa", 0, 2); |
229 | TEST_SEARCH ("d$|(a)(b$|$)", "xab", 0, 3); |
230 | TEST_SEARCH ("d$|(a)($|c$)", "xd", 0, 2); |
231 | TEST_SEARCH ("d$|(a)($|c$)", "xa", 0, 2); |
232 | TEST_SEARCH ("d$|(a)($|c$)", "xac", 0, 3); |
233 | TEST_SEARCH ("$|(a)(b$|c$)", "x", 0, 1); |
234 | TEST_SEARCH ("$|(a)(b$|c$)", "xab", 0, 3); |
235 | TEST_SEARCH ("$|(a)(b$|c$)", "xac", 0, 3); |
236 | TEST_SEARCH ("d$|(c$|(a$|$))", "x", 0, 1); |
237 | TEST_SEARCH ("d$|(c$|(a$|$))", "xd", 0, 2); |
238 | TEST_SEARCH ("d$|(c$|(a$|$))", "xc", 0, 2); |
239 | TEST_SEARCH ("d$|(c$|(a$|$))", "xa", 0, 2); |
240 | TEST_SEARCH ("d$|(c$|($|b$))", "x", 0, 1); |
241 | TEST_SEARCH ("d$|(c$|($|b$))", "xd", 0, 2); |
242 | TEST_SEARCH ("d$|(c$|($|b$))", "xc", 0, 2); |
243 | TEST_SEARCH ("d$|(c$|($|b$))", "xb", 0, 2); |
244 | TEST_SEARCH ("d$|($|(a$|b$))", "x", 0, 1); |
245 | TEST_SEARCH ("d$|($|(a$|b$))", "xd", 0, 2); |
246 | TEST_SEARCH ("d$|($|(a$|b$))", "xa", 0, 2); |
247 | TEST_SEARCH ("d$|($|(a$|b$))", "xb", 0, 2); |
248 | TEST_SEARCH ("$|(c$|(a$|b$))", "x", 0, 1); |
249 | TEST_SEARCH ("$|(c$|(a$|b$))", "xc", 0, 2); |
250 | TEST_SEARCH ("$|(c$|(a$|b$))", "xa", 0, 2); |
251 | TEST_SEARCH ("$|(c$|(a$|b$))", "xb", 0, 2); |
252 | TEST_SEARCH ("d$|c(a$|$)", "xd", 0, 2); |
253 | TEST_SEARCH ("d$|c(a$|$)", "xc", 0, 2); |
254 | TEST_SEARCH ("d$|c(a$|$)", "xca", 0, 3); |
255 | TEST_SEARCH ("d$|c($|b$)", "xd", 0, 2); |
256 | TEST_SEARCH ("d$|c($|b$)", "xc", 0, 2); |
257 | TEST_SEARCH ("d$|c($|b$)", "xcb", 0, 3); |
258 | TEST_SEARCH ("$|c(a$|b$)", "x", 0, 1); |
259 | TEST_SEARCH ("$|c(a$|b$)", "xca", 0, 3); |
260 | TEST_SEARCH ("$|c(a$|b$)", "xcb", 0, 3); |
261 | TEST_SEARCH ("e(d$|c((a$|$)))", "xed", 0, 3); |
262 | TEST_SEARCH ("e(d$|c((a$|$)))", "xec", 0, 3); |
263 | TEST_SEARCH ("e(d$|c((a$|$)))", "xeca", 0, 3); |
264 | TEST_SEARCH ("e(d$|c(($|b$)))", "xed", 0, 3); |
265 | TEST_SEARCH ("e(d$|c(($|b$)))", "xec", 0, 3); |
266 | TEST_SEARCH ("e(d$|c(($|b$)))", "xecb", 0, 4); |
267 | TEST_SEARCH ("e($|c((a$|b$)))", "xe", 0, 2); |
268 | TEST_SEARCH ("e($|c((a$|b$)))", "xeca", 0, 4); |
269 | TEST_SEARCH ("e($|c((a$|b$)))", "xecb", 0, 4); |
270 | TEST_SEARCH ("ed$|(c((a$|$)))", "xed", 0, 3); |
271 | TEST_SEARCH ("ed$|(c((a$|$)))", "xc", 0, 2); |
272 | TEST_SEARCH ("ed$|(c((a$|$)))", "xca", 0, 3); |
273 | TEST_SEARCH ("ed$|(c(($|b$)))", "xed", 0, 3); |
274 | TEST_SEARCH ("ed$|(c(($|b$)))", "xc", 0, 2); |
275 | TEST_SEARCH ("ed$|(c(($|b$)))", "xcb", 0, 3); |
276 | TEST_SEARCH ("$|(c((a$|b$)))", "x", 0, 1); |
277 | TEST_SEARCH ("$|(c((a$|b$)))", "xca", 0, 3); |
278 | TEST_SEARCH ("$|(c((a$|b$)))", "xcb", 0, 3); |
279 | TEST_SEARCH ("d$|($|(a|b)$)", "x", 0, 1); |
280 | TEST_SEARCH ("d$|($|(a|b)$)", "xa", 0, 2); |
281 | TEST_SEARCH ("d$|($|(a|b)$)", "xb", 0, 2); |
282 | TEST_SEARCH ("$|(c$|(a|b)$)", "x", 0, 1); |
283 | TEST_SEARCH ("$|(c$|(a|b)$)", "xc", 0, 2); |
284 | TEST_SEARCH ("$|(c$|(a|b)$)", "xa", 0, 2); |
285 | TEST_SEARCH ("$|(c$|(a|b)$)", "xb", 0, 2); |
286 | |
287 | re_set_syntax (0); |
288 | test_match ("[^\n]", "a"); |
289 | test_match ("[^a]", "\n"); |
290 | |
291 | TEST_SEARCH ("^a", "b\na", 0, 3); |
292 | TEST_SEARCH ("b$", "b\na", 0, 3); |
293 | |
294 | test_case_fold ("[!-`]", "A"); |
295 | test_case_fold ("[!-`]", "a"); |
296 | |
297 | re_set_syntax (RE_CONTEXT_INDEP_OPS | RE_NO_BK_VBAR | RE_NO_BK_PARENS |
298 | | RE_NO_BK_BRACES | RE_INTERVALS); |
299 | valid_nonposix_pattern ("()^a"); |
300 | valid_nonposix_pattern ("()\\1^a"); |
301 | |
302 | /* Per Cederqvist (cedar@lysator.liu.se) bug. */ |
303 | |
304 | re_set_syntax (RE_SYNTAX_EMACS); |
305 | |
306 | /* One `a' before the \n and 638 a's after it. */ |
307 | test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "a\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
308 | |
309 | /* No a's before the \n and 639 a's after it. */ |
310 | test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
311 | |
312 | /* One `a' before the \n and 639 a's after it. */ |
313 | test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "a\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
314 | |
315 | /* No a's before the \n and 640 a's after it. */ |
316 | test_search_return (0, "\\(.*\\)\n\\(\\(.\\|\n\\)*\\)$", "\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
317 | |
318 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS); |
319 | TEST_SEARCH ("^(^a)", "ab", 0, 2); |
320 | TEST_SEARCH ("(a$)$", "ba", 0, 2); |
321 | test_match ("a|$b", "$b"); |
322 | |
323 | /* Mike's curiosity item. */ |
324 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS); |
325 | test_all_registers ("(foo|foobar)(foo|bar)*\\1(foo|bar)*", |
326 | "foobarfoobar", "", |
327 | 0, 12, 0, 3, 3, 6, 9, 12, -1, -1, -1, -1, -1, -1, -1, -1, |
328 | -1, -1, -1, -1); |
329 | |
330 | /* Another one from Mike. */ |
331 | test_match ("(foo|foobarfoo)(bar)*", "foobarfoo"); |
332 | |
333 | /* And another. */ |
334 | test_match("(foo|foobar)(bar|barfoo)?\\1", "foobarfoobar"); |
335 | |
336 | re_set_syntax (RE_NO_BK_PARENS | RE_INTERVALS | RE_NO_BK_VBAR |
337 | | RE_NO_BK_BRACES); /* xx get new ones from ext.*/ |
338 | test_match ("((a{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)*", "bb"); |
339 | test_all_registers ("((a{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)*", "", "bb", |
340 | 0, 2, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
341 | -1, -1); |
342 | |
343 | test_match ("((a+?*{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)", "b"); |
344 | test_all_registers ("((a+?*{0,}{0,0}()\\3\\b\\B\\<\\>\\`\\')|b)", "", "b", |
345 | 0, 1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
346 | -1, -1); |
347 | |
348 | /* Valid anchoring. */ |
349 | /* See generic_test.c and extended_test.c for more search |
350 | tests. xx Not sure all these tests are represented in the |
351 | search tests. */ |
352 | |
353 | re_set_syntax (RE_NO_BK_PARENS | RE_NO_BK_VBAR); |
354 | valid_nonposix_pattern |
355 | ("(((((((((((((((((((((((((((((((((^a)))))))))))))))))))))))))))))))))"); |
356 | valid_nonposix_pattern |
357 | ("(((((((((((((((((((((((((((((((((a$)))))))))))))))))))))))))))))))))"); |
358 | valid_nonposix_pattern ("\\b\\B\\<\\>\\`\\'^a"); |
359 | valid_nonposix_pattern ("a$\\b\\B\\<\\>\\`\\'"); |
360 | valid_nonposix_pattern ("(^a)"); |
361 | valid_nonposix_pattern ("(a$)"); |
362 | valid_nonposix_pattern ("(^a)b"); |
363 | valid_nonposix_pattern ("b(a$)"); |
364 | valid_nonposix_pattern ("(^a|^b)c"); |
365 | valid_nonposix_pattern ("c(a$|b$)"); |
366 | valid_nonposix_pattern ("(^a|^b)|^c"); |
367 | valid_nonposix_pattern ("(a$|b$)|c$"); |
368 | valid_nonposix_pattern ("^c|(^a|^b)"); |
369 | valid_nonposix_pattern ("c$|(a$|b$)"); |
370 | valid_nonposix_pattern ("(^a|^b)c|^d"); |
371 | valid_nonposix_pattern ("c(a$|b$)|d$"); |
372 | valid_nonposix_pattern ("(((^a|^b))c|^d)e"); |
373 | valid_nonposix_pattern ("(c((a|b))|d)e$"); |
374 | valid_nonposix_pattern ("^d(c|e((a|b)))"); |
375 | valid_nonposix_pattern ("d(c$|e((a$|b$)))"); |
376 | valid_nonposix_pattern ("(((^a|^b))c)|^de"); |
377 | valid_nonposix_pattern ("(((a|b))c$)|de$"); |
378 | |
379 | valid_nonposix_pattern ("((a$)$)$"); |
380 | valid_nonposix_pattern ("^(^(^a))"); |
381 | |
382 | valid_nonposix_pattern ("^de|^(c((a|b)))"); |
383 | valid_nonposix_pattern ("^de|(^c((a|b)))"); |
384 | valid_nonposix_pattern ("de$|(c((a|b)$))"); |
385 | valid_nonposix_pattern ("de$|(c((a|b))$)"); |
386 | valid_nonposix_pattern ("de$|(c((a|b)))$"); |
387 | |
388 | valid_nonposix_pattern ("^a(b|c)|^d"); |
389 | valid_nonposix_pattern ("a(b$|c$)|d$"); |
390 | valid_nonposix_pattern ("^d|^a(b|c)"); |
391 | valid_nonposix_pattern ("d$|a(b$|c$)"); |
392 | valid_nonposix_pattern ("^d|^(b|c)a"); |
393 | valid_nonposix_pattern ("d$|(b|c)a$"); |
394 | valid_nonposix_pattern ("^(a)(b|c)|^d"); |
395 | valid_nonposix_pattern ("(a)(b|c)$|d$"); |
396 | valid_nonposix_pattern ("(^a)(b|c)|^d"); |
397 | valid_nonposix_pattern ("(a)(b$|c$)|d$"); |
398 | valid_nonposix_pattern ("^d|^(b|c)(a)"); |
399 | valid_nonposix_pattern ("d$|(b|c)(a)$"); |
400 | valid_nonposix_pattern ("^d|(^b|^c)(a)"); |
401 | valid_nonposix_pattern ("d$|(b|c)(a$)"); |
402 | valid_nonposix_pattern ("^d|^(a)(b|c)"); |
403 | valid_nonposix_pattern ("^d|(^a)(b|c)"); |
404 | valid_nonposix_pattern ("d$|(a)(b$|c$)"); |
405 | valid_nonposix_pattern ("((^a|^b)|^c)|^d"); |
406 | valid_nonposix_pattern ("d$|(c$|(a$|b$))"); |
407 | |
408 | |
409 | /* Tests shouldn't match. */ |
410 | test_should_match = false; |
411 | |
412 | /* Test that RE_CONTEXT_INVALID_OPS has precedence over |
413 | RE_CONTEXT_INDEP_OPS. */ |
414 | |
415 | re_set_syntax (RE_CONTEXT_INDEP_OPS | RE_CONTEXT_INVALID_OPS |
416 | | RE_NO_BK_VBAR | RE_NO_BK_PARENS |
417 | | RE_NO_BK_BRACES | RE_INTERVALS); |
418 | INVALID_PATTERN ("*"); |
419 | INVALID_PATTERN ("^*"); |
420 | INVALID_PATTERN ("a|*"); |
421 | INVALID_PATTERN ("(*)"); |
422 | |
423 | INVALID_PATTERN ("^+"); |
424 | INVALID_PATTERN ("+"); |
425 | INVALID_PATTERN ("a|+"); |
426 | INVALID_PATTERN ("(+)"); |
427 | |
428 | INVALID_PATTERN ("^?"); |
429 | INVALID_PATTERN ("?"); |
430 | INVALID_PATTERN ("a|?"); |
431 | INVALID_PATTERN ("(?)"); |
432 | |
433 | INVALID_PATTERN ("^{1}"); |
434 | INVALID_PATTERN ("{1}"); |
435 | INVALID_PATTERN ("a|{1}"); |
436 | INVALID_PATTERN ("({1})"); |
437 | |
438 | #if 0 |
439 | /* No longer have this syntax option -- POSIX says empty alternatives |
440 | are undefined as of draft 11.2. */ |
441 | |
442 | /* You can't have empty alternatives if RE_NO_EMPTY_ALTS is set. */ |
443 | |
444 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS | RE_NO_EMPTY_ALTS); |
445 | |
446 | INVALID_PATTERN ("|"); |
447 | INVALID_PATTERN ("^|a"); |
448 | INVALID_PATTERN ("a|"); |
449 | INVALID_PATTERN ("a||"); |
450 | INVALID_PATTERN ("a||b"); |
451 | INVALID_PATTERN ("(|a)"); |
452 | INVALID_PATTERN ("(a|)"); |
453 | INVALID_PATTERN ("(a|)"); |
454 | |
455 | |
456 | /* Test above with `\(' and `\)'. */ |
457 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_EMPTY_ALTS); |
458 | INVALID_PATTERN ("\\(|a\\)"); |
459 | INVALID_PATTERN ("\\(a|\\)"); |
460 | |
461 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS | RE_NO_EMPTY_ALTS); |
462 | INVALID_PATTERN ("(|)()$|d$"); |
463 | #endif |
464 | |
465 | /* Test grouping. */ |
466 | test_match ("()", "a"); |
467 | |
468 | /* Test backslashed intervals that are CONTEXTly invalid if have |
469 | nothing on which to operate. */ |
470 | |
471 | re_set_syntax (RE_INTERVALS | RE_CONTEXT_INVALID_OPS); |
472 | INVALID_PATTERN ("\\{1\\}"); |
473 | |
474 | re_set_syntax (0); |
475 | test_match ("z-a", "a"); |
476 | |
477 | re_set_syntax (RE_BK_PLUS_QM); |
478 | INVALID_PATTERN ("a*\\"); |
479 | |
480 | re_set_syntax (0); |
481 | INVALID_PATTERN ("a*\\"); |
482 | |
483 | re_set_syntax (RE_BACKSLASH_ESCAPE_IN_LISTS); |
484 | INVALID_PATTERN ("[\\"); |
485 | |
486 | #if 0 |
487 | /* Empty groups are always ok now. (13 Sep 92) */ |
488 | re_set_syntax (RE_NO_BK_VBAR | RE_NO_BK_PARENS | RE_NO_EMPTY_GROUPS); |
489 | INVALID_PATTERN ("(|)()$|d$"); |
490 | #endif |
491 | |
492 | printf ("\nFinished non-POSIX tests.\n"); |
493 | } |
494 | |
495 | |
496 | \f |
497 | /* |
498 | Local variables: |
499 | make-backup-files: t |
500 | version-control: t |
501 | trim-versions-without-asking: nil |
502 | End: |
503 | */ |