Home | History | Annotate | Download | only in dist
      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 
     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 
    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
    883 static pcre_jit_stack* callback8(void *arg)
    884 {
    885 	return (pcre_jit_stack *)arg;
    886 }
    887 #endif
    888 
    889 #ifdef SUPPORT_PCRE16
    890 static pcre16_jit_stack* callback16(void *arg)
    891 {
    892 	return (pcre16_jit_stack *)arg;
    893 }
    894 #endif
    895 
    896 #ifdef SUPPORT_PCRE32
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
   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 
   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 
   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 
   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 
   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