• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*************************************************
2 *      Perl-Compatible Regular Expressions       *
3 *************************************************/
4 
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.
7 
8                   Main Library written by Philip Hazel
9            Copyright (c) 1997-2012 University of Cambridge
10 
11   This JIT compiler regression test program was written by Zoltan Herczeg
12                       Copyright (c) 2010-2012
13 
14 -----------------------------------------------------------------------------
15 Redistribution and use in source and binary forms, with or without
16 modification, are permitted provided that the following conditions are met:
17 
18     * Redistributions of source code must retain the above copyright notice,
19       this list of conditions and the following disclaimer.
20 
21     * Redistributions in binary form must reproduce the above copyright
22       notice, this list of conditions and the following disclaimer in the
23       documentation and/or other materials provided with the distribution.
24 
25     * Neither the name of the University of Cambridge nor the names of its
26       contributors may be used to endorse or promote products derived from
27       this software without specific prior written permission.
28 
29 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
30 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
33 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
34 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
35 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
36 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
37 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 POSSIBILITY OF SUCH DAMAGE.
40 -----------------------------------------------------------------------------
41 */
42 
43 #ifdef HAVE_CONFIG_H
44 #include "config.h"
45 #endif
46 
47 #include <stdio.h>
48 #include <string.h>
49 #include "pcre.h"
50 
51 
52 #include "pcre_internal.h"
53 
54 #define PCRE_BUG 0x80000000
55 
56 /*
57  Letter characters:
58    \xe6\x92\xad = 0x64ad = 25773 (kanji)
59  Non-letter characters:
60    \xc2\xa1 = 0xa1 =  (Inverted Exclamation Mark)
61    \xf3\xa9\xb7\x80 = 0xe9dc0 = 957888
62    \xed\xa0\x80 = 55296 = 0xd800 (Invalid UTF character)
63    \xed\xb0\x80 = 56320 = 0xdc00 (Invalid UTF character)
64  Newlines:
65    \xc2\x85 = 0x85 = 133 (NExt Line = NEL)
66    \xe2\x80\xa8 = 0x2028 = 8232 (Line Separator)
67  Othercase pairs:
68    \xc3\xa9 = 0xe9 = 233 (e')
69       \xc3\x89 = 0xc9 = 201 (E')
70    \xc3\xa1 = 0xe1 = 225 (a')
71       \xc3\x81 = 0xc1 = 193 (A')
72    \xc8\xba = 0x23a = 570
73       \xe2\xb1\xa5 = 0x2c65 = 11365
74    \xe1\xbd\xb8 = 0x1f78 = 8056
75       \xe1\xbf\xb8 = 0x1ff8 = 8184
76    \xf0\x90\x90\x80 = 0x10400 = 66560
77       \xf0\x90\x90\xa8 = 0x10428 = 66600
78    \xc7\x84 = 0x1c4 = 452
79      \xc7\x85 = 0x1c5 = 453
80      \xc7\x86 = 0x1c6 = 454
81 
82  Mark property:
83    \xcc\x8d = 0x30d = 781
84  Special:
85    \xc2\x80 = 0x80 = 128 (lowest 2 byte character)
86    \xdf\xbf = 0x7ff = 2047 (highest 2 byte character)
87    \xe0\xa0\x80 = 0x800 = 2048 (lowest 2 byte character)
88    \xef\xbf\xbf = 0xffff = 65535 (highest 3 byte character)
89    \xf0\x90\x80\x80 = 0x10000 = 65536 (lowest 4 byte character)
90    \xf4\x8f\xbf\xbf = 0x10ffff = 1114111 (highest allowed utf character)
91 */
92 
93 static int regression_tests(void);
94 
main(void)95 int main(void)
96 {
97 	int jit = 0;
98 #if defined SUPPORT_PCRE8
99 	pcre_config(PCRE_CONFIG_JIT, &jit);
100 #elif defined SUPPORT_PCRE16
101 	pcre16_config(PCRE_CONFIG_JIT, &jit);
102 #elif defined SUPPORT_PCRE32
103 	pcre32_config(PCRE_CONFIG_JIT, &jit);
104 #endif
105 	if (!jit) {
106 		printf("JIT must be enabled to run pcre_jit_test\n");
107 		return 1;
108 	}
109 	return regression_tests();
110 }
111 
112 /* --------------------------------------------------------------------------------------- */
113 
114 #if !(defined SUPPORT_PCRE8) && !(defined SUPPORT_PCRE16) && !(defined SUPPORT_PCRE32)
115 #error SUPPORT_PCRE8 or SUPPORT_PCRE16 or SUPPORT_PCRE32 must be defined
116 #endif
117 
118 #define MUA	(PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)
119 #define MUAP	(PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
120 #define CMUA	(PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)
121 #define CMUAP	(PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
122 #define MA	(PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)
123 #define MAP	(PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
124 #define CMA	(PCRE_CASELESS | PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)
125 
126 #define OFFSET_MASK	0x00ffff
127 #define F_NO8		0x010000
128 #define F_NO16		0x020000
129 #define F_NO32		0x020000
130 #define F_NOMATCH	0x040000
131 #define F_DIFF		0x080000
132 #define F_FORCECONV	0x100000
133 #define F_PROPERTY	0x200000
134 #define F_STUDY		0x400000
135 
136 struct regression_test_case {
137 	int flags;
138 	int start_offset;
139 	const char *pattern;
140 	const char *input;
141 };
142 
143 static struct regression_test_case regression_test_cases[] = {
144 	/* Constant strings. */
145 	{ MUA, 0, "AbC", "AbAbC" },
146 	{ MUA, 0, "ACCEPT", "AACACCACCEACCEPACCEPTACCEPTT" },
147 	{ CMUA, 0, "aA#\xc3\xa9\xc3\x81", "aA#Aa#\xc3\x89\xc3\xa1" },
148 	{ MA, 0, "[^a]", "aAbB" },
149 	{ CMA, 0, "[^m]", "mMnN" },
150 	{ MA, 0, "a[^b][^#]", "abacd" },
151 	{ CMA, 0, "A[^B][^E]", "abacd" },
152 	{ CMUA, 0, "[^x][^#]", "XxBll" },
153 	{ MUA, 0, "[^a]", "aaa\xc3\xa1#Ab" },
154 	{ CMUA, 0, "[^A]", "aA\xe6\x92\xad" },
155 	{ MUA, 0, "\\W(\\W)?\\w", "\r\n+bc" },
156 	{ MUA, 0, "\\W(\\W)?\\w", "\n\r+bc" },
157 	{ MUA, 0, "\\W(\\W)?\\w", "\r\r+bc" },
158 	{ MUA, 0, "\\W(\\W)?\\w", "\n\n+bc" },
159 	{ MUA, 0, "[axd]", "sAXd" },
160 	{ CMUA, 0, "[axd]", "sAXd" },
161 	{ CMUA, 0 | F_NOMATCH, "[^axd]", "DxA" },
162 	{ MUA, 0, "[a-dA-C]", "\xe6\x92\xad\xc3\xa9.B" },
163 	{ MUA, 0, "[^a-dA-C]", "\xe6\x92\xad\xc3\xa9" },
164 	{ CMUA, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
165 	{ MUA, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
166 	{ MUA, 0, "[^a]", "\xc2\x80[]" },
167 	{ CMUA, 0, "\xf0\x90\x90\xa7", "\xf0\x90\x91\x8f" },
168 	{ CMA, 0, "1a2b3c4", "1a2B3c51A2B3C4" },
169 	{ PCRE_CASELESS, 0, "\xff#a", "\xff#\xff\xfe##\xff#A" },
170 	{ PCRE_CASELESS, 0, "\xfe", "\xff\xfc#\xfe\xfe" },
171 	{ PCRE_CASELESS, 0, "a1", "Aa1" },
172 	{ MA, 0, "\\Ca", "cda" },
173 	{ CMA, 0, "\\Ca", "CDA" },
174 	{ MA, 0 | F_NOMATCH, "\\Cx", "cda" },
175 	{ CMA, 0 | F_NOMATCH, "\\Cx", "CDA" },
176 	{ CMUAP, 0, "\xf0\x90\x90\x80\xf0\x90\x90\xa8", "\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
177 	{ CMUAP, 0, "\xf0\x90\x90\x80{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
178 	{ CMUAP, 0, "\xf0\x90\x90\xa8{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
179 	{ CMUAP, 0, "\xe1\xbd\xb8\xe1\xbf\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
180 
181 	/* Assertions. */
182 	{ MUA, 0, "\\b[^A]", "A_B#" },
183 	{ MA, 0 | F_NOMATCH, "\\b\\W", "\n*" },
184 	{ MUA, 0, "\\B[^,]\\b[^s]\\b", "#X" },
185 	{ MAP, 0, "\\B", "_\xa1" },
186 	{ MAP, 0, "\\b_\\b[,A]\\B", "_," },
187 	{ MUAP, 0, "\\b", "\xe6\x92\xad!" },
188 	{ MUAP, 0, "\\B", "_\xc2\xa1\xc3\xa1\xc2\x85" },
189 	{ MUAP, 0, "\\b[^A]\\B[^c]\\b[^_]\\B", "_\xc3\xa1\xe2\x80\xa8" },
190 	{ MUAP, 0, "\\b\\w+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
191 	{ MUA, 0 | F_NOMATCH, "\\b.", "\xcd\xbe" },
192 	{ CMUAP, 0, "\\By", "\xf0\x90\x90\xa8y" },
193 	{ MA, 0 | F_NOMATCH, "\\R^", "\n" },
194 	{ MA, 1 | F_NOMATCH, "^", "\n" },
195 	{ 0, 0, "^ab", "ab" },
196 	{ 0, 0 | F_NOMATCH, "^ab", "aab" },
197 	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "^a", "\r\raa\n\naa\r\naa" },
198 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, "^-", "\xe2\x80\xa8--\xc2\x85-\r\n-" },
199 	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "^-", "a--b--\x85--" },
200 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "^-", "a--\xe2\x80\xa8--" },
201 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "^-", "a--\xc2\x85--" },
202 	{ 0, 0, "ab$", "ab" },
203 	{ 0, 0 | F_NOMATCH, "ab$", "abab\n\n" },
204 	{ PCRE_DOLLAR_ENDONLY, 0 | F_NOMATCH, "ab$", "abab\r\n" },
205 	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "a$", "\r\raa\n\naa\r\naa" },
206 	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "a$", "aaa" },
207 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, "#$", "#\xc2\x85###\r#" },
208 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "#$", "#\xe2\x80\xa9" },
209 	{ PCRE_NOTBOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "^a", "aa\naa" },
210 	{ PCRE_NOTBOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "^a", "aa\naa" },
211 	{ PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "a$", "aa\naa" },
212 	{ PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "a$", "aa\r\n" },
213 	{ PCRE_UTF8 | PCRE_DOLLAR_ENDONLY | PCRE_NEWLINE_ANY, 0 | F_PROPERTY, "\\p{Any}{2,}$", "aa\r\n" },
214 	{ PCRE_NOTEOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "a$", "aa\naa" },
215 	{ PCRE_NEWLINE_CR, 0, ".\\Z", "aaa" },
216 	{ PCRE_NEWLINE_CR | PCRE_UTF8, 0, "a\\Z", "aaa\r" },
217 	{ PCRE_NEWLINE_CR, 0, ".\\Z", "aaa\n" },
218 	{ PCRE_NEWLINE_CRLF, 0, ".\\Z", "aaa\r" },
219 	{ PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" },
220 	{ PCRE_NEWLINE_CRLF, 0, ".\\Z", "aaa\r\n" },
221 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa" },
222 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r" },
223 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" },
224 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r\n" },
225 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\xe2\x80\xa8" },
226 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa" },
227 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r" },
228 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" },
229 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r\n" },
230 	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, ".\\Z", "aaa\xc2\x85" },
231 	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, ".\\Z", "aaa\xe2\x80\xa8" },
232 	{ MA, 0, "\\Aa", "aaa" },
233 	{ MA, 1 | F_NOMATCH, "\\Aa", "aaa" },
234 	{ MA, 1, "\\Ga", "aaa" },
235 	{ MA, 1 | F_NOMATCH, "\\Ga", "aba" },
236 	{ MA, 0, "a\\z", "aaa" },
237 	{ MA, 0 | F_NOMATCH, "a\\z", "aab" },
238 
239 	/* Brackets. */
240 	{ MUA, 0, "(ab|bb|cd)", "bacde" },
241 	{ MUA, 0, "(?:ab|a)(bc|c)", "ababc" },
242 	{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" },
243 	{ CMUA, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" },
244 	{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" },
245 	{ MUA, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" },
246 
247 	/* Greedy and non-greedy ? operators. */
248 	{ MUA, 0, "(?:a)?a", "laab" },
249 	{ CMUA, 0, "(A)?A", "llaab" },
250 	{ MUA, 0, "(a)?\?a", "aab" }, /* ?? is the prefix of trygraphs in GCC. */
251 	{ MUA, 0, "(a)?a", "manm" },
252 	{ CMUA, 0, "(a|b)?\?d((?:e)?)", "ABABdx" },
253 	{ MUA, 0, "(a|b)?\?d((?:e)?)", "abcde" },
254 	{ MUA, 0, "((?:ab)?\?g|b(?:g(nn|d)?\?)?)?\?(?:n)?m", "abgnbgnnbgdnmm" },
255 
256 	/* Greedy and non-greedy + operators */
257 	{ MUA, 0, "(aa)+aa", "aaaaaaa" },
258 	{ MUA, 0, "(aa)+?aa", "aaaaaaa" },
259 	{ MUA, 0, "(?:aba|ab|a)+l", "ababamababal" },
260 	{ MUA, 0, "(?:aba|ab|a)+?l", "ababamababal" },
261 	{ MUA, 0, "(a(?:bc|cb|b|c)+?|ss)+e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
262 	{ MUA, 0, "(a(?:bc|cb|b|c)+|ss)+?e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
263 	{ MUA, 0, "(?:(b(c)+?)+)?\?(?:(bc)+|(cb)+)+(?:m)+", "bccbcccbcbccbcbPbccbcccbcbccbcbmmn" },
264 
265 	/* Greedy and non-greedy * operators */
266 	{ CMUA, 0, "(?:AA)*AB", "aaaaaaamaaaaaaab" },
267 	{ MUA, 0, "(?:aa)*?ab", "aaaaaaamaaaaaaab" },
268 	{ MUA, 0, "(aa|ab)*ab", "aaabaaab" },
269 	{ CMUA, 0, "(aa|Ab)*?aB", "aaabaaab" },
270 	{ MUA, 0, "(a|b)*(?:a)*(?:b)*m", "abbbaaababanabbbaaababamm" },
271 	{ MUA, 0, "(a|b)*?(?:a)*?(?:b)*?m", "abbbaaababanabbbaaababamm" },
272 	{ MA, 0, "a(a(\\1*)a|(b)b+){0}a", "aa" },
273 	{ MA, 0, "((?:a|)*){0}a", "a" },
274 
275 	/* Combining ? + * operators */
276 	{ MUA, 0, "((bm)+)?\?(?:a)*(bm)+n|((am)+?)?(?:a)+(am)*n", "bmbmabmamaaamambmaman" },
277 	{ MUA, 0, "(((ab)?cd)*ef)+g", "abcdcdefcdefefmabcdcdefcdefefgg" },
278 	{ MUA, 0, "(((ab)?\?cd)*?ef)+?g", "abcdcdefcdefefmabcdcdefcdefefgg" },
279 	{ MUA, 0, "(?:(ab)?c|(?:ab)+?d)*g", "ababcdccababddg" },
280 	{ MUA, 0, "(?:(?:ab)?\?c|(ab)+d)*?g", "ababcdccababddg" },
281 
282 	/* Single character iterators. */
283 	{ MUA, 0, "(a+aab)+aaaab", "aaaabcaaaabaabcaabcaaabaaaab" },
284 	{ MUA, 0, "(a*a*aab)+x", "aaaaabaabaaabmaabx" },
285 	{ MUA, 0, "(a*?(b|ab)a*?)+x", "aaaabcxbbaabaacbaaabaabax" },
286 	{ MUA, 0, "(a+(ab|ad)a+)+x", "aaabaaaadaabaaabaaaadaaax" },
287 	{ MUA, 0, "(a?(a)a?)+(aaa)", "abaaabaaaaaaaa" },
288 	{ MUA, 0, "(a?\?(a)a?\?)+(b)", "aaaacaaacaacacbaaab" },
289 	{ MUA, 0, "(a{0,4}(b))+d", "aaaaaabaabcaaaaabaaaaabd" },
290 	{ MUA, 0, "(a{0,4}?[^b])+d+(a{0,4}[^b])d+", "aaaaadaaaacaadddaaddd" },
291 	{ MUA, 0, "(ba{2})+c", "baabaaabacbaabaac" },
292 	{ MUA, 0, "(a*+bc++)+", "aaabbcaaabcccab" },
293 	{ MUA, 0, "(a?+[^b])+", "babaacacb" },
294 	{ MUA, 0, "(a{0,3}+b)(a{0,3}+b)(a{0,3}+)[^c]", "abaabaaacbaabaaaac" },
295 	{ CMUA, 0, "([a-c]+[d-f]+?)+?g", "aBdacdehAbDaFgA" },
296 	{ CMUA, 0, "[c-f]+k", "DemmFke" },
297 	{ MUA, 0, "([DGH]{0,4}M)+", "GGDGHDGMMHMDHHGHM" },
298 	{ MUA, 0, "([a-c]{4,}s)+", "abasabbasbbaabsbba" },
299 	{ CMUA, 0, "[ace]{3,7}", "AcbDAcEEcEd" },
300 	{ CMUA, 0, "[ace]{3,7}?", "AcbDAcEEcEd" },
301 	{ CMUA, 0, "[ace]{3,}", "AcbDAcEEcEd" },
302 	{ CMUA, 0, "[ace]{3,}?", "AcbDAcEEcEd" },
303 	{ MUA, 0, "[ckl]{2,}?g", "cdkkmlglglkcg" },
304 	{ CMUA, 0, "[ace]{5}?", "AcCebDAcEEcEd" },
305 	{ MUA, 0, "([AbC]{3,5}?d)+", "BACaAbbAEAACCbdCCbdCCAAbb" },
306 	{ MUA, 0, "([^ab]{0,}s){2}", "abaabcdsABamsDDs" },
307 	{ MUA, 0, "\\b\\w+\\B", "x,a_cd" },
308 	{ MUAP, 0, "\\b[^\xc2\xa1]+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
309 	{ CMUA, 0, "[^b]+(a*)([^c]?d{3})", "aaaaddd" },
310 	{ CMUAP, 0, "\xe1\xbd\xb8{2}", "\xe1\xbf\xb8#\xe1\xbf\xb8\xe1\xbd\xb8" },
311 	{ CMUA, 0, "[^\xf0\x90\x90\x80]{2,4}@", "\xf0\x90\x90\xa8\xf0\x90\x90\x80###\xf0\x90\x90\x80@@@" },
312 	{ CMUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
313 	{ MUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
314 	{ MUA, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" },
315 
316 	/* Bracket repeats with limit. */
317 	{ MUA, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
318 	{ MUA, 0, "(?:ab|abab){1,5}M", "abababababababababababM" },
319 	{ MUA, 0, "(?>ab|abab){1,5}M", "abababababababababababM" },
320 	{ MUA, 0, "(?:ab|abab){1,5}?M", "abababababababababababM" },
321 	{ MUA, 0, "(?>ab|abab){1,5}?M", "abababababababababababM" },
322 	{ MUA, 0, "(?:(ab){1,4}?){1,3}?M", "abababababababababababababM" },
323 	{ MUA, 0, "(?:(ab){1,4}){1,3}abababababababababababM", "ababababababababababababM" },
324 	{ MUA, 0 | F_NOMATCH, "(?:(ab){1,4}){1,3}abababababababababababM", "abababababababababababM" },
325 	{ MUA, 0, "(ab){4,6}?M", "abababababababM" },
326 
327 	/* Basic character sets. */
328 	{ MUA, 0, "(?:\\s)+(?:\\S)+", "ab \t\xc3\xa9\xe6\x92\xad " },
329 	{ MUA, 0, "(\\w)*(k)(\\W)?\?", "abcdef abck11" },
330 	{ MUA, 0, "\\((\\d)+\\)\\D", "a() (83 (8)2 (9)ab" },
331 	{ MUA, 0, "\\w(\\s|(?:\\d)*,)+\\w\\wb", "a 5, 4,, bb 5, 4,, aab" },
332 	{ MUA, 0, "(\\v+)(\\V+)", "\x0e\xc2\x85\xe2\x80\xa8\x0b\x09\xe2\x80\xa9" },
333 	{ MUA, 0, "(\\h+)(\\H+)", "\xe2\x80\xa8\xe2\x80\x80\x20\xe2\x80\x8a\xe2\x81\x9f\xe3\x80\x80\x09\x20\xc2\xa0\x0a" },
334 	{ MUA, 0, "x[bcef]+", "xaxdxecbfg" },
335 	{ MUA, 0, "x[bcdghij]+", "xaxexfxdgbjk" },
336 	{ MUA, 0, "x[^befg]+", "xbxexacdhg" },
337 	{ MUA, 0, "x[^bcdl]+", "xlxbxaekmd" },
338 	{ MUA, 0, "x[^bcdghi]+", "xbxdxgxaefji" },
339 	{ MUA, 0, "x[B-Fb-f]+", "xaxAxgxbfBFG" },
340 	{ CMUA, 0, "\\x{e9}+", "#\xf0\x90\x90\xa8\xc3\xa8\xc3\xa9\xc3\x89\xc3\x88" },
341 	{ CMUA, 0, "[^\\x{e9}]+", "\xc3\xa9#\xf0\x90\x90\xa8\xc3\xa8\xc3\x88\xc3\x89" },
342 	{ MUA, 0, "[\\x02\\x7e]+", "\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x02\x7e\x7f" },
343 	{ MUA, 0, "[^\\x02\\x7e]+", "\x02\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x7f\x7e" },
344 	{ MUA, 0, "[\\x{81}-\\x{7fe}]+", "#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xc2\x81\xdf\xbe\xdf\xbf" },
345 	{ MUA, 0, "[^\\x{81}-\\x{7fe}]+", "\xc2\x81#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xdf\xbf\xdf\xbe" },
346 	{ MUA, 0, "[\\x{801}-\\x{fffe}]+", "#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xe0\xa0\x81\xef\xbf\xbe\xef\xbf\xbf" },
347 	{ MUA, 0, "[^\\x{801}-\\x{fffe}]+", "\xe0\xa0\x81#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xef\xbf\xbf\xef\xbf\xbe" },
348 	{ MUA, 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" },
349 	{ MUA, 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" },
350 
351 	/* Unicode properties. */
352 	{ MUAP, 0, "[1-5\xc3\xa9\\w]", "\xc3\xa1_" },
353 	{ MUAP, 0 | F_PROPERTY, "[\xc3\x81\\p{Ll}]", "A_\xc3\x89\xc3\xa1" },
354 	{ MUAP, 0, "[\\Wd-h_x-z]+", "a\xc2\xa1#_yhzdxi" },
355 	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}]", "abc" },
356 	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}]", "abc" },
357 	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}\xc3\xa1-\xc3\xa8]", "abc" },
358 	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}\xc3\xa1-\xc3\xa8]", "abc" },
359 	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
360 	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
361 	{ MUAP, 0 | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
362 	{ MUAP, 0 | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
363 	{ MUAP, 0, "[b-\xc3\xa9\\s]", "a\xc\xe6\x92\xad" },
364 	{ CMUAP, 0, "[\xc2\x85-\xc2\x89\xc3\x89]", "\xc2\x84\xc3\xa9" },
365 	{ MUAP, 0, "[^b-d^&\\s]{3,}", "db^ !a\xe2\x80\xa8_ae" },
366 	{ MUAP, 0 | F_PROPERTY, "[^\\S\\P{Any}][\\sN]{1,3}[\\P{N}]{4}", "\xe2\x80\xaa\xa N\x9\xc3\xa9_0" },
367 	{ MUA, 0 | F_PROPERTY, "[^\\P{L}\x9!D-F\xa]{2,3}", "\x9,.DF\xa.CG\xc3\x81" },
368 	{ CMUAP, 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" },
369 	{ MUAP, 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" },
370 	{ MUAP, 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#" },
371 	{ PCRE_UCP, 0, "[a-b\\s]{2,5}[^a]", "AB  baaa" },
372 
373 	/* Possible empty brackets. */
374 	{ MUA, 0, "(?:|ab||bc|a)+d", "abcxabcabd" },
375 	{ MUA, 0, "(|ab||bc|a)+d", "abcxabcabd" },
376 	{ MUA, 0, "(?:|ab||bc|a)*d", "abcxabcabd" },
377 	{ MUA, 0, "(|ab||bc|a)*d", "abcxabcabd" },
378 	{ MUA, 0, "(?:|ab||bc|a)+?d", "abcxabcabd" },
379 	{ MUA, 0, "(|ab||bc|a)+?d", "abcxabcabd" },
380 	{ MUA, 0, "(?:|ab||bc|a)*?d", "abcxabcabd" },
381 	{ MUA, 0, "(|ab||bc|a)*?d", "abcxabcabd" },
382 	{ MUA, 0, "(((a)*?|(?:ba)+)+?|(?:|c|ca)*)*m", "abaacaccabacabalabaacaccabacabamm" },
383 	{ MUA, 0, "(?:((?:a)*|(ba)+?)+|(|c|ca)*?)*?m", "abaacaccabacabalabaacaccabacabamm" },
384 
385 	/* Start offset. */
386 	{ MUA, 3, "(\\d|(?:\\w)*\\w)+", "0ac01Hb" },
387 	{ MUA, 4 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
388 	{ MUA, 2 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
389 	{ MUA, 1, "(\\w\\W\\w)+", "ab#d" },
390 
391 	/* Newline. */
392 	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
393 	{ PCRE_MULTILINE | PCRE_NEWLINE_CR, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
394 	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "\\W{1,3}[^#]", "\r\n##...." },
395 	{ MUA | PCRE_NO_UTF8_CHECK, 1, "^.a", "\n\x80\nxa" },
396 	{ MUA, 1, "^", "\r\n" },
397 	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1 | F_NOMATCH, "^", "\r\n" },
398 	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1, "^", "\r\na" },
399 
400 	/* Any character except newline or any newline. */
401 	{ PCRE_NEWLINE_CRLF, 0, ".", "\r" },
402 	{ PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, ".(.).", "a\xc3\xa1\r\n\n\r\r" },
403 	{ PCRE_NEWLINE_ANYCRLF, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
404 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
405 	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, "(.).", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa9$de" },
406 	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0 | F_NOMATCH, ".(.).", "\xe2\x80\xa8\nb\r" },
407 	{ PCRE_NEWLINE_ANY, 0, "(.)(.)", "#\x85#\r#\n#\r\n#\x84" },
408 	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, "(.+)#", "#\rMn\xc2\x85#\n###" },
409 	{ PCRE_BSR_ANYCRLF, 0, "\\R", "\r" },
410 	{ PCRE_BSR_ANYCRLF, 0, "\\R", "\x85#\r\n#" },
411 	{ PCRE_BSR_UNICODE | PCRE_UTF8, 0, "\\R", "ab\xe2\x80\xa8#c" },
412 	{ PCRE_BSR_UNICODE | PCRE_UTF8, 0, "\\R", "ab\r\nc" },
413 	{ PCRE_NEWLINE_CRLF | PCRE_BSR_UNICODE | PCRE_UTF8, 0, "(\\R.)+", "\xc2\x85\r\n#\xe2\x80\xa8\n\r\n\r" },
414 	{ MUA, 0 | F_NOMATCH, "\\R+", "ab" },
415 	{ MUA, 0, "\\R+", "ab\r\n\r" },
416 	{ MUA, 0, "\\R*", "ab\r\n\r" },
417 	{ MUA, 0, "\\R*", "\r\n\r" },
418 	{ MUA, 0, "\\R{2,4}", "\r\nab\r\r" },
419 	{ MUA, 0, "\\R{2,4}", "\r\nab\n\n\n\r\r\r" },
420 	{ MUA, 0, "\\R{2,}", "\r\nab\n\n\n\r\r\r" },
421 	{ MUA, 0, "\\R{0,3}", "\r\n\r\n\r\n\r\n\r\n" },
422 	{ MUA, 0 | F_NOMATCH, "\\R+\\R\\R", "\r\n\r\n" },
423 	{ MUA, 0, "\\R+\\R\\R", "\r\r\r" },
424 	{ MUA, 0, "\\R*\\R\\R", "\n\r" },
425 	{ MUA, 0 | F_NOMATCH, "\\R{2,4}\\R\\R", "\r\r\r" },
426 	{ MUA, 0, "\\R{2,4}\\R\\R", "\r\r\r\r" },
427 
428 	/* Atomic groups (no fallback from "next" direction). */
429 	{ MUA, 0 | F_NOMATCH, "(?>ab)ab", "bab" },
430 	{ MUA, 0 | F_NOMATCH, "(?>(ab))ab", "bab" },
431 	{ MUA, 0, "(?>ab)+abc(?>de)*def(?>gh)?ghe(?>ij)+?k(?>lm)*?n(?>op)?\?op",
432 			"bababcdedefgheijijklmlmnop" },
433 	{ MUA, 0, "(?>a(b)+a|(ab)?\?(b))an", "abban" },
434 	{ MUA, 0, "(?>ab+a|(?:ab)?\?b)an", "abban" },
435 	{ MUA, 0, "((?>ab|ad|)*?)(?>|c)*abad", "abababcababad" },
436 	{ MUA, 0, "(?>(aa|b|)*+(?>(##)|###)*d|(aa)(?>(baa)?)m)", "aabaa#####da" },
437 	{ MUA, 0, "((?>a|)+?)b", "aaacaaab" },
438 	{ MUA, 0, "(?>x|)*$", "aaa" },
439 	{ MUA, 0, "(?>(x)|)*$", "aaa" },
440 	{ MUA, 0, "(?>x|())*$", "aaa" },
441 	{ MUA, 0, "((?>[cxy]a|[a-d])*?)b", "aaa+ aaab" },
442 	{ MUA, 0, "((?>[cxy](a)|[a-d])*?)b", "aaa+ aaab" },
443 	{ MUA, 0, "(?>((?>(a+))))bab|(?>((?>(a+))))bb", "aaaabaaabaabab" },
444 	{ MUA, 0, "(?>(?>a+))bab|(?>(?>a+))bb", "aaaabaaabaabab" },
445 	{ MUA, 0, "(?>(a)c|(?>(c)|(a))a)b*?bab", "aaaabaaabaabab" },
446 	{ MUA, 0, "(?>ac|(?>c|a)a)b*?bab", "aaaabaaabaabab" },
447 	{ MUA, 0, "(?>(b)b|(a))*b(?>(c)|d)?x", "ababcaaabdbx" },
448 	{ MUA, 0, "(?>bb|a)*b(?>c|d)?x", "ababcaaabdbx" },
449 	{ MUA, 0, "(?>(bb)|a)*b(?>c|(d))?x", "ababcaaabdbx" },
450 	{ MUA, 0, "(?>(a))*?(?>(a))+?(?>(a))??x", "aaaaaacccaaaaabax" },
451 	{ MUA, 0, "(?>a)*?(?>a)+?(?>a)??x", "aaaaaacccaaaaabax" },
452 	{ MUA, 0, "(?>(a)|)*?(?>(a)|)+?(?>(a)|)??x", "aaaaaacccaaaaabax" },
453 	{ MUA, 0, "(?>a|)*?(?>a|)+?(?>a|)??x", "aaaaaacccaaaaabax" },
454 	{ MUA, 0, "(?>a(?>(a{0,2}))*?b|aac)+b", "aaaaaaacaaaabaaaaacaaaabaacaaabb" },
455 	{ CMA, 0, "(?>((?>a{32}|b+|(a*))?(?>c+|d*)?\?)+e)+?f", "aaccebbdde bbdaaaccebbdee bbdaaaccebbdeef" },
456 	{ MUA, 0, "(?>(?:(?>aa|a||x)+?b|(?>aa|a||(x))+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
457 	{ MUA, 0, "(?>(?:(?>aa|a||(x))+?b|(?>aa|a||x)+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
458 	{ MUA, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d" },
459 	{ MUA, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d#\xcc\x8d\xcc\x8d" },
460 	{ MUA, 0 | F_PROPERTY, "\\X+..", "\xcc\x8d#\xcc\x8d#\xcc\x8d\xcc\x8d" },
461 	{ MUA, 0 | F_PROPERTY, "\\X{2,4}", "abcdef" },
462 	{ MUA, 0 | F_PROPERTY, "\\X{2,4}?", "abcdef" },
463 	{ MUA, 0 | F_NOMATCH | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d##" },
464 	{ MUA, 0 | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d#\xcc\x8d##" },
465 	{ MUA, 0, "(c(ab)?+ab)+", "cabcababcab" },
466 	{ MUA, 0, "(?>(a+)b)+aabab", "aaaabaaabaabab" },
467 
468 	/* Possessive quantifiers. */
469 	{ MUA, 0, "(?:a|b)++m", "mababbaaxababbaam" },
470 	{ MUA, 0, "(?:a|b)*+m", "mababbaaxababbaam" },
471 	{ MUA, 0, "(?:a|b)*+m", "ababbaaxababbaam" },
472 	{ MUA, 0, "(a|b)++m", "mababbaaxababbaam" },
473 	{ MUA, 0, "(a|b)*+m", "mababbaaxababbaam" },
474 	{ MUA, 0, "(a|b)*+m", "ababbaaxababbaam" },
475 	{ MUA, 0, "(a|b(*ACCEPT))++m", "maaxab" },
476 	{ MUA, 0, "(?:b*)++m", "bxbbxbbbxm" },
477 	{ MUA, 0, "(?:b*)++m", "bxbbxbbbxbbm" },
478 	{ MUA, 0, "(?:b*)*+m", "bxbbxbbbxm" },
479 	{ MUA, 0, "(?:b*)*+m", "bxbbxbbbxbbm" },
480 	{ MUA, 0, "(b*)++m", "bxbbxbbbxm" },
481 	{ MUA, 0, "(b*)++m", "bxbbxbbbxbbm" },
482 	{ MUA, 0, "(b*)*+m", "bxbbxbbbxm" },
483 	{ MUA, 0, "(b*)*+m", "bxbbxbbbxbbm" },
484 	{ MUA, 0, "(?:a|(b))++m", "mababbaaxababbaam" },
485 	{ MUA, 0, "(?:(a)|b)*+m", "mababbaaxababbaam" },
486 	{ MUA, 0, "(?:(a)|(b))*+m", "ababbaaxababbaam" },
487 	{ MUA, 0, "(a|(b))++m", "mababbaaxababbaam" },
488 	{ MUA, 0, "((a)|b)*+m", "mababbaaxababbaam" },
489 	{ MUA, 0, "((a)|(b))*+m", "ababbaaxababbaam" },
490 	{ MUA, 0, "(a|(b)(*ACCEPT))++m", "maaxab" },
491 	{ MUA, 0, "(?:(b*))++m", "bxbbxbbbxm" },
492 	{ MUA, 0, "(?:(b*))++m", "bxbbxbbbxbbm" },
493 	{ MUA, 0, "(?:(b*))*+m", "bxbbxbbbxm" },
494 	{ MUA, 0, "(?:(b*))*+m", "bxbbxbbbxbbm" },
495 	{ MUA, 0, "((b*))++m", "bxbbxbbbxm" },
496 	{ MUA, 0, "((b*))++m", "bxbbxbbbxbbm" },
497 	{ MUA, 0, "((b*))*+m", "bxbbxbbbxm" },
498 	{ MUA, 0, "((b*))*+m", "bxbbxbbbxbbm" },
499 	{ MUA, 0 | F_NOMATCH, "(?>(b{2,4}))(?:(?:(aa|c))++m|(?:(aa|c))+n)", "bbaacaaccaaaacxbbbmbn" },
500 	{ MUA, 0, "((?:b)++a)+(cd)*+m", "bbababbacdcdnbbababbacdcdm" },
501 	{ MUA, 0, "((?:(b))++a)+((c)d)*+m", "bbababbacdcdnbbababbacdcdm" },
502 	{ MUA, 0, "(?:(?:(?:ab)*+k)++(?:n(?:cd)++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
503 	{ MUA, 0, "(?:((ab)*+(k))++(n(?:c(d))++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
504 
505 	/* Back references. */
506 	{ MUA, 0, "(aa|bb)(\\1*)(ll|)(\\3*)bbbbbbc", "aaaaaabbbbbbbbc" },
507 	{ CMUA, 0, "(aa|bb)(\\1+)(ll|)(\\3+)bbbbbbc", "bBbbBbCbBbbbBbbcbbBbbbBBbbC" },
508 	{ CMA, 0, "(a{2,4})\\1", "AaAaaAaA" },
509 	{ MUA, 0, "(aa|bb)(\\1?)aa(\\1?)(ll|)(\\4+)bbc", "aaaaaaaabbaabbbbaabbbbc" },
510 	{ MUA, 0, "(aa|bb)(\\1{0,5})(ll|)(\\3{0,5})cc", "bbxxbbbbxxaaaaaaaaaaaaaaaacc" },
511 	{ MUA, 0, "(aa|bb)(\\1{3,5})(ll|)(\\3{3,5})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
512 	{ MUA, 0, "(aa|bb)(\\1{3,})(ll|)(\\3{3,})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
513 	{ MUA, 0, "(\\w+)b(\\1+)c", "GabGaGaDbGaDGaDc" },
514 	{ MUA, 0, "(?:(aa)|b)\\1?b", "bb" },
515 	{ CMUA, 0, "(aa|bb)(\\1*?)aa(\\1+?)", "bBBbaaAAaaAAaa" },
516 	{ MUA, 0, "(aa|bb)(\\1*?)(dd|)cc(\\3+?)", "aaaaaccdd" },
517 	{ CMUA, 0, "(?:(aa|bb)(\\1?\?)cc){2}(\\1?\?)", "aAaABBbbAAaAcCaAcCaA" },
518 	{ MUA, 0, "(?:(aa|bb)(\\1{3,5}?)){2}(dd|)(\\3{3,5}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
519 	{ CMA, 0, "(?:(aa|bb)(\\1{3,}?)){2}(dd|)(\\3{3,}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
520 	{ MUA, 0, "(?:(aa|bb)(\\1{0,3}?)){2}(dd|)(\\3{0,3}?)b(\\1{0,3}?)(\\1{0,3})", "aaaaaaaaaaaaaaabaaaaa" },
521 	{ MUA, 0, "(a(?:\\1|)a){3}b", "aaaaaaaaaaab" },
522 	{ MA, 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" },
523 	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
524 	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{0,2}", "wwwww." },
525 	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwww" },
526 	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwwww" },
527 	{ PCRE_UCP, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
528 	{ CMUAP, 0, "(\xf0\x90\x90\x80)\\1", "\xf0\x90\x90\xa8\xf0\x90\x90\xa8" },
529 	{ MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
530 	{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
531 	{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k<A>*(?<A>aa)(?<A>bb)", "aabb" },
532 	{ MUA | PCRE_DUPNAMES, 0, "(?<A>aa)(?<A>bb)\\k<A>{0,3}aaaaaa", "aabbaaaaaa" },
533 	{ MUA | PCRE_DUPNAMES, 0, "(?<A>aa)(?<A>bb)\\k<A>{2,5}bb", "aabbaaaabb" },
534 	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}m", "aaaaaaaabbbbaabbbbm" },
535 	{ MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
536 	{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
537 	{ MUA | PCRE_DUPNAMES, 0, "\\k<A>*?(?<A>aa)(?<A>bb)", "aabb" },
538 	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
539 	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>*?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
540 	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
541 	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}M", "aaaaaaaabbbbaabbbbm" },
542 	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{1,3}M", "aaaaaaaabbbbaabbbbm" },
543 	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}?M", "aaaaaabbbbbbaabbbbbbbbbbm" },
544 	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
545 
546 	/* Assertions. */
547 	{ MUA, 0, "(?=xx|yy|zz)\\w{4}", "abczzdefg" },
548 	{ MUA, 0, "(?=((\\w+)b){3}|ab)", "dbbbb ab" },
549 	{ MUA, 0, "(?!ab|bc|cd)[a-z]{2}", "Xabcdef" },
550 	{ MUA, 0, "(?<=aaa|aa|a)a", "aaa" },
551 	{ MUA, 2, "(?<=aaa|aa|a)a", "aaa" },
552 	{ MA, 0, "(?<=aaa|aa|a)a", "aaa" },
553 	{ MA, 2, "(?<=aaa|aa|a)a", "aaa" },
554 	{ MUA, 0, "(\\d{2})(?!\\w+c|(((\\w?)m){2}n)+|\\1)", "x5656" },
555 	{ MUA, 0, "((?=((\\d{2,6}\\w){2,}))\\w{5,20}K){2,}", "567v09708K12l00M00 567v09708K12l00M00K45K" },
556 	{ MUA, 0, "(?=(?:(?=\\S+a)\\w*(b)){3})\\w+\\d", "bba bbab nbbkba nbbkba0kl" },
557 	{ MUA, 0, "(?>a(?>(b+))a(?=(..)))*?k", "acabbcabbaabacabaabbakk" },
558 	{ MUA, 0, "((?(?=(a))a)+k)", "bbak" },
559 	{ MUA, 0, "((?(?=a)a)+k)", "bbak" },
560 	{ MUA, 0 | F_NOMATCH, "(?=(?>(a))m)amk", "a k" },
561 	{ MUA, 0 | F_NOMATCH, "(?!(?>(a))m)amk", "a k" },
562 	{ MUA, 0 | F_NOMATCH, "(?>(?=(a))am)amk", "a k" },
563 	{ MUA, 0, "(?=(?>a|(?=(?>(b+))a|c)[a-c]+)*?m)[a-cm]+k", "aaam bbam baaambaam abbabba baaambaamk" },
564 	{ MUA, 0, "(?> ?\?\\b(?(?=\\w{1,4}(a))m)\\w{0,8}bc){2,}?", "bca ssbc mabd ssbc mabc" },
565 	{ MUA, 0, "(?:(?=ab)?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
566 	{ MUA, 0, "(?:(?=a(b))?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
567 	{ MUA, 0, "(?:(?=.(.))??\\1.)+m", "aabbbcbacccanaabbbcbacccam" },
568 	{ MUA, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" },
569 	{ MUA, 0, "((?!a)?(?!([^a]))?)+$", "acbab" },
570 	{ MUA, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" },
571 
572 	/* Not empty, ACCEPT, FAIL */
573 	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" },
574 	{ MUA | PCRE_NOTEMPTY, 0, "a*", "bcaad" },
575 	{ MUA | PCRE_NOTEMPTY, 0, "a*?", "bcaad" },
576 	{ MUA | PCRE_NOTEMPTY_ATSTART, 0, "a*", "bcaad" },
577 	{ MUA, 0, "a(*ACCEPT)b", "ab" },
578 	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*(*ACCEPT)b", "bcx" },
579 	{ MUA | PCRE_NOTEMPTY, 0, "a*(*ACCEPT)b", "bcaad" },
580 	{ MUA | PCRE_NOTEMPTY, 0, "a*?(*ACCEPT)b", "bcaad" },
581 	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "(?:z|a*(*ACCEPT)b)", "bcx" },
582 	{ MUA | PCRE_NOTEMPTY, 0, "(?:z|a*(*ACCEPT)b)", "bcaad" },
583 	{ MUA | PCRE_NOTEMPTY, 0, "(?:z|a*?(*ACCEPT)b)", "bcaad" },
584 	{ MUA | PCRE_NOTEMPTY_ATSTART, 0, "a*(*ACCEPT)b", "bcx" },
585 	{ MUA | PCRE_NOTEMPTY_ATSTART, 0 | F_NOMATCH, "a*(*ACCEPT)b", "" },
586 	{ MUA, 0, "((a(*ACCEPT)b))", "ab" },
587 	{ MUA, 0, "(a(*FAIL)a|a)", "aaa" },
588 	{ MUA, 0, "(?=ab(*ACCEPT)b)a", "ab" },
589 	{ MUA, 0, "(?=(?:x|ab(*ACCEPT)b))", "ab" },
590 	{ MUA, 0, "(?=(a(b(*ACCEPT)b)))a", "ab" },
591 	{ MUA | PCRE_NOTEMPTY, 0, "(?=a*(*ACCEPT))c", "c" },
592 
593 	/* Conditional blocks. */
594 	{ MUA, 0, "(?(?=(a))a|b)+k", "ababbalbbadabak" },
595 	{ MUA, 0, "(?(?!(b))a|b)+k", "ababbalbbadabak" },
596 	{ MUA, 0, "(?(?=a)a|b)+k", "ababbalbbadabak" },
597 	{ MUA, 0, "(?(?!b)a|b)+k", "ababbalbbadabak" },
598 	{ MUA, 0, "(?(?=(a))a*|b*)+k", "ababbalbbadabak" },
599 	{ MUA, 0, "(?(?!(b))a*|b*)+k", "ababbalbbadabak" },
600 	{ MUA, 0, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
601 	{ MUA, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
602 	{ MUA, 0 | F_DIFF, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
603 	{ MUA, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
604 	{ MUA, 0, "(?(?=a)a*|b*)+k", "ababbalbbadabak" },
605 	{ MUA, 0, "(?(?!b)a*|b*)+k", "ababbalbbadabak" },
606 	{ MUA, 0, "(?(?=a)ab)", "a" },
607 	{ MUA, 0, "(?(?<!b)c)", "b" },
608 	{ MUA, 0, "(?(DEFINE)a(b))", "a" },
609 	{ MUA, 0, "a(?(DEFINE)(?:b|(?:c?)+)*)", "a" },
610 	{ MUA, 0, "(?(?=.[a-c])[k-l]|[A-D])", "kdB" },
611 	{ MUA, 0, "(?(?!.{0,4}[cd])(aa|bb)|(cc|dd))+", "aabbccddaa" },
612 	{ MUA, 0, "(?(?=[^#@]*@)(aaab|aa|aba)|(aba|aab)){3,}", "aaabaaaba#aaabaaaba#aaabaaaba@" },
613 	{ MUA, 0, "((?=\\w{5})\\w(?(?=\\w*k)\\d|[a-f_])*\\w\\s)+", "mol m10kk m088k _f_a_ mbkkl" },
614 	{ MUA, 0, "(c)?\?(?(1)a|b)", "cdcaa" },
615 	{ MUA, 0, "(c)?\?(?(1)a|b)", "cbb" },
616 	{ MUA, 0 | F_DIFF, "(?(?=(a))(aaaa|a?))+aak", "aaaaab aaaaak" },
617 	{ MUA, 0, "(?(?=a)(aaaa|a?))+aak", "aaaaab aaaaak" },
618 	{ MUA, 0, "(?(?!(b))(aaaa|a?))+aak", "aaaaab aaaaak" },
619 	{ MUA, 0, "(?(?!b)(aaaa|a?))+aak", "aaaaab aaaaak" },
620 	{ MUA, 0 | F_DIFF, "(?(?=(a))a*)+aak", "aaaaab aaaaak" },
621 	{ MUA, 0, "(?(?=a)a*)+aak", "aaaaab aaaaak" },
622 	{ MUA, 0, "(?(?!(b))a*)+aak", "aaaaab aaaaak" },
623 	{ MUA, 0, "(?(?!b)a*)+aak", "aaaaab aaaaak" },
624 	{ MUA, 0, "(?(?=(?=(?!(x))a)aa)aaa|(?(?=(?!y)bb)bbb))*k", "abaabbaaabbbaaabbb abaabbaaabbbaaabbbk" },
625 	{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)*l", "bc ddd abccabccl" },
626 	{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+?dd", "bcabcacdb bdddd" },
627 	{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+l", "ababccddabdbccd abcccl" },
628 	{ MUA, 0, "((?:a|aa)(?(1)aaa))x", "aax" },
629 
630 	/* Set start of match. */
631 	{ MUA, 0, "(?:\\Ka)*aaaab", "aaaaaaaa aaaaaaabb" },
632 	{ MUA, 0, "(?>\\Ka\\Ka)*aaaab", "aaaaaaaa aaaaaaaaaabb" },
633 	{ MUA, 0, "a+\\K(?<=\\Gaa)a", "aaaaaa" },
634 	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a\\K(*ACCEPT)b", "aa" },
635 	{ MUA | PCRE_NOTEMPTY_ATSTART, 0, "a\\K(*ACCEPT)b", "aa" },
636 
637 	/* First line. */
638 	{ MUA | PCRE_FIRSTLINE, 0 | F_PROPERTY, "\\p{Any}a", "bb\naaa" },
639 	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}a", "bb\r\naaa" },
640 	{ MUA | PCRE_FIRSTLINE, 0, "(?<=a)", "a" },
641 	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "[^a][^b]", "ab" },
642 	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "a", "\na" },
643 	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "[abc]", "\na" },
644 	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^a", "\na" },
645 	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^(?<=\n)", "\na" },
646 	{ MUA | PCRE_FIRSTLINE, 0, "\xf0\x90\x90\x80", "\xf0\x90\x90\x80" },
647 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "#", "\xc2\x85#" },
648 	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "#", "\x85#" },
649 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^#", "\xe2\x80\xa8#" },
650 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_PROPERTY, "\\p{Any}", "\r\na" },
651 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, ".", "\r" },
652 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, "a", "\ra" },
653 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH, "ba", "bbb\r\nba" },
654 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}{4}|a", "\r\na" },
655 	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 1, ".", "\r\n" },
656 	{ PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, "ab.", "ab" },
657 	{ MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" },
658 
659 	/* Recurse. */
660 	{ MUA, 0, "(a)(?1)", "aa" },
661 	{ MUA, 0, "((a))(?1)", "aa" },
662 	{ MUA, 0, "(b|a)(?1)", "aa" },
663 	{ MUA, 0, "(b|(a))(?1)", "aa" },
664 	{ MUA, 0 | F_NOMATCH, "((a)(b)(?:a*))(?1)", "aba" },
665 	{ MUA, 0, "((a)(b)(?:a*))(?1)", "abab" },
666 	{ MUA, 0, "((a+)c(?2))b(?1)", "aacaabaca" },
667 	{ MUA, 0, "((?2)b|(a)){2}(?1)", "aabab" },
668 	{ MUA, 0, "(?1)(a)*+(?2)(b(?1))", "aababa" },
669 	{ MUA, 0, "(?1)(((a(*ACCEPT)))b)", "axaa" },
670 	{ MUA, 0, "(?1)(?(DEFINE) (((ac(*ACCEPT)))b) )", "akaac" },
671 	{ MUA, 0, "(a+)b(?1)b\\1", "abaaabaaaaa" },
672 	{ MUA, 0 | F_NOMATCH, "(?(DEFINE)(aa|a))(?1)ab", "aab" },
673 	{ MUA, 0, "(?(DEFINE)(a\\Kb))(?1)+ababc", "abababxabababc" },
674 	{ MUA, 0, "(a\\Kb)(?1)+ababc", "abababxababababc" },
675 	{ MUA, 0 | F_NOMATCH, "(a\\Kb)(?1)+ababc", "abababxababababxc" },
676 	{ MUA, 0, "b|<(?R)*>", "<<b>" },
677 	{ MUA, 0, "(a\\K){0}(?:(?1)b|ac)", "ac" },
678 	{ MUA, 0, "(?(DEFINE)(a(?2)|b)(b(?1)|(a)))(?:(?1)|(?2))m", "ababababnababababaam" },
679 	{ MUA, 0, "(a)((?(R)a|b))(?2)", "aabbabaa" },
680 	{ MUA, 0, "(a)((?(R2)a|b))(?2)", "aabbabaa" },
681 	{ MUA, 0, "(a)((?(R1)a|b))(?2)", "ababba" },
682 	{ MUA, 0, "(?(R0)aa|bb(?R))", "abba aabb bbaa" },
683 	{ MUA, 0, "((?(R)(?:aaaa|a)|(?:(aaaa)|(a)))+)(?1)$", "aaaaaaaaaa aaaa" },
684 	{ MUA, 0, "(?P<Name>a(?(R&Name)a|b))(?1)", "aab abb abaa" },
685 	{ MUA, 0, "((?(R)a|(?1)){3})", "XaaaaaaaaaX" },
686 	{ MUA, 0, "((?:(?(R)a|(?1))){3})", "XaaaaaaaaaX" },
687 	{ MUA, 0, "((?(R)a|(?1)){1,3})aaaaaa", "aaaaaaaaXaaaaaaaaa" },
688 	{ MUA, 0, "((?(R)a|(?1)){1,3}?)M", "aaaM" },
689 
690 	/* 16 bit specific tests. */
691 	{ CMA, 0 | F_FORCECONV, "\xc3\xa1", "\xc3\x81\xc3\xa1" },
692 	{ CMA, 0 | F_FORCECONV, "\xe1\xbd\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
693 	{ CMA, 0 | F_FORCECONV, "[\xc3\xa1]", "\xc3\x81\xc3\xa1" },
694 	{ CMA, 0 | F_FORCECONV, "[\xe1\xbd\xb8]", "\xe1\xbf\xb8\xe1\xbd\xb8" },
695 	{ CMA, 0 | F_FORCECONV, "[a-\xed\xb0\x80]", "A" },
696 	{ CMA, 0 | F_NO8 | F_FORCECONV, "[a-\\x{dc00}]", "B" },
697 	{ CMA, 0 | F_NO8 | F_NOMATCH | F_FORCECONV, "[b-\\x{dc00}]", "a" },
698 	{ CMA, 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" },
699 	{ CMA, 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#" },
700 	{ CMA, 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" },
701 	{ CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\x9f\xbf\xed\xa0\x83" },
702 	{ CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\xb4\x80\xed\xb3\xb0" },
703 	{ CMA, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\x9f\xbf\xed\xa0\x83" },
704 	{ CMA, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\xb4\x80\xed\xb3\xb0" },
705 	{ CMA, 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#" },
706 	{ CMA, 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" },
707 	{ MA, 0 | F_FORCECONV, "[^\xed\xb0\x80]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
708 	{ MA, 0 | F_NO8 | F_FORCECONV, "[^\\x{dc00}]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
709 	{ CMA, 0 | F_FORCECONV, ".\\B.", "\xed\xa0\x80\xed\xb0\x80" },
710 	{ CMA, 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" },
711 	{ CMA, 0 | F_FORCECONV, "\\d*\\s*\\w*\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80" },
712 	{ CMA, 0 | F_FORCECONV | F_NOMATCH, "\\d*?\\D*?\\s*?\\S*?\\w*?\\W*?##", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80#" },
713 	{ CMA | PCRE_EXTENDED, 0 | F_FORCECONV, "\xed\xa0\x80 \xed\xb0\x80 !", "\xed\xa0\x80\xed\xb0\x80!" },
714 	{ CMA, 0 | F_FORCECONV, "\xed\xa0\x80+#[^#]+\xed\xa0\x80", "\xed\xa0\x80#a\xed\xa0\x80" },
715 	{ CMA, 0 | F_FORCECONV, "(\xed\xa0\x80+)#\\1", "\xed\xa0\x80\xed\xa0\x80#\xed\xa0\x80\xed\xa0\x80" },
716 	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0 | F_NO8 | F_FORCECONV, "^-", "a--\xe2\x80\xa8--" },
717 	{ PCRE_BSR_UNICODE, 0 | F_NO8 | F_FORCECONV, "\\R", "ab\xe2\x80\xa8" },
718 	{ 0, 0 | F_NO8 | F_FORCECONV, "\\v", "ab\xe2\x80\xa9" },
719 	{ 0, 0 | F_NO8 | F_FORCECONV, "\\h", "ab\xe1\xa0\x8e" },
720 	{ 0, 0 | F_NO8 | F_FORCECONV, "\\v+?\\V+?#", "\xe2\x80\xa9\xe2\x80\xa9\xef\xbf\xbf\xef\xbf\xbf#" },
721 	{ 0, 0 | F_NO8 | F_FORCECONV, "\\h+?\\H+?#", "\xe1\xa0\x8e\xe1\xa0\x8e\xef\xbf\xbf\xef\xbf\xbf#" },
722 
723 	/* Partial matching. */
724 	{ MUA | PCRE_PARTIAL_SOFT, 0, "ab", "a" },
725 	{ MUA | PCRE_PARTIAL_SOFT, 0, "ab|a", "a" },
726 	{ MUA | PCRE_PARTIAL_HARD, 0, "ab|a", "a" },
727 	{ MUA | PCRE_PARTIAL_SOFT, 0, "\\b#", "a" },
728 	{ MUA | PCRE_PARTIAL_SOFT, 0, "(?<=a)b", "a" },
729 	{ MUA | PCRE_PARTIAL_SOFT, 0, "abc|(?<=xxa)bc", "xxab" },
730 	{ MUA | PCRE_PARTIAL_SOFT, 0, "a\\B", "a" },
731 	{ MUA | PCRE_PARTIAL_HARD, 0, "a\\b", "a" },
732 
733 	/* (*MARK) verb. */
734 	{ MUA, 0, "a(*MARK:aa)a", "ababaa" },
735 	{ MUA, 0 | F_NOMATCH, "a(*:aa)a", "abab" },
736 	{ MUA, 0, "a(*:aa)(b(*:bb)b|bc)", "abc" },
737 	{ MUA, 0 | F_NOMATCH, "a(*:1)x|b(*:2)y", "abc" },
738 	{ MUA, 0, "(?>a(*:aa))b|ac", "ac" },
739 	{ MUA, 0, "(?(DEFINE)(a(*:aa)))(?1)", "a" },
740 	{ MUA, 0 | F_NOMATCH, "(?(DEFINE)((a)(*:aa)))(?1)b", "aa" },
741 	{ MUA, 0, "(?(DEFINE)(a(*:aa)))a(?1)b|aac", "aac" },
742 	{ MUA, 0, "(a(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
743 	{ MUA, 0, "(a(*:aa)){0}(?:b(?1)b)+", "babba" },
744 	{ MUA, 0 | F_NOMATCH | F_STUDY, "(a(*:aa)){0}(?:b(?1)b)+", "ba" },
745 	{ MUA, 0, "(a\\K(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
746 	{ MUA, 0, "(a\\K(*:aa)){0}(?:b(?1)b)+", "babba" },
747 	{ MUA, 0 | F_NOMATCH | F_STUDY, "(a\\K(*:aa)){0}(?:b(?1)b)+", "ba" },
748 	{ MUA, 0 | F_NOMATCH | F_STUDY, "(*:mark)m", "a" },
749 
750 	/* (*COMMIT) verb. */
751 	{ MUA, 0 | F_NOMATCH, "a(*COMMIT)b", "ac" },
752 	{ MUA, 0, "aa(*COMMIT)b", "xaxaab" },
753 	{ MUA, 0 | F_NOMATCH, "a(*COMMIT)(*:msg)b|ac", "ac" },
754 	{ MUA, 0 | F_NOMATCH, "(a(*COMMIT)b)++", "abac" },
755 	{ MUA, 0 | F_NOMATCH, "((a)(*COMMIT)b)++", "abac" },
756 	{ MUA, 0 | F_NOMATCH, "(?=a(*COMMIT)b)ab|ad", "ad" },
757 
758 	/* (*PRUNE) verb. */
759 	{ MUA, 0, "aa\\K(*PRUNE)b", "aaab" },
760 	{ MUA, 0, "aa(*PRUNE:bb)b|a", "aa" },
761 	{ MUA, 0, "(a)(a)(*PRUNE)b|(a)", "aa" },
762 	{ MUA, 0, "(a)(a)(a)(a)(a)(a)(a)(a)(*PRUNE)b|(a)", "aaaaaaaa" },
763 	{ MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|", "a" },
764 	{ MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|m", "a" },
765 	{ MUA, 0 | F_NOMATCH, "(?=a(*PRUNE)b)ab|ad", "ad" },
766 	{ MUA, 0, "a(*COMMIT)(*PRUNE)d|bc", "abc" },
767 	{ MUA, 0, "(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
768 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
769 	{ MUA, 0, "(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
770 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
771 	{ MUA, 0, "(a(*COMMIT)b){0}a(?1)(*PRUNE)c|bc", "abc" },
772 	{ MUA, 0 | F_NOMATCH, "(a(*COMMIT)b){0}a(*COMMIT)(?1)(*PRUNE)c|bc", "abc" },
773 	{ MUA, 0, "(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
774 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
775 	{ MUA, 0, "((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
776 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
777 	{ MUA, 0, "(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
778 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
779 	{ MUA, 0, "(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
780 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
781 	{ MUA, 0, "(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
782 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
783 	{ MUA, 0, "(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
784 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
785 	{ MUA, 0, "(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
786 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
787 	{ MUA, 0, "(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
788 	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
789 
790 	/* (*SKIP) verb. */
791 	{ MUA, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" },
792 
793 	/* (*THEN) verb. */
794 	{ MUA, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" },
795 	{ MUA, 0 | F_NOMATCH, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcm" },
796 	{ MUA, 0, "((?:a(*THEN)|aab)c|a+)+m", "aabcaabcnmaabcaabcm" },
797 	{ MUA, 0, "((?:a|aab)(*THEN)c|a+)+m", "aam" },
798 	{ MUA, 0, "((?:a(*COMMIT)|aab)(*THEN)c|a+)+m", "aam" },
799 	{ MUA, 0, "(?(?=a(*THEN)b)ab|ad)", "ad" },
800 	{ MUA, 0, "(?(?!a(*THEN)b)ad|add)", "add" },
801 	{ MUA, 0 | F_NOMATCH, "(?(?=a)a(*THEN)b|ad)", "ad" },
802 	{ MUA, 0, "(?!(?(?=a)ab|b(*THEN)d))bn|bnn", "bnn" },
803 
804 	/* Deep recursion. */
805 	{ MUA, 0, "((((?:(?:(?:\\w)+)?)*|(?>\\w)+?)+|(?>\\w)?\?)*)?\\s", "aaaaa+ " },
806 	{ MUA, 0, "(?:((?:(?:(?:\\w*?)+)??|(?>\\w)?|\\w*+)*)+)+?\\s", "aa+ " },
807 	{ MUA, 0, "((a?)+)+b", "aaaaaaaaaaaa b" },
808 
809 	/* Deep recursion: Stack limit reached. */
810 	{ MA, 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?aaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaa" },
811 	{ MA, 0 | F_NOMATCH, "(?:a+)+b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
812 	{ MA, 0 | F_NOMATCH, "(?:a+?)+?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
813 	{ MA, 0 | F_NOMATCH, "(?:a*)*b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
814 	{ MA, 0 | F_NOMATCH, "(?:a*?)*?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
815 
816 	{ 0, 0, NULL, NULL }
817 };
818 
tables(int mode)819 static const unsigned char *tables(int mode)
820 {
821 	/* The purpose of this function to allow valgrind
822 	for reporting invalid reads and writes. */
823 	static unsigned char *tables_copy;
824 	const char *errorptr;
825 	int erroroffset;
826 	unsigned char *default_tables;
827 #if defined SUPPORT_PCRE8
828 	pcre *regex;
829 	char null_str[1] = { 0 };
830 #elif defined SUPPORT_PCRE16
831 	pcre16 *regex;
832 	PCRE_UCHAR16 null_str[1] = { 0 };
833 #elif defined SUPPORT_PCRE32
834 	pcre32 *regex;
835 	PCRE_UCHAR32 null_str[1] = { 0 };
836 #endif
837 
838 	if (mode) {
839 		if (tables_copy)
840 			free(tables_copy);
841 		tables_copy = NULL;
842 		return NULL;
843 	}
844 
845 	if (tables_copy)
846 		return tables_copy;
847 
848 	default_tables = NULL;
849 #if defined SUPPORT_PCRE8
850 	regex = pcre_compile(null_str, 0, &errorptr, &erroroffset, NULL);
851 	if (regex) {
852 		pcre_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);
853 		pcre_free(regex);
854 	}
855 #elif defined SUPPORT_PCRE16
856 	regex = pcre16_compile(null_str, 0, &errorptr, &erroroffset, NULL);
857 	if (regex) {
858 		pcre16_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);
859 		pcre16_free(regex);
860 	}
861 #elif defined SUPPORT_PCRE32
862 	regex = pcre32_compile(null_str, 0, &errorptr, &erroroffset, NULL);
863 	if (regex) {
864 		pcre32_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);
865 		pcre32_free(regex);
866 	}
867 #endif
868 	/* Shouldn't ever happen. */
869 	if (!default_tables)
870 		return NULL;
871 
872 	/* Unfortunately this value cannot get from pcre_fullinfo.
873 	Since this is a test program, this is acceptable at the moment. */
874 	tables_copy = (unsigned char *)malloc(1088);
875 	if (!tables_copy)
876 		return NULL;
877 
878 	memcpy(tables_copy, default_tables, 1088);
879 	return tables_copy;
880 }
881 
882 #ifdef SUPPORT_PCRE8
callback8(void * arg)883 static pcre_jit_stack* callback8(void *arg)
884 {
885 	return (pcre_jit_stack *)arg;
886 }
887 #endif
888 
889 #ifdef SUPPORT_PCRE16
callback16(void * arg)890 static pcre16_jit_stack* callback16(void *arg)
891 {
892 	return (pcre16_jit_stack *)arg;
893 }
894 #endif
895 
896 #ifdef SUPPORT_PCRE32
callback32(void * arg)897 static pcre32_jit_stack* callback32(void *arg)
898 {
899 	return (pcre32_jit_stack *)arg;
900 }
901 #endif
902 
903 #ifdef SUPPORT_PCRE8
904 static pcre_jit_stack *stack8;
905 
getstack8(void)906 static pcre_jit_stack *getstack8(void)
907 {
908 	if (!stack8)
909 		stack8 = pcre_jit_stack_alloc(1, 1024 * 1024);
910 	return stack8;
911 }
912 
setstack8(pcre_extra * extra)913 static void setstack8(pcre_extra *extra)
914 {
915 	if (!extra) {
916 		if (stack8)
917 			pcre_jit_stack_free(stack8);
918 		stack8 = NULL;
919 		return;
920 	}
921 
922 	pcre_assign_jit_stack(extra, callback8, getstack8());
923 }
924 #endif /* SUPPORT_PCRE8 */
925 
926 #ifdef SUPPORT_PCRE16
927 static pcre16_jit_stack *stack16;
928 
getstack16(void)929 static pcre16_jit_stack *getstack16(void)
930 {
931 	if (!stack16)
932 		stack16 = pcre16_jit_stack_alloc(1, 1024 * 1024);
933 	return stack16;
934 }
935 
setstack16(pcre16_extra * extra)936 static void setstack16(pcre16_extra *extra)
937 {
938 	if (!extra) {
939 		if (stack16)
940 			pcre16_jit_stack_free(stack16);
941 		stack16 = NULL;
942 		return;
943 	}
944 
945 	pcre16_assign_jit_stack(extra, callback16, getstack16());
946 }
947 #endif /* SUPPORT_PCRE8 */
948 
949 #ifdef SUPPORT_PCRE32
950 static pcre32_jit_stack *stack32;
951 
getstack32(void)952 static pcre32_jit_stack *getstack32(void)
953 {
954 	if (!stack32)
955 		stack32 = pcre32_jit_stack_alloc(1, 1024 * 1024);
956 	return stack32;
957 }
958 
setstack32(pcre32_extra * extra)959 static void setstack32(pcre32_extra *extra)
960 {
961 	if (!extra) {
962 		if (stack32)
963 			pcre32_jit_stack_free(stack32);
964 		stack32 = NULL;
965 		return;
966 	}
967 
968 	pcre32_assign_jit_stack(extra, callback32, getstack32());
969 }
970 #endif /* SUPPORT_PCRE8 */
971 
972 #ifdef SUPPORT_PCRE16
973 
convert_utf8_to_utf16(const char * input,PCRE_UCHAR16 * output,int * offsetmap,int max_length)974 static int convert_utf8_to_utf16(const char *input, PCRE_UCHAR16 *output, int *offsetmap, int max_length)
975 {
976 	unsigned char *iptr = (unsigned char*)input;
977 	PCRE_UCHAR16 *optr = output;
978 	unsigned int c;
979 
980 	if (max_length == 0)
981 		return 0;
982 
983 	while (*iptr && max_length > 1) {
984 		c = 0;
985 		if (offsetmap)
986 			*offsetmap++ = (int)(iptr - (unsigned char*)input);
987 
988 		if (*iptr < 0xc0)
989 			c = *iptr++;
990 		else if (!(*iptr & 0x20)) {
991 			c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
992 			iptr += 2;
993 		} else if (!(*iptr & 0x10)) {
994 			c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
995 			iptr += 3;
996 		} else if (!(*iptr & 0x08)) {
997 			c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
998 			iptr += 4;
999 		}
1000 
1001 		if (c < 65536) {
1002 			*optr++ = c;
1003 			max_length--;
1004 		} else if (max_length <= 2) {
1005 			*optr = '\0';
1006 			return (int)(optr - output);
1007 		} else {
1008 			c -= 0x10000;
1009 			*optr++ = 0xd800 | ((c >> 10) & 0x3ff);
1010 			*optr++ = 0xdc00 | (c & 0x3ff);
1011 			max_length -= 2;
1012 			if (offsetmap)
1013 				offsetmap++;
1014 		}
1015 	}
1016 	if (offsetmap)
1017 		*offsetmap = (int)(iptr - (unsigned char*)input);
1018 	*optr = '\0';
1019 	return (int)(optr - output);
1020 }
1021 
copy_char8_to_char16(const char * input,PCRE_UCHAR16 * output,int max_length)1022 static int copy_char8_to_char16(const char *input, PCRE_UCHAR16 *output, int max_length)
1023 {
1024 	unsigned char *iptr = (unsigned char*)input;
1025 	PCRE_UCHAR16 *optr = output;
1026 
1027 	if (max_length == 0)
1028 		return 0;
1029 
1030 	while (*iptr && max_length > 1) {
1031 		*optr++ = *iptr++;
1032 		max_length--;
1033 	}
1034 	*optr = '\0';
1035 	return (int)(optr - output);
1036 }
1037 
1038 #define REGTEST_MAX_LENGTH16 4096
1039 static PCRE_UCHAR16 regtest_buf16[REGTEST_MAX_LENGTH16];
1040 static int regtest_offsetmap16[REGTEST_MAX_LENGTH16];
1041 
1042 #endif /* SUPPORT_PCRE16 */
1043 
1044 #ifdef SUPPORT_PCRE32
1045 
convert_utf8_to_utf32(const char * input,PCRE_UCHAR32 * output,int * offsetmap,int max_length)1046 static int convert_utf8_to_utf32(const char *input, PCRE_UCHAR32 *output, int *offsetmap, int max_length)
1047 {
1048 	unsigned char *iptr = (unsigned char*)input;
1049 	PCRE_UCHAR32 *optr = output;
1050 	unsigned int c;
1051 
1052 	if (max_length == 0)
1053 		return 0;
1054 
1055 	while (*iptr && max_length > 1) {
1056 		c = 0;
1057 		if (offsetmap)
1058 			*offsetmap++ = (int)(iptr - (unsigned char*)input);
1059 
1060 		if (*iptr < 0xc0)
1061 			c = *iptr++;
1062 		else if (!(*iptr & 0x20)) {
1063 			c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
1064 			iptr += 2;
1065 		} else if (!(*iptr & 0x10)) {
1066 			c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
1067 			iptr += 3;
1068 		} else if (!(*iptr & 0x08)) {
1069 			c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
1070 			iptr += 4;
1071 		}
1072 
1073 		*optr++ = c;
1074 		max_length--;
1075 	}
1076 	if (offsetmap)
1077 		*offsetmap = (int)(iptr - (unsigned char*)input);
1078 	*optr = 0;
1079 	return (int)(optr - output);
1080 }
1081 
copy_char8_to_char32(const char * input,PCRE_UCHAR32 * output,int max_length)1082 static int copy_char8_to_char32(const char *input, PCRE_UCHAR32 *output, int max_length)
1083 {
1084 	unsigned char *iptr = (unsigned char*)input;
1085 	PCRE_UCHAR32 *optr = output;
1086 
1087 	if (max_length == 0)
1088 		return 0;
1089 
1090 	while (*iptr && max_length > 1) {
1091 		*optr++ = *iptr++;
1092 		max_length--;
1093 	}
1094 	*optr = '\0';
1095 	return (int)(optr - output);
1096 }
1097 
1098 #define REGTEST_MAX_LENGTH32 4096
1099 static PCRE_UCHAR32 regtest_buf32[REGTEST_MAX_LENGTH32];
1100 static int regtest_offsetmap32[REGTEST_MAX_LENGTH32];
1101 
1102 #endif /* SUPPORT_PCRE32 */
1103 
check_ascii(const char * input)1104 static int check_ascii(const char *input)
1105 {
1106 	const unsigned char *ptr = (unsigned char *)input;
1107 	while (*ptr) {
1108 		if (*ptr > 127)
1109 			return 0;
1110 		ptr++;
1111 	}
1112 	return 1;
1113 }
1114 
regression_tests(void)1115 static int regression_tests(void)
1116 {
1117 	struct regression_test_case *current = regression_test_cases;
1118 	const char *error;
1119 	char *cpu_info;
1120 	int i, err_offs;
1121 	int is_successful, is_ascii;
1122 	int total = 0;
1123 	int successful = 0;
1124 	int successful_row = 0;
1125 	int counter = 0;
1126 	int study_mode;
1127 	int utf = 0, ucp = 0;
1128 	int disabled_flags = 0;
1129 #ifdef SUPPORT_PCRE8
1130 	pcre *re8;
1131 	pcre_extra *extra8;
1132 	pcre_extra dummy_extra8;
1133 	int ovector8_1[32];
1134 	int ovector8_2[32];
1135 	int return_value8[2];
1136 	unsigned char *mark8_1, *mark8_2;
1137 #endif
1138 #ifdef SUPPORT_PCRE16
1139 	pcre16 *re16;
1140 	pcre16_extra *extra16;
1141 	pcre16_extra dummy_extra16;
1142 	int ovector16_1[32];
1143 	int ovector16_2[32];
1144 	int return_value16[2];
1145 	PCRE_UCHAR16 *mark16_1, *mark16_2;
1146 	int length16;
1147 #endif
1148 #ifdef SUPPORT_PCRE32
1149 	pcre32 *re32;
1150 	pcre32_extra *extra32;
1151 	pcre32_extra dummy_extra32;
1152 	int ovector32_1[32];
1153 	int ovector32_2[32];
1154 	int return_value32[2];
1155 	PCRE_UCHAR32 *mark32_1, *mark32_2;
1156 	int length32;
1157 #endif
1158 
1159 	/* This test compares the behaviour of interpreter and JIT. Although disabling
1160 	utf or ucp may make tests fail, if the pcre_exec result is the SAME, it is
1161 	still considered successful from pcre_jit_test point of view. */
1162 
1163 #if defined SUPPORT_PCRE8
1164 	pcre_config(PCRE_CONFIG_JITTARGET, &cpu_info);
1165 #elif defined SUPPORT_PCRE16
1166 	pcre16_config(PCRE_CONFIG_JITTARGET, &cpu_info);
1167 #elif defined SUPPORT_PCRE32
1168 	pcre32_config(PCRE_CONFIG_JITTARGET, &cpu_info);
1169 #endif
1170 
1171 	printf("Running JIT regression tests\n");
1172 	printf("  target CPU of SLJIT compiler: %s\n", cpu_info);
1173 
1174 #if defined SUPPORT_PCRE8
1175 	pcre_config(PCRE_CONFIG_UTF8, &utf);
1176 	pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
1177 #elif defined SUPPORT_PCRE16
1178 	pcre16_config(PCRE_CONFIG_UTF16, &utf);
1179 	pcre16_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
1180 #elif defined SUPPORT_PCRE16
1181 	pcre32_config(PCRE_CONFIG_UTF32, &utf);
1182 	pcre32_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
1183 #endif
1184 
1185 	if (!utf)
1186 		disabled_flags |= PCRE_UTF8 | PCRE_UTF16 | PCRE_UTF32;
1187 	if (!ucp)
1188 		disabled_flags |= PCRE_UCP;
1189 #ifdef SUPPORT_PCRE8
1190 	printf("  in  8 bit mode with UTF-8  %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled");
1191 #endif
1192 #ifdef SUPPORT_PCRE16
1193 	printf("  in 16 bit mode with UTF-16 %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled");
1194 #endif
1195 #ifdef SUPPORT_PCRE32
1196 	printf("  in 32 bit mode with UTF-32 %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled");
1197 #endif
1198 
1199 	while (current->pattern) {
1200 		/* printf("\nPattern: %s :\n", current->pattern); */
1201 		total++;
1202 		is_ascii = 0;
1203 		if (!(current->start_offset & F_PROPERTY))
1204 			is_ascii = check_ascii(current->pattern) && check_ascii(current->input);
1205 
1206 		if (current->flags & PCRE_PARTIAL_SOFT)
1207 			study_mode = PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE;
1208 		else if (current->flags & PCRE_PARTIAL_HARD)
1209 			study_mode = PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE;
1210 		else
1211 			study_mode = PCRE_STUDY_JIT_COMPILE;
1212 		error = NULL;
1213 #ifdef SUPPORT_PCRE8
1214 		re8 = NULL;
1215 		if (!(current->start_offset & F_NO8))
1216 			re8 = pcre_compile(current->pattern,
1217 				current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),
1218 				&error, &err_offs, tables(0));
1219 
1220 		extra8 = NULL;
1221 		if (re8) {
1222 			error = NULL;
1223 			extra8 = pcre_study(re8, study_mode, &error);
1224 			if (!extra8) {
1225 				printf("\n8 bit: Cannot study pattern: %s\n", current->pattern);
1226 				pcre_free(re8);
1227 				re8 = NULL;
1228 			}
1229 			else if (!(extra8->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {
1230 				printf("\n8 bit: JIT compiler does not support: %s\n", current->pattern);
1231 				pcre_free_study(extra8);
1232 				pcre_free(re8);
1233 				re8 = NULL;
1234 			}
1235 			extra8->flags |= PCRE_EXTRA_MARK;
1236 		} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO8))
1237 			printf("\n8 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error);
1238 #endif
1239 #ifdef SUPPORT_PCRE16
1240 		if ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV))
1241 			convert_utf8_to_utf16(current->pattern, regtest_buf16, NULL, REGTEST_MAX_LENGTH16);
1242 		else
1243 			copy_char8_to_char16(current->pattern, regtest_buf16, REGTEST_MAX_LENGTH16);
1244 
1245 		re16 = NULL;
1246 		if (!(current->start_offset & F_NO16))
1247 			re16 = pcre16_compile(regtest_buf16,
1248 				current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),
1249 				&error, &err_offs, tables(0));
1250 
1251 		extra16 = NULL;
1252 		if (re16) {
1253 			error = NULL;
1254 			extra16 = pcre16_study(re16, study_mode, &error);
1255 			if (!extra16) {
1256 				printf("\n16 bit: Cannot study pattern: %s\n", current->pattern);
1257 				pcre16_free(re16);
1258 				re16 = NULL;
1259 			}
1260 			else if (!(extra16->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {
1261 				printf("\n16 bit: JIT compiler does not support: %s\n", current->pattern);
1262 				pcre16_free_study(extra16);
1263 				pcre16_free(re16);
1264 				re16 = NULL;
1265 			}
1266 			extra16->flags |= PCRE_EXTRA_MARK;
1267 		} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO16))
1268 			printf("\n16 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error);
1269 #endif
1270 #ifdef SUPPORT_PCRE32
1271 		if ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV))
1272 			convert_utf8_to_utf32(current->pattern, regtest_buf32, NULL, REGTEST_MAX_LENGTH32);
1273 		else
1274 			copy_char8_to_char32(current->pattern, regtest_buf32, REGTEST_MAX_LENGTH32);
1275 
1276 		re32 = NULL;
1277 		if (!(current->start_offset & F_NO32))
1278 			re32 = pcre32_compile(regtest_buf32,
1279 				current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),
1280 				&error, &err_offs, tables(0));
1281 
1282 		extra32 = NULL;
1283 		if (re32) {
1284 			error = NULL;
1285 			extra32 = pcre32_study(re32, study_mode, &error);
1286 			if (!extra32) {
1287 				printf("\n32 bit: Cannot study pattern: %s\n", current->pattern);
1288 				pcre32_free(re32);
1289 				re32 = NULL;
1290 			}
1291 			if (!(extra32->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {
1292 				printf("\n32 bit: JIT compiler does not support: %s\n", current->pattern);
1293 				pcre32_free_study(extra32);
1294 				pcre32_free(re32);
1295 				re32 = NULL;
1296 			}
1297 			extra32->flags |= PCRE_EXTRA_MARK;
1298 		} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO32))
1299 			printf("\n32 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error);
1300 #endif
1301 
1302 		counter++;
1303 		if ((counter & 0x3) != 0) {
1304 #ifdef SUPPORT_PCRE8
1305 			setstack8(NULL);
1306 #endif
1307 #ifdef SUPPORT_PCRE16
1308 			setstack16(NULL);
1309 #endif
1310 #ifdef SUPPORT_PCRE32
1311 			setstack32(NULL);
1312 #endif
1313 		}
1314 
1315 #ifdef SUPPORT_PCRE8
1316 		return_value8[0] = -1000;
1317 		return_value8[1] = -1000;
1318 		for (i = 0; i < 32; ++i)
1319 			ovector8_1[i] = -2;
1320 		for (i = 0; i < 32; ++i)
1321 			ovector8_2[i] = -2;
1322 		if (re8) {
1323 			mark8_1 = NULL;
1324 			mark8_2 = NULL;
1325 			extra8->mark = &mark8_1;
1326 
1327 			if ((counter & 0x1) != 0) {
1328 				setstack8(extra8);
1329 				return_value8[0] = pcre_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,
1330 					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32);
1331 			} else
1332 				return_value8[0] = pcre_jit_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,
1333 					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32, getstack8());
1334 			memset(&dummy_extra8, 0, sizeof(pcre_extra));
1335 			dummy_extra8.flags = PCRE_EXTRA_MARK;
1336 			if (current->start_offset & F_STUDY) {
1337 				dummy_extra8.flags |= PCRE_EXTRA_STUDY_DATA;
1338 				dummy_extra8.study_data = extra8->study_data;
1339 			}
1340 			dummy_extra8.mark = &mark8_2;
1341 			return_value8[1] = pcre_exec(re8, &dummy_extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,
1342 				current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_2, 32);
1343 		}
1344 #endif
1345 
1346 #ifdef SUPPORT_PCRE16
1347 		return_value16[0] = -1000;
1348 		return_value16[1] = -1000;
1349 		for (i = 0; i < 32; ++i)
1350 			ovector16_1[i] = -2;
1351 		for (i = 0; i < 32; ++i)
1352 			ovector16_2[i] = -2;
1353 		if (re16) {
1354 			mark16_1 = NULL;
1355 			mark16_2 = NULL;
1356 			if ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV))
1357 				length16 = convert_utf8_to_utf16(current->input, regtest_buf16, regtest_offsetmap16, REGTEST_MAX_LENGTH16);
1358 			else
1359 				length16 = copy_char8_to_char16(current->input, regtest_buf16, REGTEST_MAX_LENGTH16);
1360 			extra16->mark = &mark16_1;
1361 			if ((counter & 0x1) != 0) {
1362 				setstack16(extra16);
1363 				return_value16[0] = pcre16_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,
1364 					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32);
1365 			} else
1366 				return_value16[0] = pcre16_jit_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,
1367 					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32, getstack16());
1368 			memset(&dummy_extra16, 0, sizeof(pcre16_extra));
1369 			dummy_extra16.flags = PCRE_EXTRA_MARK;
1370 			if (current->start_offset & F_STUDY) {
1371 				dummy_extra16.flags |= PCRE_EXTRA_STUDY_DATA;
1372 				dummy_extra16.study_data = extra16->study_data;
1373 			}
1374 			dummy_extra16.mark = &mark16_2;
1375 			return_value16[1] = pcre16_exec(re16, &dummy_extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,
1376 				current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_2, 32);
1377 		}
1378 #endif
1379 
1380 #ifdef SUPPORT_PCRE32
1381 		return_value32[0] = -1000;
1382 		return_value32[1] = -1000;
1383 		for (i = 0; i < 32; ++i)
1384 			ovector32_1[i] = -2;
1385 		for (i = 0; i < 32; ++i)
1386 			ovector32_2[i] = -2;
1387 		if (re32) {
1388 			mark32_1 = NULL;
1389 			mark32_2 = NULL;
1390 			if ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV))
1391 				length32 = convert_utf8_to_utf32(current->input, regtest_buf32, regtest_offsetmap32, REGTEST_MAX_LENGTH32);
1392 			else
1393 				length32 = copy_char8_to_char32(current->input, regtest_buf32, REGTEST_MAX_LENGTH32);
1394 			extra32->mark = &mark32_1;
1395 			if ((counter & 0x1) != 0) {
1396 				setstack32(extra32);
1397 				return_value32[0] = pcre32_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,
1398 					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32);
1399 			} else
1400 				return_value32[0] = pcre32_jit_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,
1401 					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32, getstack32());
1402 			memset(&dummy_extra32, 0, sizeof(pcre32_extra));
1403 			dummy_extra32.flags = PCRE_EXTRA_MARK;
1404 			if (current->start_offset & F_STUDY) {
1405 				dummy_extra32.flags |= PCRE_EXTRA_STUDY_DATA;
1406 				dummy_extra32.study_data = extra32->study_data;
1407 			}
1408 			dummy_extra32.mark = &mark32_2;
1409 			return_value32[1] = pcre32_exec(re32, &dummy_extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,
1410 				current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_2, 32);
1411 		}
1412 #endif
1413 
1414 		/* printf("[%d-%d-%d|%d-%d|%d-%d|%d-%d]%s",
1415 			return_value8[0], return_value16[0], return_value32[0],
1416 			ovector8_1[0], ovector8_1[1],
1417 			ovector16_1[0], ovector16_1[1],
1418 			ovector32_1[0], ovector32_1[1],
1419 			(current->flags & PCRE_CASELESS) ? "C" : ""); */
1420 
1421 		/* If F_DIFF is set, just run the test, but do not compare the results.
1422 		Segfaults can still be captured. */
1423 
1424 		is_successful = 1;
1425 		if (!(current->start_offset & F_DIFF)) {
1426 #if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE8) + defined(SUPPORT_PCRE16) + defined(SUPPORT_PCRE32)) >= 2)
1427 			if (!(current->start_offset & F_FORCECONV)) {
1428 				int return_value;
1429 
1430 				/* All results must be the same. */
1431 #ifdef SUPPORT_PCRE8
1432 				if ((return_value = return_value8[0]) != return_value8[1]) {
1433 					printf("\n8 bit: Return value differs(J8:%d,I8:%d): [%d] '%s' @ '%s'\n",
1434 						return_value8[0], return_value8[1], total, current->pattern, current->input);
1435 					is_successful = 0;
1436 				} else
1437 #endif
1438 #ifdef SUPPORT_PCRE16
1439 				if ((return_value = return_value16[0]) != return_value16[1]) {
1440 					printf("\n16 bit: Return value differs(J16:%d,I16:%d): [%d] '%s' @ '%s'\n",
1441 						return_value16[0], return_value16[1], total, current->pattern, current->input);
1442 					is_successful = 0;
1443 				} else
1444 #endif
1445 #ifdef SUPPORT_PCRE32
1446 				if ((return_value = return_value32[0]) != return_value32[1]) {
1447 					printf("\n32 bit: Return value differs(J32:%d,I32:%d): [%d] '%s' @ '%s'\n",
1448 						return_value32[0], return_value32[1], total, current->pattern, current->input);
1449 					is_successful = 0;
1450 				} else
1451 #endif
1452 #if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16
1453 				if (return_value8[0] != return_value16[0]) {
1454 					printf("\n8 and 16 bit: Return value differs(J8:%d,J16:%d): [%d] '%s' @ '%s'\n",
1455 						return_value8[0], return_value16[0],
1456 						total, current->pattern, current->input);
1457 					is_successful = 0;
1458 				} else
1459 #endif
1460 #if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32
1461 				if (return_value8[0] != return_value32[0]) {
1462 					printf("\n8 and 32 bit: Return value differs(J8:%d,J32:%d): [%d] '%s' @ '%s'\n",
1463 						return_value8[0], return_value32[0],
1464 						total, current->pattern, current->input);
1465 					is_successful = 0;
1466 				} else
1467 #endif
1468 #if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32
1469 				if (return_value16[0] != return_value32[0]) {
1470 					printf("\n16 and 32 bit: Return value differs(J16:%d,J32:%d): [%d] '%s' @ '%s'\n",
1471 						return_value16[0], return_value32[0],
1472 						total, current->pattern, current->input);
1473 					is_successful = 0;
1474 				} else
1475 #endif
1476 				if (return_value >= 0 || return_value == PCRE_ERROR_PARTIAL) {
1477 					if (return_value == PCRE_ERROR_PARTIAL) {
1478 						return_value = 2;
1479 					} else {
1480 						return_value *= 2;
1481 					}
1482 #ifdef SUPPORT_PCRE8
1483 					return_value8[0] = return_value;
1484 #endif
1485 #ifdef SUPPORT_PCRE16
1486 					return_value16[0] = return_value;
1487 #endif
1488 #ifdef SUPPORT_PCRE32
1489 					return_value32[0] = return_value;
1490 #endif
1491 					/* Transform back the results. */
1492 					if (current->flags & PCRE_UTF8) {
1493 #ifdef SUPPORT_PCRE16
1494 						for (i = 0; i < return_value; ++i) {
1495 							if (ovector16_1[i] >= 0)
1496 								ovector16_1[i] = regtest_offsetmap16[ovector16_1[i]];
1497 							if (ovector16_2[i] >= 0)
1498 								ovector16_2[i] = regtest_offsetmap16[ovector16_2[i]];
1499 						}
1500 #endif
1501 #ifdef SUPPORT_PCRE32
1502 						for (i = 0; i < return_value; ++i) {
1503 							if (ovector32_1[i] >= 0)
1504 								ovector32_1[i] = regtest_offsetmap32[ovector32_1[i]];
1505 							if (ovector32_2[i] >= 0)
1506 								ovector32_2[i] = regtest_offsetmap32[ovector32_2[i]];
1507 						}
1508 #endif
1509 					}
1510 
1511 					for (i = 0; i < return_value; ++i) {
1512 #if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16
1513 						if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector16_1[i] || ovector8_1[i] != ovector16_2[i]) {
1514 							printf("\n8 and 16 bit: Ovector[%d] value differs(J8:%d,I8:%d,J16:%d,I16:%d): [%d] '%s' @ '%s' \n",
1515 								i, ovector8_1[i], ovector8_2[i], ovector16_1[i], ovector16_2[i],
1516 								total, current->pattern, current->input);
1517 							is_successful = 0;
1518 						}
1519 #endif
1520 #if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32
1521 						if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector32_1[i] || ovector8_1[i] != ovector32_2[i]) {
1522 							printf("\n8 and 32 bit: Ovector[%d] value differs(J8:%d,I8:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
1523 								i, ovector8_1[i], ovector8_2[i], ovector32_1[i], ovector32_2[i],
1524 								total, current->pattern, current->input);
1525 							is_successful = 0;
1526 						}
1527 #endif
1528 #if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE16
1529 						if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector16_1[i] || ovector16_1[i] != ovector16_2[i]) {
1530 							printf("\n16 and 16 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
1531 								i, ovector16_1[i], ovector16_2[i], ovector16_1[i], ovector16_2[i],
1532 								total, current->pattern, current->input);
1533 							is_successful = 0;
1534 						}
1535 #endif
1536 					}
1537 				}
1538 			} else
1539 #endif /* more than one of SUPPORT_PCRE8, SUPPORT_PCRE16 and SUPPORT_PCRE32 */
1540 			{
1541 				/* Only the 8 bit and 16 bit results must be equal. */
1542 #ifdef SUPPORT_PCRE8
1543 				if (return_value8[0] != return_value8[1]) {
1544 					printf("\n8 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
1545 						return_value8[0], return_value8[1], total, current->pattern, current->input);
1546 					is_successful = 0;
1547 				} else if (return_value8[0] >= 0 || return_value8[0] == PCRE_ERROR_PARTIAL) {
1548 					if (return_value8[0] == PCRE_ERROR_PARTIAL)
1549 						return_value8[0] = 2;
1550 					else
1551 						return_value8[0] *= 2;
1552 
1553 					for (i = 0; i < return_value8[0]; ++i)
1554 						if (ovector8_1[i] != ovector8_2[i]) {
1555 							printf("\n8 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
1556 								i, ovector8_1[i], ovector8_2[i], total, current->pattern, current->input);
1557 							is_successful = 0;
1558 						}
1559 				}
1560 #endif
1561 
1562 #ifdef SUPPORT_PCRE16
1563 				if (return_value16[0] != return_value16[1]) {
1564 					printf("\n16 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
1565 						return_value16[0], return_value16[1], total, current->pattern, current->input);
1566 					is_successful = 0;
1567 				} else if (return_value16[0] >= 0 || return_value16[0] == PCRE_ERROR_PARTIAL) {
1568 					if (return_value16[0] == PCRE_ERROR_PARTIAL)
1569 						return_value16[0] = 2;
1570 					else
1571 						return_value16[0] *= 2;
1572 
1573 					for (i = 0; i < return_value16[0]; ++i)
1574 						if (ovector16_1[i] != ovector16_2[i]) {
1575 							printf("\n16 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
1576 								i, ovector16_1[i], ovector16_2[i], total, current->pattern, current->input);
1577 							is_successful = 0;
1578 						}
1579 				}
1580 #endif
1581 
1582 #ifdef SUPPORT_PCRE32
1583 				if (return_value32[0] != return_value32[1]) {
1584 					printf("\n32 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
1585 						return_value32[0], return_value32[1], total, current->pattern, current->input);
1586 					is_successful = 0;
1587 				} else if (return_value32[0] >= 0 || return_value32[0] == PCRE_ERROR_PARTIAL) {
1588 					if (return_value32[0] == PCRE_ERROR_PARTIAL)
1589 						return_value32[0] = 2;
1590 					else
1591 						return_value32[0] *= 2;
1592 
1593 					for (i = 0; i < return_value32[0]; ++i)
1594 						if (ovector32_1[i] != ovector32_2[i]) {
1595 							printf("\n32 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
1596 								i, ovector32_1[i], ovector32_2[i], total, current->pattern, current->input);
1597 							is_successful = 0;
1598 						}
1599 				}
1600 #endif
1601 			}
1602 		}
1603 
1604 		if (is_successful) {
1605 #ifdef SUPPORT_PCRE8
1606 			if (!(current->start_offset & F_NO8) && ((utf && ucp) || is_ascii)) {
1607 				if (return_value8[0] < 0 && !(current->start_offset & F_NOMATCH)) {
1608 					printf("8 bit: Test should match: [%d] '%s' @ '%s'\n",
1609 						total, current->pattern, current->input);
1610 					is_successful = 0;
1611 				}
1612 
1613 				if (return_value8[0] >= 0 && (current->start_offset & F_NOMATCH)) {
1614 					printf("8 bit: Test should not match: [%d] '%s' @ '%s'\n",
1615 						total, current->pattern, current->input);
1616 					is_successful = 0;
1617 				}
1618 			}
1619 #endif
1620 #ifdef SUPPORT_PCRE16
1621 			if (!(current->start_offset & F_NO16) && ((utf && ucp) || is_ascii)) {
1622 				if (return_value16[0] < 0 && !(current->start_offset & F_NOMATCH)) {
1623 					printf("16 bit: Test should match: [%d] '%s' @ '%s'\n",
1624 						total, current->pattern, current->input);
1625 					is_successful = 0;
1626 				}
1627 
1628 				if (return_value16[0] >= 0 && (current->start_offset & F_NOMATCH)) {
1629 					printf("16 bit: Test should not match: [%d] '%s' @ '%s'\n",
1630 						total, current->pattern, current->input);
1631 					is_successful = 0;
1632 				}
1633 			}
1634 #endif
1635 #ifdef SUPPORT_PCRE32
1636 			if (!(current->start_offset & F_NO32) && ((utf && ucp) || is_ascii)) {
1637 				if (return_value32[0] < 0 && !(current->start_offset & F_NOMATCH)) {
1638 					printf("32 bit: Test should match: [%d] '%s' @ '%s'\n",
1639 						total, current->pattern, current->input);
1640 					is_successful = 0;
1641 				}
1642 
1643 				if (return_value32[0] >= 0 && (current->start_offset & F_NOMATCH)) {
1644 					printf("32 bit: Test should not match: [%d] '%s' @ '%s'\n",
1645 						total, current->pattern, current->input);
1646 					is_successful = 0;
1647 				}
1648 			}
1649 #endif
1650 		}
1651 
1652 		if (is_successful) {
1653 #ifdef SUPPORT_PCRE8
1654 			if (mark8_1 != mark8_2) {
1655 				printf("8 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
1656 					total, current->pattern, current->input);
1657 				is_successful = 0;
1658 			}
1659 #endif
1660 #ifdef SUPPORT_PCRE16
1661 			if (mark16_1 != mark16_2) {
1662 				printf("16 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
1663 					total, current->pattern, current->input);
1664 				is_successful = 0;
1665 			}
1666 #endif
1667 #ifdef SUPPORT_PCRE32
1668 			if (mark32_1 != mark32_2) {
1669 				printf("32 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
1670 					total, current->pattern, current->input);
1671 				is_successful = 0;
1672 			}
1673 #endif
1674 		}
1675 
1676 #ifdef SUPPORT_PCRE8
1677 		if (re8) {
1678 			pcre_free_study(extra8);
1679 			pcre_free(re8);
1680 		}
1681 #endif
1682 #ifdef SUPPORT_PCRE16
1683 		if (re16) {
1684 			pcre16_free_study(extra16);
1685 			pcre16_free(re16);
1686 		}
1687 #endif
1688 #ifdef SUPPORT_PCRE32
1689 		if (re32) {
1690 			pcre32_free_study(extra32);
1691 			pcre32_free(re32);
1692 		}
1693 #endif
1694 
1695 		if (is_successful) {
1696 			successful++;
1697 			successful_row++;
1698 			printf(".");
1699 			if (successful_row >= 60) {
1700 				successful_row = 0;
1701 				printf("\n");
1702 			}
1703 		} else
1704 			successful_row = 0;
1705 
1706 		fflush(stdout);
1707 		current++;
1708 	}
1709 	tables(1);
1710 #ifdef SUPPORT_PCRE8
1711 	setstack8(NULL);
1712 #endif
1713 #ifdef SUPPORT_PCRE16
1714 	setstack16(NULL);
1715 #endif
1716 #ifdef SUPPORT_PCRE32
1717 	setstack32(NULL);
1718 #endif
1719 
1720 	if (total == successful) {
1721 		printf("\nAll JIT regression tests are successfully passed.\n");
1722 		return 0;
1723 	} else {
1724 		printf("\nSuccessful test ratio: %d%% (%d failed)\n", successful * 100 / total, total - successful);
1725 		return 1;
1726 	}
1727 }
1728 
1729 /* End of pcre_jit_test.c */
1730