1 /*************************************************
2 * Perl-Compatible Regular Expressions *
3 *************************************************/
5 /* PCRE is a library of functions to support regular expressions whose syntax
6 and semantics are as close as possible to those of the Perl 5 language.
8 Written by Philip Hazel
9 Original API code Copyright (c) 1997-2012 University of Cambridge
10 New API code Copyright (c) 2016 University of Cambridge
12 -----------------------------------------------------------------------------
13 Redistribution and use in source and binary forms, with or without
14 modification, are permitted provided that the following conditions are met:
16 * Redistributions of source code must retain the above copyright notice,
17 this list of conditions and the following disclaimer.
19 * Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in the
21 documentation and/or other materials provided with the distribution.
23 * Neither the name of the University of Cambridge nor the names of its
24 contributors may be used to endorse or promote products derived from
25 this software without specific prior written permission.
27 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 POSSIBILITY OF SUCH DAMAGE.
38 -----------------------------------------------------------------------------
48 #define PCRE2_CODE_UNIT_WIDTH 0
53 \xe6\x92\xad = 0x64ad = 25773 (kanji)
54 Non-letter characters:
55 \xc2\xa1 = 0xa1 = (Inverted Exclamation Mark)
56 \xf3\xa9\xb7\x80 = 0xe9dc0 = 957888
57 \xed\xa0\x80 = 55296 = 0xd800 (Invalid UTF character)
58 \xed\xb0\x80 = 56320 = 0xdc00 (Invalid UTF character)
60 \xc2\x85 = 0x85 = 133 (NExt Line = NEL)
61 \xe2\x80\xa8 = 0x2028 = 8232 (Line Separator)
63 \xc3\xa9 = 0xe9 = 233 (e')
64 \xc3\x89 = 0xc9 = 201 (E')
65 \xc3\xa1 = 0xe1 = 225 (a')
66 \xc3\x81 = 0xc1 = 193 (A')
69 \xc5\xbf = 0x17f = 383 (long S)
70 \xc8\xba = 0x23a = 570
71 \xe2\xb1\xa5 = 0x2c65 = 11365
72 \xe1\xbd\xb8 = 0x1f78 = 8056
73 \xe1\xbf\xb8 = 0x1ff8 = 8184
74 \xf0\x90\x90\x80 = 0x10400 = 66560
75 \xf0\x90\x90\xa8 = 0x10428 = 66600
76 \xc7\x84 = 0x1c4 = 452
77 \xc7\x85 = 0x1c5 = 453
78 \xc7\x86 = 0x1c6 = 454
80 ucp_Armenian - \x{531}-\x{556} -> \x{561}-\x{586}
81 ucp_Coptic - \x{2c80}-\x{2ce3} -> caseless: XOR 0x1
82 ucp_Latin - \x{ff21}-\x{ff3a} -> \x{ff41]-\x{ff5a}
85 \xcc\x8d = 0x30d = 781
87 \xc2\x80 = 0x80 = 128 (lowest 2 byte character)
88 \xdf\xbf = 0x7ff = 2047 (highest 2 byte character)
89 \xe0\xa0\x80 = 0x800 = 2048 (lowest 2 byte character)
90 \xef\xbf\xbf = 0xffff = 65535 (highest 3 byte character)
91 \xf0\x90\x80\x80 = 0x10000 = 65536 (lowest 4 byte character)
92 \xf4\x8f\xbf\xbf = 0x10ffff = 1114111 (highest allowed utf character)
95 static int regression_tests(void);
100 #if defined SUPPORT_PCRE2_8
101 pcre2_config_8(PCRE2_CONFIG_JIT, &jit);
102 #elif defined SUPPORT_PCRE2_16
103 pcre2_config_16(PCRE2_CONFIG_JIT, &jit);
104 #elif defined SUPPORT_PCRE2_32
105 pcre2_config_32(PCRE2_CONFIG_JIT, &jit);
108 printf("JIT must be enabled to run pcre_jit_test\n");
111 return regression_tests();
114 /* --------------------------------------------------------------------------------------- */
116 #if !(defined SUPPORT_PCRE2_8) && !(defined SUPPORT_PCRE2_16) && !(defined SUPPORT_PCRE2_32)
117 #error SUPPORT_PCRE2_8 or SUPPORT_PCRE2_16 or SUPPORT_PCRE2_32 must be defined
120 #define MU (PCRE2_MULTILINE | PCRE2_UTF)
121 #define MUP (PCRE2_MULTILINE | PCRE2_UTF | PCRE2_UCP)
122 #define CMU (PCRE2_CASELESS | PCRE2_MULTILINE | PCRE2_UTF)
123 #define CMUP (PCRE2_CASELESS | PCRE2_MULTILINE | PCRE2_UTF | PCRE2_UCP)
124 #define M (PCRE2_MULTILINE)
125 #define MP (PCRE2_MULTILINE | PCRE2_UCP)
126 #define U (PCRE2_UTF)
127 #define CM (PCRE2_CASELESS | PCRE2_MULTILINE)
129 #define BSR(x) ((x) << 16)
130 #define A PCRE2_NEWLINE_ANYCRLF
132 #define GET_NEWLINE(x) ((x) & 0xffff)
133 #define GET_BSR(x) ((x) >> 16)
135 #define OFFSET_MASK 0x00ffff
136 #define F_NO8 0x010000
137 #define F_NO16 0x020000
138 #define F_NO32 0x020000
139 #define F_NOMATCH 0x040000
140 #define F_DIFF 0x080000
141 #define F_FORCECONV 0x100000
142 #define F_PROPERTY 0x200000
144 struct regression_test_case {
153 static struct regression_test_case regression_test_cases[] = {
154 /* Constant strings. */
155 { MU, A, 0, 0, "AbC", "AbAbC" },
156 { MU, A, 0, 0, "ACCEPT", "AACACCACCEACCEPACCEPTACCEPTT" },
157 { CMU, A, 0, 0, "aA#\xc3\xa9\xc3\x81", "aA#Aa#\xc3\x89\xc3\xa1" },
158 { M, A, 0, 0, "[^a]", "aAbB" },
159 { CM, A, 0, 0, "[^m]", "mMnN" },
160 { M, A, 0, 0, "a[^b][^#]", "abacd" },
161 { CM, A, 0, 0, "A[^B][^E]", "abacd" },
162 { CMU, A, 0, 0, "[^x][^#]", "XxBll" },
163 { MU, A, 0, 0, "[^a]", "aaa\xc3\xa1#Ab" },
164 { CMU, A, 0, 0, "[^A]", "aA\xe6\x92\xad" },
165 { MU, A, 0, 0, "\\W(\\W)?\\w", "\r\n+bc" },
166 { MU, A, 0, 0, "\\W(\\W)?\\w", "\n\r+bc" },
167 { MU, A, 0, 0, "\\W(\\W)?\\w", "\r\r+bc" },
168 { MU, A, 0, 0, "\\W(\\W)?\\w", "\n\n+bc" },
169 { MU, A, 0, 0, "[axd]", "sAXd" },
170 { CMU, A, 0, 0, "[axd]", "sAXd" },
171 { CMU, A, 0, 0 | F_NOMATCH, "[^axd]", "DxA" },
172 { MU, A, 0, 0, "[a-dA-C]", "\xe6\x92\xad\xc3\xa9.B" },
173 { MU, A, 0, 0, "[^a-dA-C]", "\xe6\x92\xad\xc3\xa9" },
174 { CMU, A, 0, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
175 { MU, A, 0, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
176 { MU, A, 0, 0, "[^a]", "\xc2\x80[]" },
177 { CMU, A, 0, 0, "\xf0\x90\x90\xa7", "\xf0\x90\x91\x8f" },
178 { CM, A, 0, 0, "1a2b3c4", "1a2B3c51A2B3C4" },
179 { PCRE2_CASELESS, 0, 0, 0, "\xff#a", "\xff#\xff\xfe##\xff#A" },
180 { PCRE2_CASELESS, 0, 0, 0, "\xfe", "\xff\xfc#\xfe\xfe" },
181 { PCRE2_CASELESS, 0, 0, 0, "a1", "Aa1" },
182 #ifndef NEVER_BACKSLASH_C
183 { M, A, 0, 0, "\\Ca", "cda" },
184 { CM, A, 0, 0, "\\Ca", "CDA" },
185 { M, A, 0, 0 | F_NOMATCH, "\\Cx", "cda" },
186 { CM, A, 0, 0 | F_NOMATCH, "\\Cx", "CDA" },
188 { CMUP, A, 0, 0, "\xf0\x90\x90\x80\xf0\x90\x90\xa8", "\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
189 { CMUP, A, 0, 0, "\xf0\x90\x90\x80{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
190 { CMUP, A, 0, 0, "\xf0\x90\x90\xa8{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
191 { CMUP, A, 0, 0, "\xe1\xbd\xb8\xe1\xbf\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
192 { M, A, 0, 0, "[3-57-9]", "5" },
195 { MU, A, 0, 0, "\\b[^A]", "A_B#" },
196 { M, A, 0, 0 | F_NOMATCH, "\\b\\W", "\n*" },
197 { MU, A, 0, 0, "\\B[^,]\\b[^s]\\b", "#X" },
198 { MP, A, 0, 0, "\\B", "_\xa1" },
199 { MP, A, 0, 0 | F_PROPERTY, "\\b_\\b[,A]\\B", "_," },
200 { MUP, A, 0, 0, "\\b", "\xe6\x92\xad!" },
201 { MUP, A, 0, 0, "\\B", "_\xc2\xa1\xc3\xa1\xc2\x85" },
202 { MUP, A, 0, 0, "\\b[^A]\\B[^c]\\b[^_]\\B", "_\xc3\xa1\xe2\x80\xa8" },
203 { MUP, A, 0, 0, "\\b\\w+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
204 { MU, A, 0, 0 | F_NOMATCH, "\\b.", "\xcd\xbe" },
205 { CMUP, A, 0, 0, "\\By", "\xf0\x90\x90\xa8y" },
206 { M, A, 0, 0 | F_NOMATCH, "\\R^", "\n" },
207 { M, A, 0, 1 | F_NOMATCH, "^", "\n" },
208 { 0, 0, 0, 0, "^ab", "ab" },
209 { 0, 0, 0, 0 | F_NOMATCH, "^ab", "aab" },
210 { M, PCRE2_NEWLINE_CRLF, 0, 0, "^a", "\r\raa\n\naa\r\naa" },
211 { MU, A, 0, 0, "^-", "\xe2\x80\xa8--\xc2\x85-\r\n-" },
212 { M, PCRE2_NEWLINE_ANY, 0, 0, "^-", "a--b--\x85--" },
213 { MU, PCRE2_NEWLINE_ANY, 0, 0, "^-", "a--\xe2\x80\xa8--" },
214 { MU, PCRE2_NEWLINE_ANY, 0, 0, "^-", "a--\xc2\x85--" },
215 { 0, 0, 0, 0, "ab$", "ab" },
216 { 0, 0, 0, 0 | F_NOMATCH, "ab$", "abab\n\n" },
217 { PCRE2_DOLLAR_ENDONLY, 0, 0, 0 | F_NOMATCH, "ab$", "abab\r\n" },
218 { M, PCRE2_NEWLINE_CRLF, 0, 0, "a$", "\r\raa\n\naa\r\naa" },
219 { M, PCRE2_NEWLINE_ANY, 0, 0, "a$", "aaa" },
220 { MU, PCRE2_NEWLINE_ANYCRLF, 0, 0, "#$", "#\xc2\x85###\r#" },
221 { MU, PCRE2_NEWLINE_ANY, 0, 0, "#$", "#\xe2\x80\xa9" },
222 { 0, PCRE2_NEWLINE_ANY, PCRE2_NOTBOL, 0 | F_NOMATCH, "^a", "aa\naa" },
223 { M, PCRE2_NEWLINE_ANY, PCRE2_NOTBOL, 0, "^a", "aa\naa" },
224 { 0, PCRE2_NEWLINE_ANY, PCRE2_NOTEOL, 0 | F_NOMATCH, "a$", "aa\naa" },
225 { 0, PCRE2_NEWLINE_ANY, PCRE2_NOTEOL, 0 | F_NOMATCH, "a$", "aa\r\n" },
226 { U | PCRE2_DOLLAR_ENDONLY, PCRE2_NEWLINE_ANY, 0, 0 | F_PROPERTY, "\\p{Any}{2,}$", "aa\r\n" },
227 { M, PCRE2_NEWLINE_ANY, PCRE2_NOTEOL, 0, "a$", "aa\naa" },
228 { 0, PCRE2_NEWLINE_CR, 0, 0, ".\\Z", "aaa" },
229 { U, PCRE2_NEWLINE_CR, 0, 0, "a\\Z", "aaa\r" },
230 { 0, PCRE2_NEWLINE_CR, 0, 0, ".\\Z", "aaa\n" },
231 { 0, PCRE2_NEWLINE_CRLF, 0, 0, ".\\Z", "aaa\r" },
232 { U, PCRE2_NEWLINE_CRLF, 0, 0, ".\\Z", "aaa\n" },
233 { 0, PCRE2_NEWLINE_CRLF, 0, 0, ".\\Z", "aaa\r\n" },
234 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa" },
235 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r" },
236 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\n" },
237 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r\n" },
238 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\xe2\x80\xa8" },
239 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa" },
240 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r" },
241 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\n" },
242 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r\n" },
243 { U, PCRE2_NEWLINE_ANY, 0, 0, ".\\Z", "aaa\xc2\x85" },
244 { U, PCRE2_NEWLINE_ANY, 0, 0, ".\\Z", "aaa\xe2\x80\xa8" },
245 { M, A, 0, 0, "\\Aa", "aaa" },
246 { M, A, 0, 1 | F_NOMATCH, "\\Aa", "aaa" },
247 { M, A, 0, 1, "\\Ga", "aaa" },
248 { M, A, 0, 1 | F_NOMATCH, "\\Ga", "aba" },
249 { M, A, 0, 0, "a\\z", "aaa" },
250 { M, A, 0, 0 | F_NOMATCH, "a\\z", "aab" },
252 /* Brackets and alternatives. */
253 { MU, A, 0, 0, "(ab|bb|cd)", "bacde" },
254 { MU, A, 0, 0, "(?:ab|a)(bc|c)", "ababc" },
255 { MU, A, 0, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" },
256 { CMU, A, 0, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" },
257 { MU, A, 0, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" },
258 { MU, A, 0, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" },
259 { MU, A, 0, 0, "\xc7\x82|\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
260 { MU, A, 0, 0, "=\xc7\x82|#\xc6\x82", "\xf1\x83\x82\x82=\xc7\x82\xc7\x83" },
261 { MU, A, 0, 0, "\xc7\x82\xc7\x83|\xc6\x82\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
262 { MU, A, 0, 0, "\xc6\x82\xc6\x82|\xc7\x83\xc7\x83|\xc8\x84\xc8\x84", "\xf1\x83\x82\x82\xc8\x84\xc8\x84" },
263 { U, A, 0, 0, "\xe1\x81\x80|\xe2\x82\x80|\xe4\x84\x80", "\xdf\xbf\xc2\x80\xe4\x84\x80" },
264 { U, A, 0, 0, "(?:\xe1\x81\x80|\xe2\x82\x80|\xe4\x84\x80)#", "\xdf\xbf\xc2\x80#\xe4\x84\x80#" },
266 /* Greedy and non-greedy ? operators. */
267 { MU, A, 0, 0, "(?:a)?a", "laab" },
268 { CMU, A, 0, 0, "(A)?A", "llaab" },
269 { MU, A, 0, 0, "(a)?\?a", "aab" }, /* ?? is the prefix of trygraphs in GCC. */
270 { MU, A, 0, 0, "(a)?a", "manm" },
271 { CMU, A, 0, 0, "(a|b)?\?d((?:e)?)", "ABABdx" },
272 { MU, A, 0, 0, "(a|b)?\?d((?:e)?)", "abcde" },
273 { MU, A, 0, 0, "((?:ab)?\?g|b(?:g(nn|d)?\?)?)?\?(?:n)?m", "abgnbgnnbgdnmm" },
275 /* Greedy and non-greedy + operators */
276 { MU, A, 0, 0, "(aa)+aa", "aaaaaaa" },
277 { MU, A, 0, 0, "(aa)+?aa", "aaaaaaa" },
278 { MU, A, 0, 0, "(?:aba|ab|a)+l", "ababamababal" },
279 { MU, A, 0, 0, "(?:aba|ab|a)+?l", "ababamababal" },
280 { MU, A, 0, 0, "(a(?:bc|cb|b|c)+?|ss)+e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
281 { MU, A, 0, 0, "(a(?:bc|cb|b|c)+|ss)+?e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
282 { MU, A, 0, 0, "(?:(b(c)+?)+)?\?(?:(bc)+|(cb)+)+(?:m)+", "bccbcccbcbccbcbPbccbcccbcbccbcbmmn" },
284 /* Greedy and non-greedy * operators */
285 { CMU, A, 0, 0, "(?:AA)*AB", "aaaaaaamaaaaaaab" },
286 { MU, A, 0, 0, "(?:aa)*?ab", "aaaaaaamaaaaaaab" },
287 { MU, A, 0, 0, "(aa|ab)*ab", "aaabaaab" },
288 { CMU, A, 0, 0, "(aa|Ab)*?aB", "aaabaaab" },
289 { MU, A, 0, 0, "(a|b)*(?:a)*(?:b)*m", "abbbaaababanabbbaaababamm" },
290 { MU, A, 0, 0, "(a|b)*?(?:a)*?(?:b)*?m", "abbbaaababanabbbaaababamm" },
291 { M, A, 0, 0, "a(a(\\1*)a|(b)b+){0}a", "aa" },
292 { M, A, 0, 0, "((?:a|)*){0}a", "a" },
294 /* Combining ? + * operators */
295 { MU, A, 0, 0, "((bm)+)?\?(?:a)*(bm)+n|((am)+?)?(?:a)+(am)*n", "bmbmabmamaaamambmaman" },
296 { MU, A, 0, 0, "(((ab)?cd)*ef)+g", "abcdcdefcdefefmabcdcdefcdefefgg" },
297 { MU, A, 0, 0, "(((ab)?\?cd)*?ef)+?g", "abcdcdefcdefefmabcdcdefcdefefgg" },
298 { MU, A, 0, 0, "(?:(ab)?c|(?:ab)+?d)*g", "ababcdccababddg" },
299 { MU, A, 0, 0, "(?:(?:ab)?\?c|(ab)+d)*?g", "ababcdccababddg" },
301 /* Single character iterators. */
302 { MU, A, 0, 0, "(a+aab)+aaaab", "aaaabcaaaabaabcaabcaaabaaaab" },
303 { MU, A, 0, 0, "(a*a*aab)+x", "aaaaabaabaaabmaabx" },
304 { MU, A, 0, 0, "(a*?(b|ab)a*?)+x", "aaaabcxbbaabaacbaaabaabax" },
305 { MU, A, 0, 0, "(a+(ab|ad)a+)+x", "aaabaaaadaabaaabaaaadaaax" },
306 { MU, A, 0, 0, "(a?(a)a?)+(aaa)", "abaaabaaaaaaaa" },
307 { MU, A, 0, 0, "(a?\?(a)a?\?)+(b)", "aaaacaaacaacacbaaab" },
308 { MU, A, 0, 0, "(a{0,4}(b))+d", "aaaaaabaabcaaaaabaaaaabd" },
309 { MU, A, 0, 0, "(a{0,4}?[^b])+d+(a{0,4}[^b])d+", "aaaaadaaaacaadddaaddd" },
310 { MU, A, 0, 0, "(ba{2})+c", "baabaaabacbaabaac" },
311 { MU, A, 0, 0, "(a*+bc++)+", "aaabbcaaabcccab" },
312 { MU, A, 0, 0, "(a?+[^b])+", "babaacacb" },
313 { MU, A, 0, 0, "(a{0,3}+b)(a{0,3}+b)(a{0,3}+)[^c]", "abaabaaacbaabaaaac" },
314 { CMU, A, 0, 0, "([a-c]+[d-f]+?)+?g", "aBdacdehAbDaFgA" },
315 { CMU, A, 0, 0, "[c-f]+k", "DemmFke" },
316 { MU, A, 0, 0, "([DGH]{0,4}M)+", "GGDGHDGMMHMDHHGHM" },
317 { MU, A, 0, 0, "([a-c]{4,}s)+", "abasabbasbbaabsbba" },
318 { CMU, A, 0, 0, "[ace]{3,7}", "AcbDAcEEcEd" },
319 { CMU, A, 0, 0, "[ace]{3,7}?", "AcbDAcEEcEd" },
320 { CMU, A, 0, 0, "[ace]{3,}", "AcbDAcEEcEd" },
321 { CMU, A, 0, 0, "[ace]{3,}?", "AcbDAcEEcEd" },
322 { MU, A, 0, 0, "[ckl]{2,}?g", "cdkkmlglglkcg" },
323 { CMU, A, 0, 0, "[ace]{5}?", "AcCebDAcEEcEd" },
324 { MU, A, 0, 0, "([AbC]{3,5}?d)+", "BACaAbbAEAACCbdCCbdCCAAbb" },
325 { MU, A, 0, 0, "([^ab]{0,}s){2}", "abaabcdsABamsDDs" },
326 { MU, A, 0, 0, "\\b\\w+\\B", "x,a_cd" },
327 { MUP, A, 0, 0, "\\b[^\xc2\xa1]+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
328 { CMU, A, 0, 0, "[^b]+(a*)([^c]?d{3})", "aaaaddd" },
329 { CMUP, A, 0, 0, "\xe1\xbd\xb8{2}", "\xe1\xbf\xb8#\xe1\xbf\xb8\xe1\xbd\xb8" },
330 { CMU, A, 0, 0, "[^\xf0\x90\x90\x80]{2,4}@", "\xf0\x90\x90\xa8\xf0\x90\x90\x80###\xf0\x90\x90\x80@@@" },
331 { CMU, A, 0, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
332 { MU, A, 0, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
333 { MU, A, 0, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" },
334 { MU, A, 0, 0, "\\d+123", "987654321,01234" },
335 { MU, A, 0, 0, "abcd*|\\w+xy", "aaaaa,abxyz" },
336 { MU, A, 0, 0, "(?:abc|((?:amc|\\b\\w*xy)))", "aaaaa,abxyz" },
337 { MU, A, 0, 0, "a(?R)|([a-z]++)#", ".abcd.abcd#."},
338 { MU, A, 0, 0, "a(?R)|([a-z]++)#", ".abcd.mbcd#."},
339 { MU, A, 0, 0, ".[ab]*.", "xx" },
340 { MU, A, 0, 0, ".[ab]*a", "xxa" },
341 { MU, A, 0, 0, ".[ab]?.", "xx" },
343 /* Bracket repeats with limit. */
344 { MU, A, 0, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
345 { MU, A, 0, 0, "(?:ab|abab){1,5}M", "abababababababababababM" },
346 { MU, A, 0, 0, "(?>ab|abab){1,5}M", "abababababababababababM" },
347 { MU, A, 0, 0, "(?:ab|abab){1,5}?M", "abababababababababababM" },
348 { MU, A, 0, 0, "(?>ab|abab){1,5}?M", "abababababababababababM" },
349 { MU, A, 0, 0, "(?:(ab){1,4}?){1,3}?M", "abababababababababababababM" },
350 { MU, A, 0, 0, "(?:(ab){1,4}){1,3}abababababababababababM", "ababababababababababababM" },
351 { MU, A, 0, 0 | F_NOMATCH, "(?:(ab){1,4}){1,3}abababababababababababM", "abababababababababababM" },
352 { MU, A, 0, 0, "(ab){4,6}?M", "abababababababM" },
354 /* Basic character sets. */
355 { MU, A, 0, 0, "(?:\\s)+(?:\\S)+", "ab \t\xc3\xa9\xe6\x92\xad " },
356 { MU, A, 0, 0, "(\\w)*(k)(\\W)?\?", "abcdef abck11" },
357 { MU, A, 0, 0, "\\((\\d)+\\)\\D", "a() (83 (8)2 (9)ab" },
358 { MU, A, 0, 0, "\\w(\\s|(?:\\d)*,)+\\w\\wb", "a 5, 4,, bb 5, 4,, aab" },
359 { MU, A, 0, 0, "(\\v+)(\\V+)", "\x0e\xc2\x85\xe2\x80\xa8\x0b\x09\xe2\x80\xa9" },
360 { MU, A, 0, 0, "(\\h+)(\\H+)", "\xe2\x80\xa8\xe2\x80\x80\x20\xe2\x80\x8a\xe2\x81\x9f\xe3\x80\x80\x09\x20\xc2\xa0\x0a" },
361 { MU, A, 0, 0, "x[bcef]+", "xaxdxecbfg" },
362 { MU, A, 0, 0, "x[bcdghij]+", "xaxexfxdgbjk" },
363 { MU, A, 0, 0, "x[^befg]+", "xbxexacdhg" },
364 { MU, A, 0, 0, "x[^bcdl]+", "xlxbxaekmd" },
365 { MU, A, 0, 0, "x[^bcdghi]+", "xbxdxgxaefji" },
366 { MU, A, 0, 0, "x[B-Fb-f]+", "xaxAxgxbfBFG" },
367 { CMU, A, 0, 0, "\\x{e9}+", "#\xf0\x90\x90\xa8\xc3\xa8\xc3\xa9\xc3\x89\xc3\x88" },
368 { CMU, A, 0, 0, "[^\\x{e9}]+", "\xc3\xa9#\xf0\x90\x90\xa8\xc3\xa8\xc3\x88\xc3\x89" },
369 { MU, A, 0, 0, "[\\x02\\x7e]+", "\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x02\x7e\x7f" },
370 { MU, A, 0, 0, "[^\\x02\\x7e]+", "\x02\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x7f\x7e" },
371 { MU, A, 0, 0, "[\\x{81}-\\x{7fe}]+", "#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xc2\x81\xdf\xbe\xdf\xbf" },
372 { MU, A, 0, 0, "[^\\x{81}-\\x{7fe}]+", "\xc2\x81#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xdf\xbf\xdf\xbe" },
373 { MU, A, 0, 0, "[\\x{801}-\\x{fffe}]+", "#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xe0\xa0\x81\xef\xbf\xbe\xef\xbf\xbf" },
374 { MU, A, 0, 0, "[^\\x{801}-\\x{fffe}]+", "\xe0\xa0\x81#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xef\xbf\xbf\xef\xbf\xbe" },
375 { MU, A, 0, 0, "[\\x{10001}-\\x{10fffe}]+", "#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf0\x90\x80\x81\xf4\x8f\xbf\xbe\xf4\x8f\xbf\xbf" },
376 { MU, A, 0, 0, "[^\\x{10001}-\\x{10fffe}]+", "\xf0\x90\x80\x81#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbe" },
378 /* Unicode properties. */
379 { MUP, A, 0, 0, "[1-5\xc3\xa9\\w]", "\xc3\xa1_" },
380 { MUP, A, 0, 0 | F_PROPERTY, "[\xc3\x81\\p{Ll}]", "A_\xc3\x89\xc3\xa1" },
381 { MUP, A, 0, 0, "[\\Wd-h_x-z]+", "a\xc2\xa1#_yhzdxi" },
382 { MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}]", "abc" },
383 { MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}]", "abc" },
384 { MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}\xc3\xa1-\xc3\xa8]", "abc" },
385 { MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}\xc3\xa1-\xc3\xa8]", "abc" },
386 { MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
387 { MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
388 { MUP, A, 0, 0 | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
389 { MUP, A, 0, 0 | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
390 { MUP, A, 0, 0, "[b-\xc3\xa9\\s]", "a\xc\xe6\x92\xad" },
391 { CMUP, A, 0, 0, "[\xc2\x85-\xc2\x89\xc3\x89]", "\xc2\x84\xc3\xa9" },
392 { MUP, A, 0, 0, "[^b-d^&\\s]{3,}", "db^ !a\xe2\x80\xa8_ae" },
393 { MUP, A, 0, 0 | F_PROPERTY, "[^\\S\\P{Any}][\\sN]{1,3}[\\P{N}]{4}", "\xe2\x80\xaa\xa N\x9\xc3\xa9_0" },
394 { MU, A, 0, 0 | F_PROPERTY, "[^\\P{L}\x9!D-F\xa]{2,3}", "\x9,.DF\xa.CG\xc3\x81" },
395 { CMUP, A, 0, 0, "[\xc3\xa1-\xc3\xa9_\xe2\x80\xa0-\xe2\x80\xaf]{1,5}[^\xe2\x80\xa0-\xe2\x80\xaf]", "\xc2\xa1\xc3\x89\xc3\x89\xe2\x80\xaf_\xe2\x80\xa0" },
396 { MUP, A, 0, 0 | F_PROPERTY, "[\xc3\xa2-\xc3\xa6\xc3\x81-\xc3\x84\xe2\x80\xa8-\xe2\x80\xa9\xe6\x92\xad\\p{Zs}]{2,}", "\xe2\x80\xa7\xe2\x80\xa9\xe6\x92\xad \xe6\x92\xae" },
397 { MUP, A, 0, 0 | F_PROPERTY, "[\\P{L&}]{2}[^\xc2\x85-\xc2\x89\\p{Ll}\\p{Lu}]{2}", "\xc3\xa9\xe6\x92\xad.a\xe6\x92\xad|\xc2\x8a#" },
398 { PCRE2_UCP, 0, 0, 0 | F_PROPERTY, "[a-b\\s]{2,5}[^a]", "AB baaa" },
400 /* Possible empty brackets. */
401 { MU, A, 0, 0, "(?:|ab||bc|a)+d", "abcxabcabd" },
402 { MU, A, 0, 0, "(|ab||bc|a)+d", "abcxabcabd" },
403 { MU, A, 0, 0, "(?:|ab||bc|a)*d", "abcxabcabd" },
404 { MU, A, 0, 0, "(|ab||bc|a)*d", "abcxabcabd" },
405 { MU, A, 0, 0, "(?:|ab||bc|a)+?d", "abcxabcabd" },
406 { MU, A, 0, 0, "(|ab||bc|a)+?d", "abcxabcabd" },
407 { MU, A, 0, 0, "(?:|ab||bc|a)*?d", "abcxabcabd" },
408 { MU, A, 0, 0, "(|ab||bc|a)*?d", "abcxabcabd" },
409 { MU, A, 0, 0, "(((a)*?|(?:ba)+)+?|(?:|c|ca)*)*m", "abaacaccabacabalabaacaccabacabamm" },
410 { MU, A, 0, 0, "(?:((?:a)*|(ba)+?)+|(|c|ca)*?)*?m", "abaacaccabacabalabaacaccabacabamm" },
413 { MU, A, 0, 3, "(\\d|(?:\\w)*\\w)+", "0ac01Hb" },
414 { MU, A, 0, 4 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
415 { MU, A, 0, 2 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
416 { MU, A, 0, 1, "(\\w\\W\\w)+", "ab#d" },
419 { M, PCRE2_NEWLINE_CRLF, 0, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
420 { M, PCRE2_NEWLINE_CR, 0, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
421 { M, PCRE2_NEWLINE_CRLF, 0, 0, "\\W{1,3}[^#]", "\r\n##...." },
422 { MU, A, PCRE2_NO_UTF_CHECK, 1, "^.a", "\n\x80\nxa" },
423 { MU, A, 0, 1, "^", "\r\n" },
424 { M, PCRE2_NEWLINE_CRLF, 0, 1 | F_NOMATCH, "^", "\r\n" },
425 { M, PCRE2_NEWLINE_CRLF, 0, 1, "^", "\r\na" },
427 /* Any character except newline or any newline. */
428 { 0, PCRE2_NEWLINE_CRLF, 0, 0, ".", "\r" },
429 { U, PCRE2_NEWLINE_CRLF, 0, 0, ".(.).", "a\xc3\xa1\r\n\n\r\r" },
430 { 0, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
431 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
432 { U, PCRE2_NEWLINE_ANY, 0, 0, "(.).", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa9$de" },
433 { U, PCRE2_NEWLINE_ANYCRLF, 0, 0 | F_NOMATCH, ".(.).", "\xe2\x80\xa8\nb\r" },
434 { 0, PCRE2_NEWLINE_ANY, 0, 0, "(.)(.)", "#\x85#\r#\n#\r\n#\x84" },
435 { U, PCRE2_NEWLINE_ANY, 0, 0, "(.+)#", "#\rMn\xc2\x85#\n###" },
436 { 0, BSR(PCRE2_BSR_ANYCRLF), 0, 0, "\\R", "\r" },
437 { 0, BSR(PCRE2_BSR_ANYCRLF), 0, 0, "\\R", "\x85#\r\n#" },
438 { U, BSR(PCRE2_BSR_UNICODE), 0, 0, "\\R", "ab\xe2\x80\xa8#c" },
439 { U, BSR(PCRE2_BSR_UNICODE), 0, 0, "\\R", "ab\r\nc" },
440 { U, PCRE2_NEWLINE_CRLF | BSR(PCRE2_BSR_UNICODE), 0, 0, "(\\R.)+", "\xc2\x85\r\n#\xe2\x80\xa8\n\r\n\r" },
441 { MU, A, 0, 0 | F_NOMATCH, "\\R+", "ab" },
442 { MU, A, 0, 0, "\\R+", "ab\r\n\r" },
443 { MU, A, 0, 0, "\\R*", "ab\r\n\r" },
444 { MU, A, 0, 0, "\\R*", "\r\n\r" },
445 { MU, A, 0, 0, "\\R{2,4}", "\r\nab\r\r" },
446 { MU, A, 0, 0, "\\R{2,4}", "\r\nab\n\n\n\r\r\r" },
447 { MU, A, 0, 0, "\\R{2,}", "\r\nab\n\n\n\r\r\r" },
448 { MU, A, 0, 0, "\\R{0,3}", "\r\n\r\n\r\n\r\n\r\n" },
449 { MU, A, 0, 0 | F_NOMATCH, "\\R+\\R\\R", "\r\n\r\n" },
450 { MU, A, 0, 0, "\\R+\\R\\R", "\r\r\r" },
451 { MU, A, 0, 0, "\\R*\\R\\R", "\n\r" },
452 { MU, A, 0, 0 | F_NOMATCH, "\\R{2,4}\\R\\R", "\r\r\r" },
453 { MU, A, 0, 0, "\\R{2,4}\\R\\R", "\r\r\r\r" },
455 /* Atomic groups (no fallback from "next" direction). */
456 { MU, A, 0, 0 | F_NOMATCH, "(?>ab)ab", "bab" },
457 { MU, A, 0, 0 | F_NOMATCH, "(?>(ab))ab", "bab" },
458 { MU, A, 0, 0, "(?>ab)+abc(?>de)*def(?>gh)?ghe(?>ij)+?k(?>lm)*?n(?>op)?\?op",
459 "bababcdedefgheijijklmlmnop" },
460 { MU, A, 0, 0, "(?>a(b)+a|(ab)?\?(b))an", "abban" },
461 { MU, A, 0, 0, "(?>ab+a|(?:ab)?\?b)an", "abban" },
462 { MU, A, 0, 0, "((?>ab|ad|)*?)(?>|c)*abad", "abababcababad" },
463 { MU, A, 0, 0, "(?>(aa|b|)*+(?>(##)|###)*d|(aa)(?>(baa)?)m)", "aabaa#####da" },
464 { MU, A, 0, 0, "((?>a|)+?)b", "aaacaaab" },
465 { MU, A, 0, 0, "(?>x|)*$", "aaa" },
466 { MU, A, 0, 0, "(?>(x)|)*$", "aaa" },
467 { MU, A, 0, 0, "(?>x|())*$", "aaa" },
468 { MU, A, 0, 0, "((?>[cxy]a|[a-d])*?)b", "aaa+ aaab" },
469 { MU, A, 0, 0, "((?>[cxy](a)|[a-d])*?)b", "aaa+ aaab" },
470 { MU, A, 0, 0, "(?>((?>(a+))))bab|(?>((?>(a+))))bb", "aaaabaaabaabab" },
471 { MU, A, 0, 0, "(?>(?>a+))bab|(?>(?>a+))bb", "aaaabaaabaabab" },
472 { MU, A, 0, 0, "(?>(a)c|(?>(c)|(a))a)b*?bab", "aaaabaaabaabab" },
473 { MU, A, 0, 0, "(?>ac|(?>c|a)a)b*?bab", "aaaabaaabaabab" },
474 { MU, A, 0, 0, "(?>(b)b|(a))*b(?>(c)|d)?x", "ababcaaabdbx" },
475 { MU, A, 0, 0, "(?>bb|a)*b(?>c|d)?x", "ababcaaabdbx" },
476 { MU, A, 0, 0, "(?>(bb)|a)*b(?>c|(d))?x", "ababcaaabdbx" },
477 { MU, A, 0, 0, "(?>(a))*?(?>(a))+?(?>(a))??x", "aaaaaacccaaaaabax" },
478 { MU, A, 0, 0, "(?>a)*?(?>a)+?(?>a)??x", "aaaaaacccaaaaabax" },
479 { MU, A, 0, 0, "(?>(a)|)*?(?>(a)|)+?(?>(a)|)??x", "aaaaaacccaaaaabax" },
480 { MU, A, 0, 0, "(?>a|)*?(?>a|)+?(?>a|)??x", "aaaaaacccaaaaabax" },
481 { MU, A, 0, 0, "(?>a(?>(a{0,2}))*?b|aac)+b", "aaaaaaacaaaabaaaaacaaaabaacaaabb" },
482 { CM, A, 0, 0, "(?>((?>a{32}|b+|(a*))?(?>c+|d*)?\?)+e)+?f", "aaccebbdde bbdaaaccebbdee bbdaaaccebbdeef" },
483 { MU, A, 0, 0, "(?>(?:(?>aa|a||x)+?b|(?>aa|a||(x))+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
484 { MU, A, 0, 0, "(?>(?:(?>aa|a||(x))+?b|(?>aa|a||x)+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
485 { MU, A, 0, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d" },
486 { MU, A, 0, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d#\xcc\x8d\xcc\x8d" },
487 { MU, A, 0, 0 | F_PROPERTY, "\\X+..", "\xcc\x8d#\xcc\x8d#\xcc\x8d\xcc\x8d" },
488 { MU, A, 0, 0 | F_PROPERTY, "\\X{2,4}", "abcdef" },
489 { MU, A, 0, 0 | F_PROPERTY, "\\X{2,4}?", "abcdef" },
490 { MU, A, 0, 0 | F_NOMATCH | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d##" },
491 { MU, A, 0, 0 | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d#\xcc\x8d##" },
492 { MU, A, 0, 0, "(c(ab)?+ab)+", "cabcababcab" },
493 { MU, A, 0, 0, "(?>(a+)b)+aabab", "aaaabaaabaabab" },
495 /* Possessive quantifiers. */
496 { MU, A, 0, 0, "(?:a|b)++m", "mababbaaxababbaam" },
497 { MU, A, 0, 0, "(?:a|b)*+m", "mababbaaxababbaam" },
498 { MU, A, 0, 0, "(?:a|b)*+m", "ababbaaxababbaam" },
499 { MU, A, 0, 0, "(a|b)++m", "mababbaaxababbaam" },
500 { MU, A, 0, 0, "(a|b)*+m", "mababbaaxababbaam" },
501 { MU, A, 0, 0, "(a|b)*+m", "ababbaaxababbaam" },
502 { MU, A, 0, 0, "(a|b(*ACCEPT))++m", "maaxab" },
503 { MU, A, 0, 0, "(?:b*)++m", "bxbbxbbbxm" },
504 { MU, A, 0, 0, "(?:b*)++m", "bxbbxbbbxbbm" },
505 { MU, A, 0, 0, "(?:b*)*+m", "bxbbxbbbxm" },
506 { MU, A, 0, 0, "(?:b*)*+m", "bxbbxbbbxbbm" },
507 { MU, A, 0, 0, "(b*)++m", "bxbbxbbbxm" },
508 { MU, A, 0, 0, "(b*)++m", "bxbbxbbbxbbm" },
509 { MU, A, 0, 0, "(b*)*+m", "bxbbxbbbxm" },
510 { MU, A, 0, 0, "(b*)*+m", "bxbbxbbbxbbm" },
511 { MU, A, 0, 0, "(?:a|(b))++m", "mababbaaxababbaam" },
512 { MU, A, 0, 0, "(?:(a)|b)*+m", "mababbaaxababbaam" },
513 { MU, A, 0, 0, "(?:(a)|(b))*+m", "ababbaaxababbaam" },
514 { MU, A, 0, 0, "(a|(b))++m", "mababbaaxababbaam" },
515 { MU, A, 0, 0, "((a)|b)*+m", "mababbaaxababbaam" },
516 { MU, A, 0, 0, "((a)|(b))*+m", "ababbaaxababbaam" },
517 { MU, A, 0, 0, "(a|(b)(*ACCEPT))++m", "maaxab" },
518 { MU, A, 0, 0, "(?:(b*))++m", "bxbbxbbbxm" },
519 { MU, A, 0, 0, "(?:(b*))++m", "bxbbxbbbxbbm" },
520 { MU, A, 0, 0, "(?:(b*))*+m", "bxbbxbbbxm" },
521 { MU, A, 0, 0, "(?:(b*))*+m", "bxbbxbbbxbbm" },
522 { MU, A, 0, 0, "((b*))++m", "bxbbxbbbxm" },
523 { MU, A, 0, 0, "((b*))++m", "bxbbxbbbxbbm" },
524 { MU, A, 0, 0, "((b*))*+m", "bxbbxbbbxm" },
525 { MU, A, 0, 0, "((b*))*+m", "bxbbxbbbxbbm" },
526 { MU, A, 0, 0 | F_NOMATCH, "(?>(b{2,4}))(?:(?:(aa|c))++m|(?:(aa|c))+n)", "bbaacaaccaaaacxbbbmbn" },
527 { MU, A, 0, 0, "((?:b)++a)+(cd)*+m", "bbababbacdcdnbbababbacdcdm" },
528 { MU, A, 0, 0, "((?:(b))++a)+((c)d)*+m", "bbababbacdcdnbbababbacdcdm" },
529 { MU, A, 0, 0, "(?:(?:(?:ab)*+k)++(?:n(?:cd)++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
530 { MU, A, 0, 0, "(?:((ab)*+(k))++(n(?:c(d))++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
532 /* Back references. */
533 { MU, A, 0, 0, "(aa|bb)(\\1*)(ll|)(\\3*)bbbbbbc", "aaaaaabbbbbbbbc" },
534 { CMU, A, 0, 0, "(aa|bb)(\\1+)(ll|)(\\3+)bbbbbbc", "bBbbBbCbBbbbBbbcbbBbbbBBbbC" },
535 { CM, A, 0, 0, "(a{2,4})\\1", "AaAaaAaA" },
536 { MU, A, 0, 0, "(aa|bb)(\\1?)aa(\\1?)(ll|)(\\4+)bbc", "aaaaaaaabbaabbbbaabbbbc" },
537 { MU, A, 0, 0, "(aa|bb)(\\1{0,5})(ll|)(\\3{0,5})cc", "bbxxbbbbxxaaaaaaaaaaaaaaaacc" },
538 { MU, A, 0, 0, "(aa|bb)(\\1{3,5})(ll|)(\\3{3,5})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
539 { MU, A, 0, 0, "(aa|bb)(\\1{3,})(ll|)(\\3{3,})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
540 { MU, A, 0, 0, "(\\w+)b(\\1+)c", "GabGaGaDbGaDGaDc" },
541 { MU, A, 0, 0, "(?:(aa)|b)\\1?b", "bb" },
542 { CMU, A, 0, 0, "(aa|bb)(\\1*?)aa(\\1+?)", "bBBbaaAAaaAAaa" },
543 { MU, A, 0, 0, "(aa|bb)(\\1*?)(dd|)cc(\\3+?)", "aaaaaccdd" },
544 { CMU, A, 0, 0, "(?:(aa|bb)(\\1?\?)cc){2}(\\1?\?)", "aAaABBbbAAaAcCaAcCaA" },
545 { MU, A, 0, 0, "(?:(aa|bb)(\\1{3,5}?)){2}(dd|)(\\3{3,5}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
546 { CM, A, 0, 0, "(?:(aa|bb)(\\1{3,}?)){2}(dd|)(\\3{3,}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
547 { MU, A, 0, 0, "(?:(aa|bb)(\\1{0,3}?)){2}(dd|)(\\3{0,3}?)b(\\1{0,3}?)(\\1{0,3})", "aaaaaaaaaaaaaaabaaaaa" },
548 { MU, A, 0, 0, "(a(?:\\1|)a){3}b", "aaaaaaaaaaab" },
549 { M, A, 0, 0, "(a?)b(\\1\\1*\\1+\\1?\\1*?\\1+?\\1??\\1*+\\1++\\1?+\\1{4}\\1{3,5}\\1{4,}\\1{0,5}\\1{3,5}?\\1{4,}?\\1{0,5}?\\1{3,5}+\\1{4,}+\\1{0,5}+#){2}d", "bb#b##d" },
550 { MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
551 { MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{0,2}", "wwwww." },
552 { MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwww" },
553 { MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwwww" },
554 { PCRE2_UCP, 0, 0, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
555 { CMUP, A, 0, 0, "(\xf0\x90\x90\x80)\\1", "\xf0\x90\x90\xa8\xf0\x90\x90\xa8" },
556 { MU | PCRE2_DUPNAMES, A, 0, 0 | F_NOMATCH, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
557 { MU | PCRE2_DUPNAMES | PCRE2_MATCH_UNSET_BACKREF, A, 0, 0, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
558 { MU | PCRE2_DUPNAMES | PCRE2_MATCH_UNSET_BACKREF, A, 0, 0, "\\k<A>*(?<A>aa)(?<A>bb)", "aabb" },
559 { MU | PCRE2_DUPNAMES, A, 0, 0, "(?<A>aa)(?<A>bb)\\k<A>{0,3}aaaaaa", "aabbaaaaaa" },
560 { MU | PCRE2_DUPNAMES, A, 0, 0, "(?<A>aa)(?<A>bb)\\k<A>{2,5}bb", "aabbaaaabb" },
561 { MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}m", "aaaaaaaabbbbaabbbbm" },
562 { MU | PCRE2_DUPNAMES, A, 0, 0 | F_NOMATCH, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
563 { MU | PCRE2_DUPNAMES | PCRE2_MATCH_UNSET_BACKREF, A, 0, 0, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
564 { MU | PCRE2_DUPNAMES, A, 0, 0, "\\k<A>*?(?<A>aa)(?<A>bb)", "aabb" },
565 { MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
566 { MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>*?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
567 { MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
568 { CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}M", "aaaaaaaabbbbaabbbbm" },
569 { CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{1,3}M", "aaaaaaaabbbbaabbbbm" },
570 { CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}?M", "aaaaaabbbbbbaabbbbbbbbbbm" },
571 { CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
574 { MU, A, 0, 0, "(?=xx|yy|zz)\\w{4}", "abczzdefg" },
575 { MU, A, 0, 0, "(?=((\\w+)b){3}|ab)", "dbbbb ab" },
576 { MU, A, 0, 0, "(?!ab|bc|cd)[a-z]{2}", "Xabcdef" },
577 { MU, A, 0, 0, "(?<=aaa|aa|a)a", "aaa" },
578 { MU, A, 0, 2, "(?<=aaa|aa|a)a", "aaa" },
579 { M, A, 0, 0, "(?<=aaa|aa|a)a", "aaa" },
580 { M, A, 0, 2, "(?<=aaa|aa|a)a", "aaa" },
581 { MU, A, 0, 0, "(\\d{2})(?!\\w+c|(((\\w?)m){2}n)+|\\1)", "x5656" },
582 { MU, A, 0, 0, "((?=((\\d{2,6}\\w){2,}))\\w{5,20}K){2,}", "567v09708K12l00M00 567v09708K12l00M00K45K" },
583 { MU, A, 0, 0, "(?=(?:(?=\\S+a)\\w*(b)){3})\\w+\\d", "bba bbab nbbkba nbbkba0kl" },
584 { MU, A, 0, 0, "(?>a(?>(b+))a(?=(..)))*?k", "acabbcabbaabacabaabbakk" },
585 { MU, A, 0, 0, "((?(?=(a))a)+k)", "bbak" },
586 { MU, A, 0, 0, "((?(?=a)a)+k)", "bbak" },
587 { MU, A, 0, 0 | F_NOMATCH, "(?=(?>(a))m)amk", "a k" },
588 { MU, A, 0, 0 | F_NOMATCH, "(?!(?>(a))m)amk", "a k" },
589 { MU, A, 0, 0 | F_NOMATCH, "(?>(?=(a))am)amk", "a k" },
590 { MU, A, 0, 0, "(?=(?>a|(?=(?>(b+))a|c)[a-c]+)*?m)[a-cm]+k", "aaam bbam baaambaam abbabba baaambaamk" },
591 { MU, A, 0, 0, "(?> ?\?\\b(?(?=\\w{1,4}(a))m)\\w{0,8}bc){2,}?", "bca ssbc mabd ssbc mabc" },
592 { MU, A, 0, 0, "(?:(?=ab)?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
593 { MU, A, 0, 0, "(?:(?=a(b))?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
594 { MU, A, 0, 0, "(?:(?=.(.))??\\1.)+m", "aabbbcbacccanaabbbcbacccam" },
595 { MU, A, 0, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" },
596 { MU, A, 0, 0, "((?!a)?(?!([^a]))?)+$", "acbab" },
597 { MU, A, 0, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" },
598 { MU, A, 0, 0, "a(?=(?C)\\B(?C`x`))b", "ab" },
599 { MU, A, 0, 0, "a(?!(?C)\\B(?C`x`))bb|ab", "abb" },
600 { MU, A, 0, 0, "a(?=\\b|(?C)\\B(?C`x`))b", "ab" },
601 { MU, A, 0, 0, "a(?!\\b|(?C)\\B(?C`x`))bb|ab", "abb" },
602 { MU, A, 0, 0, "c(?(?=(?C)\\B(?C`x`))ab|a)", "cab" },
603 { MU, A, 0, 0, "c(?(?!(?C)\\B(?C`x`))ab|a)", "cab" },
604 { MU, A, 0, 0, "c(?(?=\\b|(?C)\\B(?C`x`))ab|a)", "cab" },
605 { MU, A, 0, 0, "c(?(?!\\b|(?C)\\B(?C`x`))ab|a)", "cab" },
606 { MU, A, 0, 0, "a(?=)b", "ab" },
607 { MU, A, 0, 0 | F_NOMATCH, "a(?!)b", "ab" },
609 /* Not empty, ACCEPT, FAIL */
610 { MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" },
611 { MU, A, PCRE2_NOTEMPTY, 0, "a*", "bcaad" },
612 { MU, A, PCRE2_NOTEMPTY, 0, "a*?", "bcaad" },
613 { MU, A, PCRE2_NOTEMPTY_ATSTART, 0, "a*", "bcaad" },
614 { MU, A, 0, 0, "a(*ACCEPT)b", "ab" },
615 { MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "a*(*ACCEPT)b", "bcx" },
616 { MU, A, PCRE2_NOTEMPTY, 0, "a*(*ACCEPT)b", "bcaad" },
617 { MU, A, PCRE2_NOTEMPTY, 0, "a*?(*ACCEPT)b", "bcaad" },
618 { MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "(?:z|a*(*ACCEPT)b)", "bcx" },
619 { MU, A, PCRE2_NOTEMPTY, 0, "(?:z|a*(*ACCEPT)b)", "bcaad" },
620 { MU, A, PCRE2_NOTEMPTY, 0, "(?:z|a*?(*ACCEPT)b)", "bcaad" },
621 { MU, A, PCRE2_NOTEMPTY_ATSTART, 0, "a*(*ACCEPT)b", "bcx" },
622 { MU, A, PCRE2_NOTEMPTY_ATSTART, 0 | F_NOMATCH, "a*(*ACCEPT)b", "" },
623 { MU, A, 0, 0, "((a(*ACCEPT)b))", "ab" },
624 { MU, A, 0, 0, "(a(*FAIL)a|a)", "aaa" },
625 { MU, A, 0, 0, "(?=ab(*ACCEPT)b)a", "ab" },
626 { MU, A, 0, 0, "(?=(?:x|ab(*ACCEPT)b))", "ab" },
627 { MU, A, 0, 0, "(?=(a(b(*ACCEPT)b)))a", "ab" },
628 { MU, A, PCRE2_NOTEMPTY, 0, "(?=a*(*ACCEPT))c", "c" },
630 /* Conditional blocks. */
631 { MU, A, 0, 0, "(?(?=(a))a|b)+k", "ababbalbbadabak" },
632 { MU, A, 0, 0, "(?(?!(b))a|b)+k", "ababbalbbadabak" },
633 { MU, A, 0, 0, "(?(?=a)a|b)+k", "ababbalbbadabak" },
634 { MU, A, 0, 0, "(?(?!b)a|b)+k", "ababbalbbadabak" },
635 { MU, A, 0, 0, "(?(?=(a))a*|b*)+k", "ababbalbbadabak" },
636 { MU, A, 0, 0, "(?(?!(b))a*|b*)+k", "ababbalbbadabak" },
637 { MU, A, 0, 0, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
638 { MU, A, 0, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
639 { MU, A, 0, 0 | F_DIFF, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
640 { MU, A, 0, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
641 { MU, A, 0, 0, "(?(?=a)a*|b*)+k", "ababbalbbadabak" },
642 { MU, A, 0, 0, "(?(?!b)a*|b*)+k", "ababbalbbadabak" },
643 { MU, A, 0, 0, "(?(?=a)ab)", "a" },
644 { MU, A, 0, 0, "(?(?<!b)c)", "b" },
645 { MU, A, 0, 0, "(?(DEFINE)a(b))", "a" },
646 { MU, A, 0, 0, "a(?(DEFINE)(?:b|(?:c?)+)*)", "a" },
647 { MU, A, 0, 0, "(?(?=.[a-c])[k-l]|[A-D])", "kdB" },
648 { MU, A, 0, 0, "(?(?!.{0,4}[cd])(aa|bb)|(cc|dd))+", "aabbccddaa" },
649 { MU, A, 0, 0, "(?(?=[^#@]*@)(aaab|aa|aba)|(aba|aab)){3,}", "aaabaaaba#aaabaaaba#aaabaaaba@" },
650 { MU, A, 0, 0, "((?=\\w{5})\\w(?(?=\\w*k)\\d|[a-f_])*\\w\\s)+", "mol m10kk m088k _f_a_ mbkkl" },
651 { MU, A, 0, 0, "(c)?\?(?(1)a|b)", "cdcaa" },
652 { MU, A, 0, 0, "(c)?\?(?(1)a|b)", "cbb" },
653 { MU, A, 0, 0 | F_DIFF, "(?(?=(a))(aaaa|a?))+aak", "aaaaab aaaaak" },
654 { MU, A, 0, 0, "(?(?=a)(aaaa|a?))+aak", "aaaaab aaaaak" },
655 { MU, A, 0, 0, "(?(?!(b))(aaaa|a?))+aak", "aaaaab aaaaak" },
656 { MU, A, 0, 0, "(?(?!b)(aaaa|a?))+aak", "aaaaab aaaaak" },
657 { MU, A, 0, 0 | F_DIFF, "(?(?=(a))a*)+aak", "aaaaab aaaaak" },
658 { MU, A, 0, 0, "(?(?=a)a*)+aak", "aaaaab aaaaak" },
659 { MU, A, 0, 0, "(?(?!(b))a*)+aak", "aaaaab aaaaak" },
660 { MU, A, 0, 0, "(?(?!b)a*)+aak", "aaaaab aaaaak" },
661 { MU, A, 0, 0, "(?(?=(?=(?!(x))a)aa)aaa|(?(?=(?!y)bb)bbb))*k", "abaabbaaabbbaaabbb abaabbaaabbbaaabbbk" },
662 { MU, A, 0, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)*l", "bc ddd abccabccl" },
663 { MU, A, 0, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+?dd", "bcabcacdb bdddd" },
664 { MU, A, 0, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+l", "ababccddabdbccd abcccl" },
665 { MU, A, 0, 0, "((?:a|aa)(?(1)aaa))x", "aax" },
666 { MU, A, 0, 0, "(?(?!)a|b)", "ab" },
667 { MU, A, 0, 0, "(?(?!)a)", "ab" },
668 { MU, A, 0, 0 | F_NOMATCH, "(?(?!)a|b)", "ac" },
670 /* Set start of match. */
671 { MU, A, 0, 0, "(?:\\Ka)*aaaab", "aaaaaaaa aaaaaaabb" },
672 { MU, A, 0, 0, "(?>\\Ka\\Ka)*aaaab", "aaaaaaaa aaaaaaaaaabb" },
673 { MU, A, 0, 0, "a+\\K(?<=\\Gaa)a", "aaaaaa" },
674 { MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "a\\K(*ACCEPT)b", "aa" },
675 { MU, A, PCRE2_NOTEMPTY_ATSTART, 0, "a\\K(*ACCEPT)b", "aa" },
678 { MU | PCRE2_FIRSTLINE, A, 0, 0 | F_PROPERTY, "\\p{Any}a", "bb\naaa" },
679 { MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}a", "bb\r\naaa" },
680 { MU | PCRE2_FIRSTLINE, A, 0, 0, "(?<=a)", "a" },
681 { MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "[^a][^b]", "ab" },
682 { MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "a", "\na" },
683 { MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "[abc]", "\na" },
684 { MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "^a", "\na" },
685 { MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "^(?<=\n)", "\na" },
686 { MU | PCRE2_FIRSTLINE, A, 0, 0, "\xf0\x90\x90\x80", "\xf0\x90\x90\x80" },
687 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_ANY, 0, 0 | F_NOMATCH, "#", "\xc2\x85#" },
688 { M | PCRE2_FIRSTLINE, PCRE2_NEWLINE_ANY, 0, 0 | F_NOMATCH, "#", "\x85#" },
689 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_ANY, 0, 0 | F_NOMATCH, "^#", "\xe2\x80\xa8#" },
690 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0 | F_PROPERTY, "\\p{Any}", "\r\na" },
691 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0, ".", "\r" },
692 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0, "a", "\ra" },
693 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0 | F_NOMATCH, "ba", "bbb\r\nba" },
694 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}{4}|a", "\r\na" },
695 { MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 1, ".", "\r\n" },
696 { PCRE2_FIRSTLINE | PCRE2_DOTALL, PCRE2_NEWLINE_LF, 0, 0 | F_NOMATCH, "ab.", "ab" },
697 { MU | PCRE2_FIRSTLINE, A, 0, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" },
698 { PCRE2_FIRSTLINE | PCRE2_DOTALL, PCRE2_NEWLINE_ANY, 0, 0, "....a", "012\n0a" },
699 { MU | PCRE2_FIRSTLINE, A, 0, 0, "[aC]", "a" },
702 { MU, A, 0, 0, "(a)(?1)", "aa" },
703 { MU, A, 0, 0, "((a))(?1)", "aa" },
704 { MU, A, 0, 0, "(b|a)(?1)", "aa" },
705 { MU, A, 0, 0, "(b|(a))(?1)", "aa" },
706 { MU, A, 0, 0 | F_NOMATCH, "((a)(b)(?:a*))(?1)", "aba" },
707 { MU, A, 0, 0, "((a)(b)(?:a*))(?1)", "abab" },
708 { MU, A, 0, 0, "((a+)c(?2))b(?1)", "aacaabaca" },
709 { MU, A, 0, 0, "((?2)b|(a)){2}(?1)", "aabab" },
710 { MU, A, 0, 0, "(?1)(a)*+(?2)(b(?1))", "aababa" },
711 { MU, A, 0, 0, "(?1)(((a(*ACCEPT)))b)", "axaa" },
712 { MU, A, 0, 0, "(?1)(?(DEFINE) (((ac(*ACCEPT)))b) )", "akaac" },
713 { MU, A, 0, 0, "(a+)b(?1)b\\1", "abaaabaaaaa" },
714 { MU, A, 0, 0, "(?(DEFINE)(aa|a))(?1)ab", "aab" },
715 { MU, A, 0, 0, "(?(DEFINE)(a\\Kb))(?1)+ababc", "abababxabababc" },
716 { MU, A, 0, 0, "(a\\Kb)(?1)+ababc", "abababxababababc" },
717 { MU, A, 0, 0 | F_NOMATCH, "(a\\Kb)(?1)+ababc", "abababxababababxc" },
718 { MU, A, 0, 0, "b|<(?R)*>", "<<b>" },
719 { MU, A, 0, 0, "(a\\K){0}(?:(?1)b|ac)", "ac" },
720 { MU, A, 0, 0, "(?(DEFINE)(a(?2)|b)(b(?1)|(a)))(?:(?1)|(?2))m", "ababababnababababaam" },
721 { MU, A, 0, 0, "(a)((?(R)a|b))(?2)", "aabbabaa" },
722 { MU, A, 0, 0, "(a)((?(R2)a|b))(?2)", "aabbabaa" },
723 { MU, A, 0, 0, "(a)((?(R1)a|b))(?2)", "ababba" },
724 { MU, A, 0, 0, "(?(R0)aa|bb(?R))", "abba aabb bbaa" },
725 { MU, A, 0, 0, "((?(R)(?:aaaa|a)|(?:(aaaa)|(a)))+)(?1)$", "aaaaaaaaaa aaaa" },
726 { MU, A, 0, 0, "(?P<Name>a(?(R&Name)a|b))(?1)", "aab abb abaa" },
727 { MU, A, 0, 0, "((?(R)a|(?1)){3})", "XaaaaaaaaaX" },
728 { MU, A, 0, 0, "((?:(?(R)a|(?1))){3})", "XaaaaaaaaaX" },
729 { MU, A, 0, 0, "((?(R)a|(?1)){1,3})aaaaaa", "aaaaaaaaXaaaaaaaaa" },
730 { MU, A, 0, 0, "((?(R)a|(?1)){1,3}?)M", "aaaM" },
731 { MU, A, 0, 0, "((.)(?:.|\\2(?1))){0}#(?1)#", "#aabbccdde# #aabbccddee#" },
732 { MU, A, 0, 0, "((.)(?:\\2|\\2{4}b)){0}#(?:(?1))+#", "#aaaab# #aaaaab#" },
734 /* 16 bit specific tests. */
735 { CM, A, 0, 0 | F_FORCECONV, "\xc3\xa1", "\xc3\x81\xc3\xa1" },
736 { CM, A, 0, 0 | F_FORCECONV, "\xe1\xbd\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
737 { CM, A, 0, 0 | F_FORCECONV, "[\xc3\xa1]", "\xc3\x81\xc3\xa1" },
738 { CM, A, 0, 0 | F_FORCECONV, "[\xe1\xbd\xb8]", "\xe1\xbf\xb8\xe1\xbd\xb8" },
739 { CM, A, 0, 0 | F_FORCECONV, "[a-\xed\xb0\x80]", "A" },
740 { CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[a-\\x{dc00}]", "B" },
741 { CM, A, 0, 0 | F_NO8 | F_NOMATCH | F_FORCECONV, "[b-\\x{dc00}]", "a" },
742 { CM, A, 0, 0 | F_NO8 | F_FORCECONV, "\xed\xa0\x80\\x{d800}\xed\xb0\x80\\x{dc00}", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80" },
743 { CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[\xed\xa0\x80\\x{d800}]{1,2}?[\xed\xb0\x80\\x{dc00}]{1,2}?#", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80#" },
744 { CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80\xed\xb0\x80#]{0,3}(?<=\xed\xb0\x80.)", "\xed\xa0\x80#\xed\xa0\x80##\xed\xb0\x80\xed\xa0\x80" },
745 { CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\x9f\xbf\xed\xa0\x83" },
746 { CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\xb4\x80\xed\xb3\xb0" },
747 { CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\x9f\xbf\xed\xa0\x83" },
748 { CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\xb4\x80\xed\xb3\xb0" },
749 { CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80-\xef\xbf\xbf]+[\x1-\xed\xb0\x80]+#", "\xed\xa0\x85\xc3\x81\xed\xa0\x85\xef\xbf\xb0\xc2\x85\xed\xa9\x89#" },
750 { CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80][\xed\xb0\x80]{2,}", "\xed\xa0\x80\xed\xb0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80\xed\xb0\x80" },
751 { M, A, 0, 0 | F_FORCECONV, "[^\xed\xb0\x80]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
752 { M, A, 0, 0 | F_NO8 | F_FORCECONV, "[^\\x{dc00}]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
753 { CM, A, 0, 0 | F_FORCECONV, ".\\B.", "\xed\xa0\x80\xed\xb0\x80" },
754 { CM, A, 0, 0 | F_FORCECONV, "\\D+(?:\\d+|.)\\S+(?:\\s+|.)\\W+(?:\\w+|.)\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80" },
755 { CM, A, 0, 0 | F_FORCECONV, "\\d*\\s*\\w*\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80" },
756 { CM, A, 0, 0 | F_FORCECONV | F_NOMATCH, "\\d*?\\D*?\\s*?\\S*?\\w*?\\W*?##", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80#" },
757 { CM | PCRE2_EXTENDED, A, 0, 0 | F_FORCECONV, "\xed\xa0\x80 \xed\xb0\x80 !", "\xed\xa0\x80\xed\xb0\x80!" },
758 { CM, A, 0, 0 | F_FORCECONV, "\xed\xa0\x80+#[^#]+\xed\xa0\x80", "\xed\xa0\x80#a\xed\xa0\x80" },
759 { CM, A, 0, 0 | F_FORCECONV, "(\xed\xa0\x80+)#\\1", "\xed\xa0\x80\xed\xa0\x80#\xed\xa0\x80\xed\xa0\x80" },
760 { M, PCRE2_NEWLINE_ANY, 0, 0 | F_NO8 | F_FORCECONV, "^-", "a--\xe2\x80\xa8--" },
761 { 0, BSR(PCRE2_BSR_UNICODE), 0, 0 | F_NO8 | F_FORCECONV, "\\R", "ab\xe2\x80\xa8" },
762 { 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\v", "ab\xe2\x80\xa9" },
763 { 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\h", "ab\xe1\xa0\x8e" },
764 { 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\v+?\\V+?#", "\xe2\x80\xa9\xe2\x80\xa9\xef\xbf\xbf\xef\xbf\xbf#" },
765 { 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\h+?\\H+?#", "\xe1\xa0\x8e\xe1\xa0\x8e\xef\xbf\xbf\xef\xbf\xbf#" },
767 /* Partial matching. */
768 { MU, A, PCRE2_PARTIAL_SOFT, 0, "ab", "a" },
769 { MU, A, PCRE2_PARTIAL_SOFT, 0, "ab|a", "a" },
770 { MU, A, PCRE2_PARTIAL_HARD, 0, "ab|a", "a" },
771 { MU, A, PCRE2_PARTIAL_SOFT, 0, "\\b#", "a" },
772 { MU, A, PCRE2_PARTIAL_SOFT, 0, "(?<=a)b", "a" },
773 { MU, A, PCRE2_PARTIAL_SOFT, 0, "abc|(?<=xxa)bc", "xxab" },
774 { MU, A, PCRE2_PARTIAL_SOFT, 0, "a\\B", "a" },
775 { MU, A, PCRE2_PARTIAL_HARD, 0, "a\\b", "a" },
778 { MU, A, 0, 0, "a(*MARK:aa)a", "ababaa" },
779 { MU, A, 0, 0 | F_NOMATCH, "a(*:aa)a", "abab" },
780 { MU, A, 0, 0, "a(*:aa)(b(*:bb)b|bc)", "abc" },
781 { MU, A, 0, 0 | F_NOMATCH, "a(*:1)x|b(*:2)y", "abc" },
782 { MU, A, 0, 0, "(?>a(*:aa))b|ac", "ac" },
783 { MU, A, 0, 0, "(?(DEFINE)(a(*:aa)))(?1)", "a" },
784 { MU, A, 0, 0 | F_NOMATCH, "(?(DEFINE)((a)(*:aa)))(?1)b", "aa" },
785 { MU, A, 0, 0, "(?(DEFINE)(a(*:aa)))a(?1)b|aac", "aac" },
786 { MU, A, 0, 0, "(a(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
787 { MU, A, 0, 0, "(a(*:aa)){0}(?:b(?1)b)+", "babba" },
788 { MU, A, 0, 0 | F_NOMATCH, "(a(*:aa)){0}(?:b(?1)b)+", "ba" },
789 { MU, A, 0, 0, "(a\\K(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
790 { MU, A, 0, 0, "(a\\K(*:aa)){0}(?:b(?1)b)+", "babba" },
791 { MU, A, 0, 0 | F_NOMATCH, "(a\\K(*:aa)){0}(?:b(?1)b)+", "ba" },
792 { MU, A, 0, 0 | F_NOMATCH, "(*:mark)m", "a" },
794 /* (*COMMIT) verb. */
795 { MU, A, 0, 0 | F_NOMATCH, "a(*COMMIT)b", "ac" },
796 { MU, A, 0, 0, "aa(*COMMIT)b", "xaxaab" },
797 { MU, A, 0, 0 | F_NOMATCH, "a(*COMMIT)(*:msg)b|ac", "ac" },
798 { MU, A, 0, 0 | F_NOMATCH, "(a(*COMMIT)b)++", "abac" },
799 { MU, A, 0, 0 | F_NOMATCH, "((a)(*COMMIT)b)++", "abac" },
800 { MU, A, 0, 0 | F_NOMATCH, "(?=a(*COMMIT)b)ab|ad", "ad" },
803 { MU, A, 0, 0, "aa\\K(*PRUNE)b", "aaab" },
804 { MU, A, 0, 0, "aa(*PRUNE:bb)b|a", "aa" },
805 { MU, A, 0, 0, "(a)(a)(*PRUNE)b|(a)", "aa" },
806 { MU, A, 0, 0, "(a)(a)(a)(a)(a)(a)(a)(a)(*PRUNE)b|(a)", "aaaaaaaa" },
807 { MU, A, PCRE2_PARTIAL_SOFT, 0, "a(*PRUNE)a|", "a" },
808 { MU, A, PCRE2_PARTIAL_SOFT, 0, "a(*PRUNE)a|m", "a" },
809 { MU, A, 0, 0 | F_NOMATCH, "(?=a(*PRUNE)b)ab|ad", "ad" },
810 { MU, A, 0, 0, "a(*COMMIT)(*PRUNE)d|bc", "abc" },
811 { MU, A, 0, 0, "(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
812 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
813 { MU, A, 0, 0, "(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
814 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
815 { MU, A, 0, 0, "(a(*COMMIT)b){0}a(?1)(*PRUNE)c|bc", "abc" },
816 { MU, A, 0, 0 | F_NOMATCH, "(a(*COMMIT)b){0}a(*COMMIT)(?1)(*PRUNE)c|bc", "abc" },
817 { MU, A, 0, 0, "(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
818 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
819 { MU, A, 0, 0, "((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
820 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
821 { MU, A, 0, 0, "(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
822 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
823 { MU, A, 0, 0, "(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
824 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
825 { MU, A, 0, 0, "(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
826 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
827 { MU, A, 0, 0, "(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
828 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
829 { MU, A, 0, 0, "(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
830 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
831 { MU, A, 0, 0, "(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
832 { MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
835 { MU, A, 0, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" },
836 { MU, A, 0, 0, "(\\w+(*SKIP)#)", "abcd,xyz#," },
837 { MU, A, 0, 0, "\\w+(*SKIP)#|mm", "abcd,xyz#," },
838 { MU, A, 0, 0 | F_NOMATCH, "b+(?<=(*SKIP)#c)|b+", "#bbb" },
841 { MU, A, 0, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" },
842 { MU, A, 0, 0 | F_NOMATCH, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcm" },
843 { MU, A, 0, 0, "((?:a(*THEN)|aab)c|a+)+m", "aabcaabcnmaabcaabcm" },
844 { MU, A, 0, 0, "((?:a|aab)(*THEN)c|a+)+m", "aam" },
845 { MU, A, 0, 0, "((?:a(*COMMIT)|aab)(*THEN)c|a+)+m", "aam" },
846 { MU, A, 0, 0, "(?(?=a(*THEN)b)ab|ad)", "ad" },
847 { MU, A, 0, 0, "(?(?!a(*THEN)b)ad|add)", "add" },
848 { MU, A, 0, 0 | F_NOMATCH, "(?(?=a)a(*THEN)b|ad)", "ad" },
849 { MU, A, 0, 0, "(?!(?(?=a)ab|b(*THEN)d))bn|bnn", "bnn" },
851 /* Recurse and control verbs. */
852 { MU, A, 0, 0, "(a(*ACCEPT)b){0}a(?1)b", "aacaabb" },
853 { MU, A, 0, 0, "((a)\\2(*ACCEPT)b){0}a(?1)b", "aaacaaabb" },
854 { MU, A, 0, 0, "((ab|a(*ACCEPT)x)+|ababababax){0}_(?1)_", "_ababababax_ _ababababa_" },
855 { MU, A, 0, 0, "((.)(?:A(*ACCEPT)|(?1)\\2)){0}_(?1)_", "_bcdaAdcb_bcdaAdcb_" },
856 { MU, A, 0, 0, "((*MARK:m)(?:a|a(*COMMIT)b|aa)){0}_(?1)_", "_ab_" },
857 { MU, A, 0, 0, "((*MARK:m)(?:a|a(*COMMIT)b|aa)){0}_(?1)_|(_aa_)", "_aa_" },
858 { MU, A, 0, 0, "(a(*COMMIT)(?:b|bb)|c(*ACCEPT)d|dd){0}_(?1)+_", "_ax_ _cd_ _abbb_ _abcd_ _abbcdd_" },
859 { MU, A, 0, 0, "((.)(?:.|(*COMMIT)\\2{3}(*ACCEPT).*|.*)){0}_(?1){0,4}_", "_aaaabbbbccccddd_ _aaaabbbbccccdddd_" },
861 /* Deep recursion. */
862 { MU, A, 0, 0, "((((?:(?:(?:\\w)+)?)*|(?>\\w)+?)+|(?>\\w)?\?)*)?\\s", "aaaaa+ " },
863 { MU, A, 0, 0, "(?:((?:(?:(?:\\w*?)+)??|(?>\\w)?|\\w*+)*)+)+?\\s", "aa+ " },
864 { MU, A, 0, 0, "((a?)+)+b", "aaaaaaaaaaaa b" },
866 /* Deep recursion: Stack limit reached. */
867 { M, A, 0, 0 | F_NOMATCH, "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaa" },
868 { M, A, 0, 0 | F_NOMATCH, "(?:a+)+b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
869 { M, A, 0, 0 | F_NOMATCH, "(?:a+?)+?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
870 { M, A, 0, 0 | F_NOMATCH, "(?:a*)*b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
871 { M, A, 0, 0 | F_NOMATCH, "(?:a*?)*?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
873 { 0, 0, 0, 0, NULL, NULL }
876 #ifdef SUPPORT_PCRE2_8
877 static pcre2_jit_stack_8* callback8(void *arg)
879 return (pcre2_jit_stack_8 *)arg;
883 #ifdef SUPPORT_PCRE2_16
884 static pcre2_jit_stack_16* callback16(void *arg)
886 return (pcre2_jit_stack_16 *)arg;
890 #ifdef SUPPORT_PCRE2_32
891 static pcre2_jit_stack_32* callback32(void *arg)
893 return (pcre2_jit_stack_32 *)arg;
897 #ifdef SUPPORT_PCRE2_8
898 static pcre2_jit_stack_8 *stack8;
900 static pcre2_jit_stack_8 *getstack8(void)
903 stack8 = pcre2_jit_stack_create_8(1, 1024 * 1024, NULL);
907 static void setstack8(pcre2_match_context_8 *mcontext)
911 pcre2_jit_stack_free_8(stack8);
916 pcre2_jit_stack_assign_8(mcontext, callback8, getstack8());
918 #endif /* SUPPORT_PCRE2_8 */
920 #ifdef SUPPORT_PCRE2_16
921 static pcre2_jit_stack_16 *stack16;
923 static pcre2_jit_stack_16 *getstack16(void)
926 stack16 = pcre2_jit_stack_create_16(1, 1024 * 1024, NULL);
930 static void setstack16(pcre2_match_context_16 *mcontext)
934 pcre2_jit_stack_free_16(stack16);
939 pcre2_jit_stack_assign_16(mcontext, callback16, getstack16());
941 #endif /* SUPPORT_PCRE2_16 */
943 #ifdef SUPPORT_PCRE2_32
944 static pcre2_jit_stack_32 *stack32;
946 static pcre2_jit_stack_32 *getstack32(void)
949 stack32 = pcre2_jit_stack_create_32(1, 1024 * 1024, NULL);
953 static void setstack32(pcre2_match_context_32 *mcontext)
957 pcre2_jit_stack_free_32(stack32);
962 pcre2_jit_stack_assign_32(mcontext, callback32, getstack32());
964 #endif /* SUPPORT_PCRE2_32 */
966 #ifdef SUPPORT_PCRE2_16
968 static int convert_utf8_to_utf16(PCRE2_SPTR8 input, PCRE2_UCHAR16 *output, int *offsetmap, int max_length)
970 PCRE2_SPTR8 iptr = input;
971 PCRE2_UCHAR16 *optr = output;
977 while (*iptr && max_length > 1) {
980 *offsetmap++ = (int)(iptr - (unsigned char*)input);
984 else if (!(*iptr & 0x20)) {
985 c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
987 } else if (!(*iptr & 0x10)) {
988 c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
990 } else if (!(*iptr & 0x08)) {
991 c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
998 } else if (max_length <= 2) {
1000 return (int)(optr - output);
1003 *optr++ = 0xd800 | ((c >> 10) & 0x3ff);
1004 *optr++ = 0xdc00 | (c & 0x3ff);
1011 *offsetmap = (int)(iptr - (unsigned char*)input);
1013 return (int)(optr - output);
1016 static int copy_char8_to_char16(PCRE2_SPTR8 input, PCRE2_UCHAR16 *output, int max_length)
1018 PCRE2_SPTR8 iptr = input;
1019 PCRE2_UCHAR16 *optr = output;
1021 if (max_length == 0)
1024 while (*iptr && max_length > 1) {
1029 return (int)(optr - output);
1032 #define REGTEST_MAX_LENGTH16 4096
1033 static PCRE2_UCHAR16 regtest_buf16[REGTEST_MAX_LENGTH16];
1034 static int regtest_offsetmap16[REGTEST_MAX_LENGTH16];
1036 #endif /* SUPPORT_PCRE2_16 */
1038 #ifdef SUPPORT_PCRE2_32
1040 static int convert_utf8_to_utf32(PCRE2_SPTR8 input, PCRE2_UCHAR32 *output, int *offsetmap, int max_length)
1042 PCRE2_SPTR8 iptr = input;
1043 PCRE2_UCHAR32 *optr = output;
1046 if (max_length == 0)
1049 while (*iptr && max_length > 1) {
1052 *offsetmap++ = (int)(iptr - (unsigned char*)input);
1056 else if (!(*iptr & 0x20)) {
1057 c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
1059 } else if (!(*iptr & 0x10)) {
1060 c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
1062 } else if (!(*iptr & 0x08)) {
1063 c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
1071 *offsetmap = (int)(iptr - (unsigned char*)input);
1073 return (int)(optr - output);
1076 static int copy_char8_to_char32(PCRE2_SPTR8 input, PCRE2_UCHAR32 *output, int max_length)
1078 PCRE2_SPTR8 iptr = input;
1079 PCRE2_UCHAR32 *optr = output;
1081 if (max_length == 0)
1084 while (*iptr && max_length > 1) {
1089 return (int)(optr - output);
1092 #define REGTEST_MAX_LENGTH32 4096
1093 static PCRE2_UCHAR32 regtest_buf32[REGTEST_MAX_LENGTH32];
1094 static int regtest_offsetmap32[REGTEST_MAX_LENGTH32];
1096 #endif /* SUPPORT_PCRE2_32 */
1098 static int check_ascii(const char *input)
1100 const unsigned char *ptr = (unsigned char *)input;
1109 #define OVECTOR_SIZE 15
1111 static int regression_tests(void)
1113 struct regression_test_case *current = regression_test_cases;
1115 PCRE2_SIZE err_offs;
1120 int successful_row = 0;
1122 int jit_compile_mode;
1124 int disabled_options = 0;
1126 #ifdef SUPPORT_PCRE2_8
1128 pcre2_compile_context_8 *ccontext8;
1129 pcre2_match_data_8 *mdata8_1;
1130 pcre2_match_data_8 *mdata8_2;
1131 pcre2_match_context_8 *mcontext8;
1132 PCRE2_SIZE *ovector8_1 = NULL;
1133 PCRE2_SIZE *ovector8_2 = NULL;
1134 int return_value8[2];
1136 #ifdef SUPPORT_PCRE2_16
1137 pcre2_code_16 *re16;
1138 pcre2_compile_context_16 *ccontext16;
1139 pcre2_match_data_16 *mdata16_1;
1140 pcre2_match_data_16 *mdata16_2;
1141 pcre2_match_context_16 *mcontext16;
1142 PCRE2_SIZE *ovector16_1 = NULL;
1143 PCRE2_SIZE *ovector16_2 = NULL;
1144 int return_value16[2];
1147 #ifdef SUPPORT_PCRE2_32
1148 pcre2_code_32 *re32;
1149 pcre2_compile_context_32 *ccontext32;
1150 pcre2_match_data_32 *mdata32_1;
1151 pcre2_match_data_32 *mdata32_2;
1152 pcre2_match_context_32 *mcontext32;
1153 PCRE2_SIZE *ovector32_1 = NULL;
1154 PCRE2_SIZE *ovector32_2 = NULL;
1155 int return_value32[2];
1159 #if defined SUPPORT_PCRE2_8
1160 PCRE2_UCHAR8 cpu_info[128];
1161 #elif defined SUPPORT_PCRE2_16
1162 PCRE2_UCHAR16 cpu_info[128];
1163 #elif defined SUPPORT_PCRE2_32
1164 PCRE2_UCHAR32 cpu_info[128];
1166 #if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE2_8) + defined(SUPPORT_PCRE2_16) + defined(SUPPORT_PCRE2_32)) >= 2)
1170 /* This test compares the behaviour of interpreter and JIT. Although disabling
1171 utf or ucp may make tests fail, if the pcre_exec result is the SAME, it is
1172 still considered successful from pcre_jit_test point of view. */
1174 #if defined SUPPORT_PCRE2_8
1175 pcre2_config_8(PCRE2_CONFIG_JITTARGET, &cpu_info);
1176 #elif defined SUPPORT_PCRE2_16
1177 pcre2_config_16(PCRE2_CONFIG_JITTARGET, &cpu_info);
1178 #elif defined SUPPORT_PCRE2_32
1179 pcre2_config_32(PCRE2_CONFIG_JITTARGET, &cpu_info);
1182 printf("Running JIT regression tests\n");
1183 printf(" target CPU of SLJIT compiler: ");
1184 for (i = 0; cpu_info[i]; i++)
1185 printf("%c", (char)(cpu_info[i]));
1188 #if defined SUPPORT_PCRE2_8
1189 pcre2_config_8(PCRE2_CONFIG_UNICODE, &utf);
1190 #elif defined SUPPORT_PCRE2_16
1191 pcre2_config_16(PCRE2_CONFIG_UNICODE, &utf);
1192 #elif defined SUPPORT_PCRE2_32
1193 pcre2_config_32(PCRE2_CONFIG_UNICODE, &utf);
1197 disabled_options |= PCRE2_UTF;
1198 #ifdef SUPPORT_PCRE2_8
1199 printf(" in 8 bit mode with UTF-8 %s:\n", utf ? "enabled" : "disabled");
1201 #ifdef SUPPORT_PCRE2_16
1202 printf(" in 16 bit mode with UTF-16 %s:\n", utf ? "enabled" : "disabled");
1204 #ifdef SUPPORT_PCRE2_32
1205 printf(" in 32 bit mode with UTF-32 %s:\n", utf ? "enabled" : "disabled");
1208 while (current->pattern) {
1209 /* printf("\nPattern: %s :\n", current->pattern); */
1212 if (!(current->start_offset & F_PROPERTY))
1213 is_ascii = check_ascii(current->pattern) && check_ascii(current->input);
1215 if (current->match_options & PCRE2_PARTIAL_SOFT)
1216 jit_compile_mode = PCRE2_JIT_PARTIAL_SOFT;
1217 else if (current->match_options & PCRE2_PARTIAL_HARD)
1218 jit_compile_mode = PCRE2_JIT_PARTIAL_HARD;
1220 jit_compile_mode = PCRE2_JIT_COMPLETE;
1222 #ifdef SUPPORT_PCRE2_8
1224 ccontext8 = pcre2_compile_context_create_8(NULL);
1226 if (GET_NEWLINE(current->newline))
1227 pcre2_set_newline_8(ccontext8, GET_NEWLINE(current->newline));
1228 if (GET_BSR(current->newline))
1229 pcre2_set_bsr_8(ccontext8, GET_BSR(current->newline));
1231 if (!(current->start_offset & F_NO8)) {
1232 re8 = pcre2_compile_8((PCRE2_SPTR8)current->pattern, PCRE2_ZERO_TERMINATED,
1233 current->compile_options & ~disabled_options,
1234 &error, &err_offs, ccontext8);
1236 if (!re8 && (utf || is_ascii))
1237 printf("\n8 bit: Cannot compile pattern \"%s\": %d\n", current->pattern, error);
1239 pcre2_compile_context_free_8(ccontext8);
1242 printf("\n8 bit: Cannot allocate compile context\n");
1244 #ifdef SUPPORT_PCRE2_16
1245 if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
1246 convert_utf8_to_utf16((PCRE2_SPTR8)current->pattern, regtest_buf16, NULL, REGTEST_MAX_LENGTH16);
1248 copy_char8_to_char16((PCRE2_SPTR8)current->pattern, regtest_buf16, REGTEST_MAX_LENGTH16);
1251 ccontext16 = pcre2_compile_context_create_16(NULL);
1253 if (GET_NEWLINE(current->newline))
1254 pcre2_set_newline_16(ccontext16, GET_NEWLINE(current->newline));
1255 if (GET_BSR(current->newline))
1256 pcre2_set_bsr_16(ccontext16, GET_BSR(current->newline));
1258 if (!(current->start_offset & F_NO16)) {
1259 re16 = pcre2_compile_16(regtest_buf16, PCRE2_ZERO_TERMINATED,
1260 current->compile_options & ~disabled_options,
1261 &error, &err_offs, ccontext16);
1263 if (!re16 && (utf || is_ascii))
1264 printf("\n16 bit: Cannot compile pattern \"%s\": %d\n", current->pattern, error);
1266 pcre2_compile_context_free_16(ccontext16);
1269 printf("\n16 bit: Cannot allocate compile context\n");
1271 #ifdef SUPPORT_PCRE2_32
1272 if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
1273 convert_utf8_to_utf32((PCRE2_SPTR8)current->pattern, regtest_buf32, NULL, REGTEST_MAX_LENGTH32);
1275 copy_char8_to_char32((PCRE2_SPTR8)current->pattern, regtest_buf32, REGTEST_MAX_LENGTH32);
1278 ccontext32 = pcre2_compile_context_create_32(NULL);
1280 if (GET_NEWLINE(current->newline))
1281 pcre2_set_newline_32(ccontext32, GET_NEWLINE(current->newline));
1282 if (GET_BSR(current->newline))
1283 pcre2_set_bsr_32(ccontext32, GET_BSR(current->newline));
1285 if (!(current->start_offset & F_NO32)) {
1286 re32 = pcre2_compile_32(regtest_buf32, PCRE2_ZERO_TERMINATED,
1287 current->compile_options & ~disabled_options,
1288 &error, &err_offs, ccontext32);
1290 if (!re32 && (utf || is_ascii))
1291 printf("\n32 bit: Cannot compile pattern \"%s\": %d\n", current->pattern, error);
1293 pcre2_compile_context_free_32(ccontext32);
1296 printf("\n32 bit: Cannot allocate compile context\n");
1300 if ((counter & 0x3) != 0) {
1301 #ifdef SUPPORT_PCRE2_8
1304 #ifdef SUPPORT_PCRE2_16
1307 #ifdef SUPPORT_PCRE2_32
1312 #ifdef SUPPORT_PCRE2_8
1313 return_value8[0] = -1000;
1314 return_value8[1] = -1000;
1315 mdata8_1 = pcre2_match_data_create_8(OVECTOR_SIZE, NULL);
1316 mdata8_2 = pcre2_match_data_create_8(OVECTOR_SIZE, NULL);
1317 mcontext8 = pcre2_match_context_create_8(NULL);
1318 if (!mdata8_1 || !mdata8_2 || !mcontext8) {
1319 printf("\n8 bit: Cannot allocate match data\n");
1320 pcre2_match_data_free_8(mdata8_1);
1321 pcre2_match_data_free_8(mdata8_2);
1322 pcre2_match_context_free_8(mcontext8);
1323 pcre2_code_free_8(re8);
1326 ovector8_1 = pcre2_get_ovector_pointer_8(mdata8_1);
1327 ovector8_2 = pcre2_get_ovector_pointer_8(mdata8_2);
1328 for (i = 0; i < OVECTOR_SIZE * 2; ++i)
1330 for (i = 0; i < OVECTOR_SIZE * 2; ++i)
1334 (void)pcre2_set_match_limit_8(mcontext8, 10000000);
1335 return_value8[1] = pcre2_match_8(re8, (PCRE2_SPTR8)current->input, strlen(current->input),
1336 current->start_offset & OFFSET_MASK, current->match_options, mdata8_2, mcontext8);
1338 if (pcre2_jit_compile_8(re8, jit_compile_mode)) {
1339 printf("\n8 bit: JIT compiler does not support \"%s\"\n", current->pattern);
1340 } else if ((counter & 0x1) != 0) {
1341 setstack8(mcontext8);
1342 return_value8[0] = pcre2_match_8(re8, (PCRE2_SPTR8)current->input, strlen(current->input),
1343 current->start_offset & OFFSET_MASK, current->match_options, mdata8_1, mcontext8);
1345 pcre2_jit_stack_assign_8(mcontext8, NULL, getstack8());
1346 return_value8[0] = pcre2_jit_match_8(re8, (PCRE2_SPTR8)current->input, strlen(current->input),
1347 current->start_offset & OFFSET_MASK, current->match_options, mdata8_1, mcontext8);
1352 #ifdef SUPPORT_PCRE2_16
1353 return_value16[0] = -1000;
1354 return_value16[1] = -1000;
1355 mdata16_1 = pcre2_match_data_create_16(OVECTOR_SIZE, NULL);
1356 mdata16_2 = pcre2_match_data_create_16(OVECTOR_SIZE, NULL);
1357 mcontext16 = pcre2_match_context_create_16(NULL);
1358 if (!mdata16_1 || !mdata16_2 || !mcontext16) {
1359 printf("\n16 bit: Cannot allocate match data\n");
1360 pcre2_match_data_free_16(mdata16_1);
1361 pcre2_match_data_free_16(mdata16_2);
1362 pcre2_match_context_free_16(mcontext16);
1363 pcre2_code_free_16(re16);
1366 ovector16_1 = pcre2_get_ovector_pointer_16(mdata16_1);
1367 ovector16_2 = pcre2_get_ovector_pointer_16(mdata16_2);
1368 for (i = 0; i < OVECTOR_SIZE * 2; ++i)
1369 ovector16_1[i] = -2;
1370 for (i = 0; i < OVECTOR_SIZE * 2; ++i)
1371 ovector16_2[i] = -2;
1374 if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
1375 length16 = convert_utf8_to_utf16((PCRE2_SPTR8)current->input, regtest_buf16, regtest_offsetmap16, REGTEST_MAX_LENGTH16);
1377 length16 = copy_char8_to_char16((PCRE2_SPTR8)current->input, regtest_buf16, REGTEST_MAX_LENGTH16);
1379 (void)pcre2_set_match_limit_16(mcontext16, 10000000);
1380 return_value16[1] = pcre2_match_16(re16, regtest_buf16, length16,
1381 current->start_offset & OFFSET_MASK, current->match_options, mdata16_2, mcontext16);
1383 if (pcre2_jit_compile_16(re16, jit_compile_mode)) {
1384 printf("\n16 bit: JIT compiler does not support \"%s\"\n", current->pattern);
1385 } else if ((counter & 0x1) != 0) {
1386 setstack16(mcontext16);
1387 return_value16[0] = pcre2_match_16(re16, regtest_buf16, length16,
1388 current->start_offset & OFFSET_MASK, current->match_options, mdata16_1, mcontext16);
1390 pcre2_jit_stack_assign_16(mcontext16, NULL, getstack16());
1391 return_value16[0] = pcre2_jit_match_16(re16, regtest_buf16, length16,
1392 current->start_offset & OFFSET_MASK, current->match_options, mdata16_1, mcontext16);
1397 #ifdef SUPPORT_PCRE2_32
1398 return_value32[0] = -1000;
1399 return_value32[1] = -1000;
1400 mdata32_1 = pcre2_match_data_create_32(OVECTOR_SIZE, NULL);
1401 mdata32_2 = pcre2_match_data_create_32(OVECTOR_SIZE, NULL);
1402 mcontext32 = pcre2_match_context_create_32(NULL);
1403 if (!mdata32_1 || !mdata32_2 || !mcontext32) {
1404 printf("\n32 bit: Cannot allocate match data\n");
1405 pcre2_match_data_free_32(mdata32_1);
1406 pcre2_match_data_free_32(mdata32_2);
1407 pcre2_match_context_free_32(mcontext32);
1408 pcre2_code_free_32(re32);
1411 ovector32_1 = pcre2_get_ovector_pointer_32(mdata32_1);
1412 ovector32_2 = pcre2_get_ovector_pointer_32(mdata32_2);
1413 for (i = 0; i < OVECTOR_SIZE * 2; ++i)
1414 ovector32_1[i] = -2;
1415 for (i = 0; i < OVECTOR_SIZE * 2; ++i)
1416 ovector32_2[i] = -2;
1419 if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
1420 length32 = convert_utf8_to_utf32((PCRE2_SPTR8)current->input, regtest_buf32, regtest_offsetmap32, REGTEST_MAX_LENGTH32);
1422 length32 = copy_char8_to_char32((PCRE2_SPTR8)current->input, regtest_buf32, REGTEST_MAX_LENGTH32);
1424 (void)pcre2_set_match_limit_32(mcontext32, 10000000);
1425 return_value32[1] = pcre2_match_32(re32, regtest_buf32, length32,
1426 current->start_offset & OFFSET_MASK, current->match_options, mdata32_2, mcontext32);
1428 if (pcre2_jit_compile_32(re32, jit_compile_mode)) {
1429 printf("\n32 bit: JIT compiler does not support \"%s\"\n", current->pattern);
1430 } else if ((counter & 0x1) != 0) {
1431 setstack32(mcontext32);
1432 return_value32[0] = pcre2_match_32(re32, regtest_buf32, length32,
1433 current->start_offset & OFFSET_MASK, current->match_options, mdata32_1, mcontext32);
1435 pcre2_jit_stack_assign_32(mcontext32, NULL, getstack32());
1436 return_value32[0] = pcre2_jit_match_32(re32, regtest_buf32, length32,
1437 current->start_offset & OFFSET_MASK, current->match_options, mdata32_1, mcontext32);
1442 /* printf("[%d-%d-%d|%d-%d|%d-%d|%d-%d]%s",
1443 return_value8[0], return_value16[0], return_value32[0],
1444 (int)ovector8_1[0], (int)ovector8_1[1],
1445 (int)ovector16_1[0], (int)ovector16_1[1],
1446 (int)ovector32_1[0], (int)ovector32_1[1],
1447 (current->compile_options & PCRE2_CASELESS) ? "C" : ""); */
1449 /* If F_DIFF is set, just run the test, but do not compare the results.
1450 Segfaults can still be captured. */
1453 if (!(current->start_offset & F_DIFF)) {
1454 #if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE2_8) + defined(SUPPORT_PCRE2_16) + defined(SUPPORT_PCRE2_32)) >= 2)
1455 if (!(current->start_offset & F_FORCECONV)) {
1457 /* All results must be the same. */
1458 #ifdef SUPPORT_PCRE2_8
1459 if ((return_value = return_value8[0]) != return_value8[1]) {
1460 printf("\n8 bit: Return value differs(J8:%d,I8:%d): [%d] '%s' @ '%s'\n",
1461 return_value8[0], return_value8[1], total, current->pattern, current->input);
1465 #ifdef SUPPORT_PCRE2_16
1466 if ((return_value = return_value16[0]) != return_value16[1]) {
1467 printf("\n16 bit: Return value differs(J16:%d,I16:%d): [%d] '%s' @ '%s'\n",
1468 return_value16[0], return_value16[1], total, current->pattern, current->input);
1472 #ifdef SUPPORT_PCRE2_32
1473 if ((return_value = return_value32[0]) != return_value32[1]) {
1474 printf("\n32 bit: Return value differs(J32:%d,I32:%d): [%d] '%s' @ '%s'\n",
1475 return_value32[0], return_value32[1], total, current->pattern, current->input);
1479 #if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_16
1480 if (return_value8[0] != return_value16[0]) {
1481 printf("\n8 and 16 bit: Return value differs(J8:%d,J16:%d): [%d] '%s' @ '%s'\n",
1482 return_value8[0], return_value16[0],
1483 total, current->pattern, current->input);
1487 #if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_32
1488 if (return_value8[0] != return_value32[0]) {
1489 printf("\n8 and 32 bit: Return value differs(J8:%d,J32:%d): [%d] '%s' @ '%s'\n",
1490 return_value8[0], return_value32[0],
1491 total, current->pattern, current->input);
1495 #if defined SUPPORT_PCRE2_16 && defined SUPPORT_PCRE2_32
1496 if (return_value16[0] != return_value32[0]) {
1497 printf("\n16 and 32 bit: Return value differs(J16:%d,J32:%d): [%d] '%s' @ '%s'\n",
1498 return_value16[0], return_value32[0],
1499 total, current->pattern, current->input);
1503 if (return_value >= 0 || return_value == PCRE_ERROR_PARTIAL) {
1504 if (return_value == PCRE_ERROR_PARTIAL) {
1509 #ifdef SUPPORT_PCRE2_8
1510 return_value8[0] = return_value;
1512 #ifdef SUPPORT_PCRE2_16
1513 return_value16[0] = return_value;
1515 #ifdef SUPPORT_PCRE2_32
1516 return_value32[0] = return_value;
1518 /* Transform back the results. */
1519 if (current->flags & PCRE_UTF8) {
1520 #ifdef SUPPORT_PCRE2_16
1521 for (i = 0; i < return_value; ++i) {
1522 if (ovector16_1[i] >= 0)
1523 ovector16_1[i] = regtest_offsetmap16[ovector16_1[i]];
1524 if (ovector16_2[i] >= 0)
1525 ovector16_2[i] = regtest_offsetmap16[ovector16_2[i]];
1528 #ifdef SUPPORT_PCRE2_32
1529 for (i = 0; i < return_value; ++i) {
1530 if (ovector32_1[i] >= 0)
1531 ovector32_1[i] = regtest_offsetmap32[ovector32_1[i]];
1532 if (ovector32_2[i] >= 0)
1533 ovector32_2[i] = regtest_offsetmap32[ovector32_2[i]];
1538 for (i = 0; i < return_value; ++i) {
1539 #if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_16
1540 if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector16_1[i] || ovector8_1[i] != ovector16_2[i]) {
1541 printf("\n8 and 16 bit: Ovector[%d] value differs(J8:%d,I8:%d,J16:%d,I16:%d): [%d] '%s' @ '%s' \n",
1542 i, ovector8_1[i], ovector8_2[i], ovector16_1[i], ovector16_2[i],
1543 total, current->pattern, current->input);
1547 #if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_32
1548 if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector32_1[i] || ovector8_1[i] != ovector32_2[i]) {
1549 printf("\n8 and 32 bit: Ovector[%d] value differs(J8:%d,I8:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
1550 i, ovector8_1[i], ovector8_2[i], ovector32_1[i], ovector32_2[i],
1551 total, current->pattern, current->input);
1555 #if defined SUPPORT_PCRE2_16 && defined SUPPORT_PCRE2_32
1556 if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector32_1[i] || ovector16_1[i] != ovector32_2[i]) {
1557 printf("\n16 and 32 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
1558 i, ovector16_1[i], ovector16_2[i], ovector32_1[i], ovector32_2[i],
1559 total, current->pattern, current->input);
1566 #endif /* more than one of SUPPORT_PCRE2_8, SUPPORT_PCRE2_16 and SUPPORT_PCRE2_32 */
1568 #ifdef SUPPORT_PCRE2_8
1569 if (return_value8[0] != return_value8[1]) {
1570 printf("\n8 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
1571 return_value8[0], return_value8[1], total, current->pattern, current->input);
1573 } else if (return_value8[0] >= 0 || return_value8[0] == PCRE2_ERROR_PARTIAL) {
1574 if (return_value8[0] == PCRE2_ERROR_PARTIAL)
1575 return_value8[0] = 2;
1577 return_value8[0] *= 2;
1579 for (i = 0; i < return_value8[0]; ++i)
1580 if (ovector8_1[i] != ovector8_2[i]) {
1581 printf("\n8 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
1582 i, (int)ovector8_1[i], (int)ovector8_2[i], total, current->pattern, current->input);
1588 #ifdef SUPPORT_PCRE2_16
1589 if (return_value16[0] != return_value16[1]) {
1590 printf("\n16 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
1591 return_value16[0], return_value16[1], total, current->pattern, current->input);
1593 } else if (return_value16[0] >= 0 || return_value16[0] == PCRE2_ERROR_PARTIAL) {
1594 if (return_value16[0] == PCRE2_ERROR_PARTIAL)
1595 return_value16[0] = 2;
1597 return_value16[0] *= 2;
1599 for (i = 0; i < return_value16[0]; ++i)
1600 if (ovector16_1[i] != ovector16_2[i]) {
1601 printf("\n16 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
1602 i, (int)ovector16_1[i], (int)ovector16_2[i], total, current->pattern, current->input);
1608 #ifdef SUPPORT_PCRE2_32
1609 if (return_value32[0] != return_value32[1]) {
1610 printf("\n32 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
1611 return_value32[0], return_value32[1], total, current->pattern, current->input);
1613 } else if (return_value32[0] >= 0 || return_value32[0] == PCRE2_ERROR_PARTIAL) {
1614 if (return_value32[0] == PCRE2_ERROR_PARTIAL)
1615 return_value32[0] = 2;
1617 return_value32[0] *= 2;
1619 for (i = 0; i < return_value32[0]; ++i)
1620 if (ovector32_1[i] != ovector32_2[i]) {
1621 printf("\n32 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
1622 i, (int)ovector32_1[i], (int)ovector32_2[i], total, current->pattern, current->input);
1630 if (is_successful) {
1631 #ifdef SUPPORT_PCRE2_8
1632 if (!(current->start_offset & F_NO8) && (utf || is_ascii)) {
1633 if (return_value8[0] < 0 && !(current->start_offset & F_NOMATCH)) {
1634 printf("8 bit: Test should match: [%d] '%s' @ '%s'\n",
1635 total, current->pattern, current->input);
1639 if (return_value8[0] >= 0 && (current->start_offset & F_NOMATCH)) {
1640 printf("8 bit: Test should not match: [%d] '%s' @ '%s'\n",
1641 total, current->pattern, current->input);
1646 #ifdef SUPPORT_PCRE2_16
1647 if (!(current->start_offset & F_NO16) && (utf || is_ascii)) {
1648 if (return_value16[0] < 0 && !(current->start_offset & F_NOMATCH)) {
1649 printf("16 bit: Test should match: [%d] '%s' @ '%s'\n",
1650 total, current->pattern, current->input);
1654 if (return_value16[0] >= 0 && (current->start_offset & F_NOMATCH)) {
1655 printf("16 bit: Test should not match: [%d] '%s' @ '%s'\n",
1656 total, current->pattern, current->input);
1661 #ifdef SUPPORT_PCRE2_32
1662 if (!(current->start_offset & F_NO32) && (utf || is_ascii)) {
1663 if (return_value32[0] < 0 && !(current->start_offset & F_NOMATCH)) {
1664 printf("32 bit: Test should match: [%d] '%s' @ '%s'\n",
1665 total, current->pattern, current->input);
1669 if (return_value32[0] >= 0 && (current->start_offset & F_NOMATCH)) {
1670 printf("32 bit: Test should not match: [%d] '%s' @ '%s'\n",
1671 total, current->pattern, current->input);
1678 if (is_successful) {
1679 #ifdef SUPPORT_PCRE2_8
1680 if (re8 && !(current->start_offset & F_NO8) && pcre2_get_mark_8(mdata8_1) != pcre2_get_mark_8(mdata8_2)) {
1681 printf("8 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
1682 total, current->pattern, current->input);
1686 #ifdef SUPPORT_PCRE2_16
1687 if (re16 && !(current->start_offset & F_NO16) && pcre2_get_mark_16(mdata16_1) != pcre2_get_mark_16(mdata16_2)) {
1688 printf("16 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
1689 total, current->pattern, current->input);
1693 #ifdef SUPPORT_PCRE2_32
1694 if (re32 && !(current->start_offset & F_NO32) && pcre2_get_mark_32(mdata32_1) != pcre2_get_mark_32(mdata32_2)) {
1695 printf("32 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
1696 total, current->pattern, current->input);
1702 #ifdef SUPPORT_PCRE2_8
1703 pcre2_code_free_8(re8);
1704 pcre2_match_data_free_8(mdata8_1);
1705 pcre2_match_data_free_8(mdata8_2);
1706 pcre2_match_context_free_8(mcontext8);
1708 #ifdef SUPPORT_PCRE2_16
1709 pcre2_code_free_16(re16);
1710 pcre2_match_data_free_16(mdata16_1);
1711 pcre2_match_data_free_16(mdata16_2);
1712 pcre2_match_context_free_16(mcontext16);
1714 #ifdef SUPPORT_PCRE2_32
1715 pcre2_code_free_32(re32);
1716 pcre2_match_data_free_32(mdata32_1);
1717 pcre2_match_data_free_32(mdata32_2);
1718 pcre2_match_context_free_32(mcontext32);
1721 if (is_successful) {
1725 if (successful_row >= 60) {
1735 #ifdef SUPPORT_PCRE2_8
1738 #ifdef SUPPORT_PCRE2_16
1741 #ifdef SUPPORT_PCRE2_32
1745 if (total == successful) {
1746 printf("\nAll JIT regression tests are successfully passed.\n");
1749 printf("\nSuccessful test ratio: %d%% (%d failed)\n", successful * 100 / total, total - successful);
1754 /* End of pcre2_jit_test.c */