xref: /openbsd-src/gnu/usr.bin/perl/t/re/anyof.t (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
15759b3d2Safresh1#!./perl
25759b3d2Safresh1
3f3efcd01Safresh1use strict;
4f3efcd01Safresh1use warnings;
55759b3d2Safresh1use utf8;
65759b3d2Safresh1
75759b3d2Safresh1# This tests that the ANYOF nodes generated by bracketed character classes are
85759b3d2Safresh1# as expected.  The representation of these is not guaranteed, and this test
95759b3d2Safresh1# may need to be updated if it changes.  But it is here to make sure that no
105759b3d2Safresh1# unexpected changes occur.  These could come from faulty generation of the
115759b3d2Safresh1# node, or faulty display of them (or both).  Because these causes come from
125759b3d2Safresh1# very different parts of the regex compiler, it is unlikely that a commit
135759b3d2Safresh1# would change both of them, so this test will adequately serve to test both.
145759b3d2Safresh1
155759b3d2Safresh1BEGIN {
165759b3d2Safresh1    chdir 't' if -d 't';
175759b3d2Safresh1    require './test.pl';
185759b3d2Safresh1    set_up_inc('../lib','.','../ext/re');
19*5486feefSafresh1    require Config; Config->import;
205759b3d2Safresh1    skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
215759b3d2Safresh1}
225759b3d2Safresh1
235759b3d2Safresh1# An array is used instead of a hash, so that the tests are carried out in the
245759b3d2Safresh1# order given by this file.  Even-numbered indices are the regexes to compile.
255759b3d2Safresh1# The next higher element is the expected compilation result.
265759b3d2Safresh1#
275759b3d2Safresh1# It is painful to port some of these to EBCDIC, as not only do the code point
285759b3d2Safresh1# numbers change (for those < 256), but the order changes, as the compiled
295759b3d2Safresh1# version is sorted by native code point order.  On EBCDIC, \r comes before
305759b3d2Safresh1# \n, and 'k' before "K', for example.  So, the tests where there are
315759b3d2Safresh1# differences are skipped on EBCDIC.  They are all at the beginning of the
325759b3d2Safresh1# array, and a special marker entry is used to delmit the boundary between
335759b3d2Safresh1# skipped and not skipped.
34f3efcd01Safresh1#
35f3efcd01Safresh1# NOTE:  If the pattern contains (?8) it will be upgraded to UTF-8 after
36f3efcd01Safresh1#        stripping that
375759b3d2Safresh1
38de8cc8edSafresh1use Unicode::UCD;
39de8cc8edSafresh1my $highest_cp = $Unicode::UCD::MAX_CP;
40de8cc8edSafresh1my $highest_cp_string = sprintf "%X", $highest_cp;
41de8cc8edSafresh1$highest_cp_string = "$highest_cp_string";
425759b3d2Safresh1
43de8cc8edSafresh1my $infinity = $highest_cp_string;
44de8cc8edSafresh1$infinity =~ s/^7/F/;  # Make infinity larger than the largest legal one, and
45de8cc8edSafresh1                       # at the time of this writing, we really internally
46de8cc8edSafresh1                       # allow UV_MAX to be infinity.
475759b3d2Safresh1
48f3efcd01Safresh1sub  get_compiled ($) {
49f3efcd01Safresh1    # Convert platform-independent values to what is suitable for the
50f3efcd01Safresh1    # platform
51f3efcd01Safresh1
52f3efcd01Safresh1    my $pattern = shift;
53f3efcd01Safresh1
54de8cc8edSafresh1    $pattern =~ s/{INFTY}/\\x{$infinity}/g;
55de8cc8edSafresh1    $pattern =~ s/{HIGHEST_CP}/\\x{$highest_cp_string}/g;
56f3efcd01Safresh1    my $use_utf8 = ($pattern =~ s/\Q(?8)//);
57f3efcd01Safresh1
58f3efcd01Safresh1    $pattern = "my \$a = '$pattern';";
59f3efcd01Safresh1    $pattern .= "utf8::upgrade(\$a);" if $use_utf8;
60f3efcd01Safresh1    $pattern .= "qr/\$a/";
61f3efcd01Safresh1    my $actual_pattern = "use re qw(Debug COMPILE); $pattern";
62f3efcd01Safresh1
63f3efcd01Safresh1    my $result = fresh_perl($actual_pattern);
64f3efcd01Safresh1    if ($? != 0) {  # Re-run so as to display STDERR.
65de8cc8edSafresh1        fail($pattern, "Until this is fixed, the planned number of tests will be wrong");
66f3efcd01Safresh1        fresh_perl($actual_pattern, { stderr => 0, verbose => 1 });
67f3efcd01Safresh1        return;
68f3efcd01Safresh1    }
69f3efcd01Safresh1
70f3efcd01Safresh1    # The Debug output will come back as a bunch of lines.  We are
71f3efcd01Safresh1    # interested only in the line after /Final program/
72f3efcd01Safresh1    my @lines = split /\n/, $result;
73f3efcd01Safresh1    while (defined ($_ = shift @lines)) {
74f3efcd01Safresh1        last if /Final program/;
75f3efcd01Safresh1    }
76f3efcd01Safresh1
77f3efcd01Safresh1    $_ = shift @lines;
78256a93a4Safresh1    unless (defined $_) {
79256a93a4Safresh1        die "Unexpected compilation result: '$result'\n"
80256a93a4Safresh1          . " Compiled from '$actual_pattern'";
81256a93a4Safresh1    }
82f3efcd01Safresh1
83f3efcd01Safresh1    s/ \s* \( \d+ \) \s* //x;   # Get rid of the node branch
84f3efcd01Safresh1    s/ ^ \s* \d+ : \s* //x;     # ... And the node number
85f3efcd01Safresh1
86f3efcd01Safresh1    # Use platform-independent values
87de8cc8edSafresh1    s/$infinity/INFTY/ig;
88de8cc8edSafresh1    s/$highest_cp_string/HIGHEST_CP/ig;
89f3efcd01Safresh1
90f3efcd01Safresh1    return $_;
91f3efcd01Safresh1}
92f3efcd01Safresh1
93f3efcd01Safresh1# Note: EXACTish lowercases the hex; ANYOF uppercases, without braces
94f3efcd01Safresh1
95f3efcd01Safresh1my @tests = (
96f3efcd01Safresh1    '[\xe0\xc0]' => 'EXACTFU <\\x{e0}>',
97f3efcd01Safresh1    '[\xe1\xc1]' => 'EXACTFU <\\x{e1}>',
98f3efcd01Safresh1    '[\xe2\xc2]' => 'EXACTFU <\\x{e2}>',
99f3efcd01Safresh1    '[\xe3\xc3]' => 'EXACTFU <\\x{e3}>',
100f3efcd01Safresh1    '[\xe4\xc4]' => 'EXACTFU <\\x{e4}>',
101f3efcd01Safresh1    '[\xc5\xe5]' => 'ANYOF[\\xC5\\xE5]',
102f3efcd01Safresh1    '[\xe6\xc6]' => 'EXACTFU <\\x{e6}>',
103f3efcd01Safresh1    '[\xe7\xc7]' => 'EXACTFU <\\x{e7}>',
104f3efcd01Safresh1    '[\xe8\xc8]' => 'EXACTFU <\\x{e8}>',
105f3efcd01Safresh1    '[\xe9\xc9]' => 'EXACTFU <\\x{e9}>',
106f3efcd01Safresh1    '[\xea\xca]' => 'EXACTFU <\\x{ea}>',
107f3efcd01Safresh1    '[\xeb\xcb]' => 'EXACTFU <\\x{eb}>',
108f3efcd01Safresh1    '[\xec\xcc]' => 'EXACTFU <\\x{ec}>',
109f3efcd01Safresh1    '[\xee\xce]' => 'EXACTFU <\\x{ee}>',
110f3efcd01Safresh1    '[\xef\xcf]' => 'EXACTFU <\\x{ef}>',
111f3efcd01Safresh1    '[\xf0\xd0]' => 'EXACTFU <\\x{f0}>',
112f3efcd01Safresh1    '[\xf1\xd1]' => 'EXACTFU <\\x{f1}>',
113f3efcd01Safresh1    '[\xf2\xd2]' => 'EXACTFU <\\x{f2}>',
114f3efcd01Safresh1    '[\xf3\xd3]' => 'EXACTFU <\\x{f3}>',
115f3efcd01Safresh1    '[\xf4\xd4]' => 'EXACTFU <\\x{f4}>',
116f3efcd01Safresh1    '[\xf5\xd5]' => 'EXACTFU <\\x{f5}>',
117f3efcd01Safresh1    '[\xf6\xd6]' => 'EXACTFU <\\x{f6}>',
118f3efcd01Safresh1    '[\xf8\xd8]' => 'EXACTFU <\\x{f8}>',
119f3efcd01Safresh1    '[\xf9\xd9]' => 'EXACTFU <\\x{f9}>',
120f3efcd01Safresh1    '[\xfa\xda]' => 'EXACTFU <\\x{fa}>',
121f3efcd01Safresh1    '[\xfb\xdb]' => 'EXACTFU <\\x{fb}>',
122f3efcd01Safresh1    '[\xfc\xdc]' => 'EXACTFU <\\x{fc}>',
123f3efcd01Safresh1    '[\xfd\xdd]' => 'EXACTFU <\\x{fd}>',
124f3efcd01Safresh1    '[\xfe\xde]' => 'EXACTFU <\\x{fe}>',
125f3efcd01Safresh1
126f3efcd01Safresh1    '[[{]' => 'ANYOFM[\[\{]',
127f3efcd01Safresh1    '[^\S ]' => 'ANYOFD[\t\n\x0B\f\r{utf8}\x85\xA0][1680 2000-200A 2028-2029 202F 205F 3000]',
128f3efcd01Safresh1    '[^\n\r]' => 'ANYOF[^\n\r][0100-INFTY]',
129f3efcd01Safresh1    '[^\/\|,\$\%%\@\ \%"\<\>\:\#\&\*\{\}\[\]\(\)]' => 'ANYOF[^ "#$%&()*,/:<>@\[\]\{|\}][0100-INFTY]',
130f3efcd01Safresh1    '[[:ascii:]]' => 'ANYOFM[\x00-\x7F]',
131f3efcd01Safresh1    '[[:^ascii:]]' => 'NANYOFM[\x00-\x7F]',
132f3efcd01Safresh1    '[[:^ascii:]\x{2C2}]' => 'NANYOFM[\x00-\x7F]',
133f3efcd01Safresh1    '(?u)[[:ascii:]]' => 'ANYOFM[\x00-\x7F]',
134f3efcd01Safresh1    '(?u)[[:^ascii:]]' => 'NANYOFM[\x00-\x7F]',
135f3efcd01Safresh1    '(?a)[[:ascii:]]' => 'ANYOFM[\x00-\x7F]',
136f3efcd01Safresh1    '(?a)[[:^ascii:]]' => 'NANYOFM[\x00-\x7F]',
137f3efcd01Safresh1    '(?a)[[:^ascii:]\x{2C2}]' => 'NANYOFM[\x00-\x7F]',
138f3efcd01Safresh1    '[[:cntrl:]]' => 'POSIXD[:cntrl:]',
139f3efcd01Safresh1    '[^[:^print:][:^ascii:]]' => 'POSIXA[:print:]',
140f2a19305Safresh1    '[^[:^print:][:^ascii:]b]' => 'ANYOF[^\x00-\x1Fb\x7F-\xFF][0100-INFTY]',
141f2a19305Safresh1    '[^[:^print:][:^ascii:]b\p{Is_unresolved}]' => 'ANYOF[^\x00-\x1Fb\x7F-\xFF{+main::Is_unresolved}0100-INFTY]',
142f3efcd01Safresh1    '[[:blank:]]' => 'POSIXD[:blank:]',
143f3efcd01Safresh1    '[ [:blank:]]' => 'POSIXD[:blank:]',
144f3efcd01Safresh1    '[_[:blank:]]' => 'ANYOFD[\t _{utf8}\xA0][1680 2000-200A 202F 205F 3000]',
145f3efcd01Safresh1    '[_[:^blank:]]' => 'NPOSIXD[:blank:]',
146f3efcd01Safresh1    '[\xA0[:^blank:]]' => 'ANYOF[^\t ][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFTY]',
147f3efcd01Safresh1    '(?d:[_[:^blank:]])' => 'NPOSIXD[:blank:]',
148de8cc8edSafresh1    '[\x{07}-\x{0B}]' => 'ANYOFR[\a\b\t\n\x0B]',
149de8cc8edSafresh1    '(?l)[\x{2029}]' => 'EXACTL <\x{2029}>',
150de8cc8edSafresh1    '(?l)(?[\x{2029}])' => 'ANYOFL{utf8-locale-reqd}[2029]', # regex sets requires utf8 locale for /l
151de8cc8edSafresh1    '(?il)[\x{212A}]' => 'EXACTFL <\\x{212a}>',
152f3efcd01Safresh1    '(?il)(?[\x{212A}])' => 'ANYOFL{utf8-locale-reqd}[Kk][212A]',
153f3efcd01Safresh1
154f3efcd01Safresh1    '(?i)b[s]\xe0' => 'ANYOFM[Bb]',    # The s goes into a 2nd node
155f3efcd01Safresh1
156f3efcd01Safresh1    '[aA]' => 'ANYOFM[Aa]',
157f3efcd01Safresh1    '[bB]' => 'ANYOFM[Bb]',
158f3efcd01Safresh1    '[kK]' => 'ANYOFM[Kk]',
159f3efcd01Safresh1
160f3efcd01Safresh1    'ebcdic_ok_below_this_marker',
161f3efcd01Safresh1
162f3efcd01Safresh1    '(?i:[^:])' => 'NANYOFM[:]',
163f3efcd01Safresh1
164f3efcd01Safresh1    '[^\n]' => 'REG_ANY',
165f3efcd01Safresh1
166f3efcd01Safresh1    '[[:alpha:]]' => 'POSIXD[:alpha:]',
167f3efcd01Safresh1    '[[:^alpha:]]' => 'NPOSIXD[:alpha:]',
168f3efcd01Safresh1    '[[:^alpha:]\x{2C2}]' => 'NPOSIXU[:alpha:]',
169f3efcd01Safresh1    '(?l)[[:alpha:]]' => 'POSIXL[:alpha:]',
170f3efcd01Safresh1    '(?l)[[:^alpha:]]' => 'NPOSIXL[:alpha:]',
171f3efcd01Safresh1    '(?l)[[:^alpha:]\x{2C2}]' => 'NPOSIXL[:alpha:]',
172f3efcd01Safresh1    '(?u)[[:alpha:]]' => 'POSIXU[:alpha:]',
173f3efcd01Safresh1    '(?u)[[:^alpha:]]' => 'NPOSIXU[:alpha:]',
174f3efcd01Safresh1    '(?a)[[:alpha:]]' => 'POSIXA[:alpha:]',
175f3efcd01Safresh1    '(?a)[[:^alpha:]]' => 'NPOSIXA[:alpha:]',
176f3efcd01Safresh1    '(?a)[[:^alpha:]\x{2C2}]' => 'NPOSIXA[:alpha:]',
177f3efcd01Safresh1    '[[:alpha:][:^alpha:]]' => 'SANY',
178f3efcd01Safresh1    '[^[:alpha:][:^alpha:]]' => 'OPFAIL',
179f3efcd01Safresh1    '(?l)[[:alpha:][:^alpha:]]' => 'SANY',
180f3efcd01Safresh1    '(?l)[^[:alpha:][:^alpha:]]' => 'OPFAIL',
181f3efcd01Safresh1    '(?u)[[:alpha:][:^alpha:]]' => 'SANY',
182f3efcd01Safresh1    '(?u)[^[:alpha:][:^alpha:]]' => 'OPFAIL',
183f3efcd01Safresh1    '(?a)[[:alpha:][:^alpha:]]' => 'SANY',
184f3efcd01Safresh1    '(?a)[^[:alpha:][:^alpha:]]' => 'OPFAIL',
185f3efcd01Safresh1    '[[:alnum:]]' => 'POSIXD[:alnum:]',
186f3efcd01Safresh1    '[[:^alnum:]]' => 'NPOSIXD[:alnum:]',
187f3efcd01Safresh1    '[[:^alnum:]\x{2C2}]' => 'NPOSIXU[:alnum:]',
188f3efcd01Safresh1    '(?l)[[:alnum:]]' => 'POSIXL[:alnum:]',
189f3efcd01Safresh1    '(?l)[[:^alnum:]]' => 'NPOSIXL[:alnum:]',
190f3efcd01Safresh1    '(?l)[[:^alnum:]\x{2C2}]' => 'NPOSIXL[:alnum:]',
191f3efcd01Safresh1    '(?u)[[:alnum:]]' => 'POSIXU[:alnum:]',
192f3efcd01Safresh1    '(?u)[[:^alnum:]]' => 'NPOSIXU[:alnum:]',
193f3efcd01Safresh1    '(?a)[[:alnum:]]' => 'POSIXA[:alnum:]',
194f3efcd01Safresh1    '(?a)[[:^alnum:]]' => 'NPOSIXA[:alnum:]',
195f3efcd01Safresh1    '(?a)[[:^alnum:]\x{2C2}]' => 'NPOSIXA[:alnum:]',
196f3efcd01Safresh1    '[[:alnum:][:^alnum:]]' => 'SANY',
197f3efcd01Safresh1    '[^[:alnum:][:^alnum:]]' => 'OPFAIL',
198f3efcd01Safresh1    '(?l)[[:alnum:][:^alnum:]]' => 'SANY',
199f3efcd01Safresh1    '(?l)[^[:alnum:][:^alnum:]]' => 'OPFAIL',
200f3efcd01Safresh1    '(?u)[[:alnum:][:^alnum:]]' => 'SANY',
201f3efcd01Safresh1    '(?u)[^[:alnum:][:^alnum:]]' => 'OPFAIL',
202f3efcd01Safresh1    '(?a)[[:alnum:][:^alnum:]]' => 'SANY',
203f3efcd01Safresh1    '(?a)[^[:alnum:][:^alnum:]]' => 'OPFAIL',
204f3efcd01Safresh1    '(?l)[[:ascii:]]' => 'POSIXL[:ascii:]',
205f3efcd01Safresh1    '(?l)[[:^ascii:]]' => 'NPOSIXL[:ascii:]',
206f3efcd01Safresh1    '(?l)[[:^ascii:]\x{2C2}]' => 'NPOSIXL[:ascii:]',
207f3efcd01Safresh1    '[[:ascii:][:^ascii:]]' => 'SANY',
208f3efcd01Safresh1    '[^[:ascii:][:^ascii:]]' => 'OPFAIL',
209f3efcd01Safresh1    '(?l)[[:ascii:][:^ascii:]]' => 'SANY',
210f3efcd01Safresh1    '(?l)[^[:ascii:][:^ascii:]]' => 'OPFAIL',
211f3efcd01Safresh1    '(?u)[[:ascii:][:^ascii:]]' => 'SANY',
212f3efcd01Safresh1    '(?u)[^[:ascii:][:^ascii:]]' => 'OPFAIL',
213f3efcd01Safresh1    '(?a)[[:ascii:][:^ascii:]]' => 'SANY',
214f3efcd01Safresh1    '(?a)[^[:ascii:][:^ascii:]]' => 'OPFAIL',
215f3efcd01Safresh1    '[[:^blank:]]' => 'NPOSIXD[:blank:]',
216f3efcd01Safresh1    '[[:^blank:]\x{2C2}]' => 'NPOSIXU[:blank:]',
217f3efcd01Safresh1    '(?l)[[:blank:]]' => 'POSIXL[:blank:]',
218f3efcd01Safresh1    '(?l)[[:^blank:]]' => 'NPOSIXL[:blank:]',
219f3efcd01Safresh1    '(?l)[[:^blank:]\x{2C2}]' => 'NPOSIXL[:blank:]',
220f3efcd01Safresh1    '(?u)[[:blank:]]' => 'POSIXU[:blank:]',
221f3efcd01Safresh1    '(?u)[[:^blank:]]' => 'NPOSIXU[:blank:]',
222f3efcd01Safresh1    '(?a)[[:blank:]]' => 'POSIXA[:blank:]',
223f3efcd01Safresh1    '(?a)[[:^blank:]]' => 'NPOSIXA[:blank:]',
224f3efcd01Safresh1    '(?a)[[:^blank:]\x{2C2}]' => 'NPOSIXA[:blank:]',
225f3efcd01Safresh1    '[[:blank:]]' => 'POSIXD[:blank:]',
226f3efcd01Safresh1    '[[:blank:][:^blank:]]' => 'SANY',
227f3efcd01Safresh1    '[^[:blank:][:^blank:]]' => 'OPFAIL',
228f3efcd01Safresh1    '(?l)[[:blank:][:^blank:]]' => 'SANY',
229f3efcd01Safresh1    '(?l)[^[:blank:][:^blank:]]' => 'OPFAIL',
230f3efcd01Safresh1    '(?u)[[:blank:][:^blank:]]' => 'SANY',
231f3efcd01Safresh1    '(?u)[^[:blank:][:^blank:]]' => 'OPFAIL',
232f3efcd01Safresh1    '(?a)[[:blank:][:^blank:]]' => 'SANY',
233f3efcd01Safresh1    '(?a)[^[:blank:][:^blank:]]' => 'OPFAIL',
234f3efcd01Safresh1    '[[:^cntrl:]]' => 'NPOSIXD[:cntrl:]',
235f3efcd01Safresh1    '[[:^cntrl:]\x{2C2}]' => 'NPOSIXU[:cntrl:]',
236f3efcd01Safresh1    '(?l)[[:cntrl:]]' => 'POSIXL[:cntrl:]',
237f3efcd01Safresh1    '(?l)[[:^cntrl:]]' => 'NPOSIXL[:cntrl:]',
238f3efcd01Safresh1    '(?l)[[:^cntrl:]\x{2C2}]' => 'NPOSIXL[:cntrl:]',
239f3efcd01Safresh1    '(?u)[[:cntrl:]]' => 'POSIXU[:cntrl:]',
240f3efcd01Safresh1    '(?u)[[:^cntrl:]]' => 'NPOSIXU[:cntrl:]',
241f3efcd01Safresh1    '(?a)[[:cntrl:]]' => 'POSIXA[:cntrl:]',
242f3efcd01Safresh1    '(?a)[[:^cntrl:]]' => 'NPOSIXA[:cntrl:]',
243f3efcd01Safresh1    '(?a)[[:^cntrl:]\x{2C2}]' => 'NPOSIXA[:cntrl:]',
244f3efcd01Safresh1    '[[:cntrl:][:^cntrl:]]' => 'SANY',
245f3efcd01Safresh1    '[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
246f3efcd01Safresh1    '(?l)[[:cntrl:][:^cntrl:]]' => 'SANY',
247f3efcd01Safresh1    '(?l)[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
248f3efcd01Safresh1    '(?u)[[:cntrl:][:^cntrl:]]' => 'SANY',
249f3efcd01Safresh1    '(?u)[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
250f3efcd01Safresh1    '(?a)[[:cntrl:][:^cntrl:]]' => 'SANY',
251f3efcd01Safresh1    '(?a)[^[:cntrl:][:^cntrl:]]' => 'OPFAIL',
252f3efcd01Safresh1    '[[:digit:]]' => 'POSIXU[\d]',
253f3efcd01Safresh1    '[[:^digit:]]' => 'NPOSIXU[\d]',
254f3efcd01Safresh1    '[[:^digit:]\x{2C2}]' => 'NPOSIXU[\d]',
255f3efcd01Safresh1    '(?l)[[:digit:]]' => 'POSIXL[\d]',
256f3efcd01Safresh1    '(?l)[[:^digit:]]' => 'NPOSIXL[\d]',
257f3efcd01Safresh1    '(?l)[[:^digit:]\x{2C2}]' => 'NPOSIXL[\d]',
258f3efcd01Safresh1    '(?u)[[:digit:]]' => 'POSIXU[\d]',
259f3efcd01Safresh1    '(?u)[[:^digit:]]' => 'NPOSIXU[\d]',
260f3efcd01Safresh1    '(?a)[[:digit:]]' => 'POSIXA[\d]',
261f3efcd01Safresh1    '(?a)[[:^digit:]]' => 'NPOSIXA[\d]',
262f3efcd01Safresh1    '(?a)[[:^digit:]\x{2C2}]' => 'NPOSIXA[\d]',
263f3efcd01Safresh1    '[[:digit:][:^digit:]]' => 'SANY',
264f3efcd01Safresh1    '[^[:digit:][:^digit:]]' => 'OPFAIL',
265f3efcd01Safresh1    '(?l)[[:digit:][:^digit:]]' => 'SANY',
266f3efcd01Safresh1    '(?l)[^[:digit:][:^digit:]]' => 'OPFAIL',
267f3efcd01Safresh1    '(?u)[[:digit:][:^digit:]]' => 'SANY',
268f3efcd01Safresh1    '(?u)[^[:digit:][:^digit:]]' => 'OPFAIL',
269f3efcd01Safresh1    '(?a)[[:digit:][:^digit:]]' => 'SANY',
270f3efcd01Safresh1    '(?a)[^[:digit:][:^digit:]]' => 'OPFAIL',
271f3efcd01Safresh1    '[[:graph:]]' => 'POSIXD[:graph:]',
272f3efcd01Safresh1    '[[:^graph:]]' => 'NPOSIXD[:graph:]',
273f3efcd01Safresh1    '[[:^graph:]\x{FFFF}]' => 'NPOSIXU[:graph:]',
274f3efcd01Safresh1    '(?l)[[:graph:]]' => 'POSIXL[:graph:]',
275f3efcd01Safresh1    '(?l)[[:^graph:]]' => 'NPOSIXL[:graph:]',
276f3efcd01Safresh1    '(?l)[[:^graph:]\x{FFFF}]' => 'NPOSIXL[:graph:]',
277f3efcd01Safresh1    '(?u)[[:graph:]]' => 'POSIXU[:graph:]',
278f3efcd01Safresh1    '(?u)[[:^graph:]]' => 'NPOSIXU[:graph:]',
279f3efcd01Safresh1    '(?a)[[:graph:]]' => 'POSIXA[:graph:]',
280f3efcd01Safresh1    '(?a)[[:^graph:]]' => 'NPOSIXA[:graph:]',
281f3efcd01Safresh1    '(?a)[[:^graph:]\x{FFFF}]' => 'NPOSIXA[:graph:]',
282f3efcd01Safresh1    '[[:graph:][:^graph:]]' => 'SANY',
283f3efcd01Safresh1    '[^[:graph:][:^graph:]]' => 'OPFAIL',
284f3efcd01Safresh1    '(?l)[[:graph:][:^graph:]]' => 'SANY',
285f3efcd01Safresh1    '(?l)[^[:graph:][:^graph:]]' => 'OPFAIL',
286f3efcd01Safresh1    '(?u)[[:graph:][:^graph:]]' => 'SANY',
287f3efcd01Safresh1    '(?u)[^[:graph:][:^graph:]]' => 'OPFAIL',
288f3efcd01Safresh1    '(?a)[[:graph:][:^graph:]]' => 'SANY',
289f3efcd01Safresh1    '(?a)[^[:graph:][:^graph:]]' => 'OPFAIL',
290f3efcd01Safresh1    '[[:lower:]]' => 'POSIXD[:lower:]',
291f3efcd01Safresh1    '[[:^lower:]]' => 'NPOSIXD[:lower:]',
292f3efcd01Safresh1    '[[:^lower:]\x{2C2}]' => 'NPOSIXU[:lower:]',
293f3efcd01Safresh1    '(?l)[[:lower:]]' => 'POSIXL[:lower:]',
294f3efcd01Safresh1    '(?l)[[:^lower:]]' => 'NPOSIXL[:lower:]',
295f3efcd01Safresh1    '(?l)[[:^lower:]\x{2C2}]' => 'NPOSIXL[:lower:]',
296f3efcd01Safresh1    '(?u)[[:lower:]]' => 'POSIXU[:lower:]',
297f3efcd01Safresh1    '(?u)[[:^lower:]]' => 'NPOSIXU[:lower:]',
298f3efcd01Safresh1    '(?a)[[:lower:]]' => 'POSIXA[:lower:]',
299f3efcd01Safresh1    '(?a)[[:^lower:]]' => 'NPOSIXA[:lower:]',
300f3efcd01Safresh1    '(?a)[[:^lower:]\x{2C2}]' => 'NPOSIXA[:lower:]',
301f3efcd01Safresh1    '[[:lower:][:^lower:]]' => 'SANY',
302f3efcd01Safresh1    '[^[:lower:][:^lower:]]' => 'OPFAIL',
303f3efcd01Safresh1    '(?l)[[:lower:][:^lower:]]' => 'SANY',
304f3efcd01Safresh1    '(?l)[^[:lower:][:^lower:]]' => 'OPFAIL',
305f3efcd01Safresh1    '(?u)[[:lower:][:^lower:]]' => 'SANY',
306f3efcd01Safresh1    '(?u)[^[:lower:][:^lower:]]' => 'OPFAIL',
307f3efcd01Safresh1    '(?a)[[:lower:][:^lower:]]' => 'SANY',
308f3efcd01Safresh1    '(?a)[^[:lower:][:^lower:]]' => 'OPFAIL',
309f3efcd01Safresh1    '[[:print:]]' => 'POSIXD[:print:]',
310f3efcd01Safresh1    '[[:^print:]]' => 'NPOSIXD[:print:]',
311f3efcd01Safresh1    '[[:^print:]\x{FFFF}]' => 'NPOSIXU[:print:]',
312f3efcd01Safresh1    '(?l)[[:print:]]' => 'POSIXL[:print:]',
313f3efcd01Safresh1    '(?l)[[:^print:]]' => 'NPOSIXL[:print:]',
314f3efcd01Safresh1    '(?l)[[:^print:]\x{FFFF}]' => 'NPOSIXL[:print:]',
315f3efcd01Safresh1    '(?u)[[:print:]]' => 'POSIXU[:print:]',
316f3efcd01Safresh1    '(?u)[[:^print:]]' => 'NPOSIXU[:print:]',
317f3efcd01Safresh1    '(?a)[[:print:]]' => 'POSIXA[:print:]',
318f3efcd01Safresh1    '(?a)[[:^print:]]' => 'NPOSIXA[:print:]',
319f3efcd01Safresh1    '(?a)[[:^print:]\x{FFFF}]' => 'NPOSIXA[:print:]',
320f3efcd01Safresh1    '[[:print:][:^print:]]' => 'SANY',
321f3efcd01Safresh1    '[^[:print:][:^print:]]' => 'OPFAIL',
322f3efcd01Safresh1    '(?l)[[:print:][:^print:]]' => 'SANY',
323f3efcd01Safresh1    '(?l)[^[:print:][:^print:]]' => 'OPFAIL',
324f3efcd01Safresh1    '(?u)[[:print:][:^print:]]' => 'SANY',
325f3efcd01Safresh1    '(?u)[^[:print:][:^print:]]' => 'OPFAIL',
326f3efcd01Safresh1    '(?a)[[:print:][:^print:]]' => 'SANY',
327f3efcd01Safresh1    '(?a)[^[:print:][:^print:]]' => 'OPFAIL',
328f3efcd01Safresh1    '[[:punct:]]' => 'POSIXD[:punct:]',
329f3efcd01Safresh1    '[[:^punct:]]' => 'NPOSIXD[:punct:]',
330f3efcd01Safresh1    '[[:^punct:]\x{2C2}]' => 'NPOSIXU[:punct:]',
331f3efcd01Safresh1    '(?l)[[:punct:]]' => 'POSIXL[:punct:]',
332f3efcd01Safresh1    '(?l)[[:^punct:]]' => 'NPOSIXL[:punct:]',
333f3efcd01Safresh1    '(?l)[[:^punct:]\x{2C2}]' => 'NPOSIXL[:punct:]',
334f3efcd01Safresh1    '(?u)[[:punct:]]' => 'POSIXU[:punct:]',
335f3efcd01Safresh1    '(?u)[[:^punct:]]' => 'NPOSIXU[:punct:]',
336f3efcd01Safresh1    '(?a)[[:punct:]]' => 'POSIXA[:punct:]',
337f3efcd01Safresh1    '(?a)[[:^punct:]]' => 'NPOSIXA[:punct:]',
338f3efcd01Safresh1    '(?a)[[:^punct:]\x{2C2}]' => 'NPOSIXA[:punct:]',
339f3efcd01Safresh1    '[[:punct:][:^punct:]]' => 'SANY',
340f3efcd01Safresh1    '[^[:punct:][:^punct:]]' => 'OPFAIL',
341f3efcd01Safresh1    '(?l)[[:punct:][:^punct:]]' => 'SANY',
342f3efcd01Safresh1    '(?l)[^[:punct:][:^punct:]]' => 'OPFAIL',
343f3efcd01Safresh1    '(?u)[[:punct:][:^punct:]]' => 'SANY',
344f3efcd01Safresh1    '(?u)[^[:punct:][:^punct:]]' => 'OPFAIL',
345f3efcd01Safresh1    '(?a)[[:punct:][:^punct:]]' => 'SANY',
346f3efcd01Safresh1    '(?a)[^[:punct:][:^punct:]]' => 'OPFAIL',
347f3efcd01Safresh1    '[[:space:]]' => 'POSIXD[\s]',
348f3efcd01Safresh1    '[[:^space:]]' => 'NPOSIXD[\s]',
349f3efcd01Safresh1    '[[:^space:]\x{2C2}]' => 'NPOSIXU[\s]',
350f3efcd01Safresh1    '(?l)[[:space:]]' => 'POSIXL[\s]',
351f3efcd01Safresh1    '(?l)[[:^space:]]' => 'NPOSIXL[\s]',
352f3efcd01Safresh1    '(?l)[[:^space:]\x{2C2}]' => 'NPOSIXL[\s]',
353f3efcd01Safresh1    '(?u)[[:space:]]' => 'POSIXU[\s]',
354f3efcd01Safresh1    '(?u)[[:^space:]]' => 'NPOSIXU[\s]',
355f3efcd01Safresh1    '(?a)[[:space:]]' => 'POSIXA[\s]',
356f3efcd01Safresh1    '(?a)[[:^space:]]' => 'NPOSIXA[\s]',
357f3efcd01Safresh1    '(?a)[[:^space:]\x{2C2}]' => 'NPOSIXA[\s]',
358f3efcd01Safresh1    '[[:space:][:^space:]]' => 'SANY',
359f3efcd01Safresh1    '[^[:space:][:^space:]]' => 'OPFAIL',
360f3efcd01Safresh1    '(?l)[[:space:][:^space:]]' => 'SANY',
361f3efcd01Safresh1    '(?l)[^[:space:][:^space:]]' => 'OPFAIL',
362f3efcd01Safresh1    '(?u)[[:space:][:^space:]]' => 'SANY',
363f3efcd01Safresh1    '(?u)[^[:space:][:^space:]]' => 'OPFAIL',
364f3efcd01Safresh1    '(?a)[[:space:][:^space:]]' => 'SANY',
365f3efcd01Safresh1    '(?a)[^[:space:][:^space:]]' => 'OPFAIL',
366f3efcd01Safresh1    '[[:upper:]]' => 'POSIXD[:upper:]',
367f3efcd01Safresh1    '[[:^upper:]]' => 'NPOSIXD[:upper:]',
368f3efcd01Safresh1    '[[:^upper:]\x{2C2}]' => 'NPOSIXU[:upper:]',
369f3efcd01Safresh1    '(?l)[[:upper:]]' => 'POSIXL[:upper:]',
370f3efcd01Safresh1    '(?l)[[:^upper:]]' => 'NPOSIXL[:upper:]',
371f3efcd01Safresh1    '(?l)[[:^upper:]\x{2C2}]' => 'NPOSIXL[:upper:]',
372f3efcd01Safresh1    '(?u)[[:upper:]]' => 'POSIXU[:upper:]',
373f3efcd01Safresh1    '(?u)[[:^upper:]]' => 'NPOSIXU[:upper:]',
374f3efcd01Safresh1    '(?a)[[:upper:]]' => 'POSIXA[:upper:]',
375f3efcd01Safresh1    '(?a)[[:^upper:]]' => 'NPOSIXA[:upper:]',
376f3efcd01Safresh1    '(?a)[[:^upper:]\x{2C2}]' => 'NPOSIXA[:upper:]',
377f3efcd01Safresh1    '[[:upper:][:^upper:]]' => 'SANY',
378f3efcd01Safresh1    '[^[:upper:][:^upper:]]' => 'OPFAIL',
379f3efcd01Safresh1    '(?l)[[:upper:][:^upper:]]' => 'SANY',
380f3efcd01Safresh1    '(?l)[^[:upper:][:^upper:]]' => 'OPFAIL',
381f3efcd01Safresh1    '(?u)[[:upper:][:^upper:]]' => 'SANY',
382f3efcd01Safresh1    '(?u)[^[:upper:][:^upper:]]' => 'OPFAIL',
383f3efcd01Safresh1    '(?a)[[:upper:][:^upper:]]' => 'SANY',
384f3efcd01Safresh1    '(?a)[^[:upper:][:^upper:]]' => 'OPFAIL',
385f3efcd01Safresh1    '[\v]' => 'POSIXU[\v]',
386f3efcd01Safresh1    '[^\v]' => 'NPOSIXU[\v]',
387f3efcd01Safresh1    '[\V\x{2C2}]' => 'NPOSIXU[\v]',
388f3efcd01Safresh1    '(?l)[\v]' => 'POSIXU[\v]',
389f3efcd01Safresh1    '(?l)[^\v]' => 'NPOSIXU[\v]',
390f3efcd01Safresh1    '(?l)[\V\x{2C2}]' => 'NPOSIXU[\v]',
391f3efcd01Safresh1    '(?u)[\v]' => 'POSIXU[\v]',
392f3efcd01Safresh1    '(?u)[^\v]' => 'NPOSIXU[\v]',
393f3efcd01Safresh1    '(?a)[\v]' => 'POSIXU[\v]',
394f3efcd01Safresh1    '(?a)[^\v]' => 'NPOSIXU[\v]',
395f3efcd01Safresh1    '(?a)[\V\x{2C2}]' => 'NPOSIXU[\v]',
396f3efcd01Safresh1    '[\v\V]' => 'SANY',
397f3efcd01Safresh1    '[^\v\V]' => 'OPFAIL',
398f3efcd01Safresh1    '(?l)[\v\V]' => 'SANY',
399f3efcd01Safresh1    '(?l)[^\v\V]' => 'OPFAIL',
400f3efcd01Safresh1    '(?u)[\v\V]' => 'SANY',
401f3efcd01Safresh1    '(?u)[^\v\V]' => 'OPFAIL',
402f3efcd01Safresh1    '(?a)[\v\V]' => 'SANY',
403f3efcd01Safresh1    '(?a)[^\v\V]' => 'OPFAIL',
404f3efcd01Safresh1    '[[:word:]]' => 'POSIXD[\w]',
405f3efcd01Safresh1    '[[:^word:]]' => 'NPOSIXD[\w]',
406f3efcd01Safresh1    '[[:^word:]\x{2C2}]' => 'NPOSIXU[\w]',
407f3efcd01Safresh1    '(?l)[[:word:]]' => 'POSIXL[\w]',
408f3efcd01Safresh1    '(?l)[[:^word:]]' => 'NPOSIXL[\w]',
409f3efcd01Safresh1    '(?l)[[:^word:]\x{2C2}]' => 'NPOSIXL[\w]',
410f3efcd01Safresh1    '(?u)[[:word:]]' => 'POSIXU[\w]',
411f3efcd01Safresh1    '(?u)[[:^word:]]' => 'NPOSIXU[\w]',
412f3efcd01Safresh1    '(?a)[[:word:]]' => 'POSIXA[\w]',
413f3efcd01Safresh1    '(?a)[[:^word:]]' => 'NPOSIXA[\w]',
414f3efcd01Safresh1    '(?a)[[:^word:]\x{2C2}]' => 'NPOSIXA[\w]',
415f3efcd01Safresh1    '[[:word:][:^word:]]' => 'SANY',
416f3efcd01Safresh1    '[^[:word:][:^word:]]' => 'OPFAIL',
417f3efcd01Safresh1    '(?l)[[:word:][:^word:]]' => 'SANY',
418f3efcd01Safresh1    '(?l)[^[:word:][:^word:]]' => 'OPFAIL',
419f3efcd01Safresh1    '(?u)[[:word:][:^word:]]' => 'SANY',
420f3efcd01Safresh1    '(?u)[^[:word:][:^word:]]' => 'OPFAIL',
421f3efcd01Safresh1    '(?a)[[:word:][:^word:]]' => 'SANY',
422f3efcd01Safresh1    '(?a)[^[:word:][:^word:]]' => 'OPFAIL',
423f3efcd01Safresh1    '[[:xdigit:]]' => 'POSIXU[:xdigit:]',
424f3efcd01Safresh1    '[[:^xdigit:]]' => 'NPOSIXU[:xdigit:]',
425f3efcd01Safresh1    '[[:^xdigit:]\x{2C2}]' => 'NPOSIXU[:xdigit:]',
426f3efcd01Safresh1    '(?l)[[:xdigit:]]' => 'POSIXL[:xdigit:]',
427f3efcd01Safresh1    '(?l)[[:^xdigit:]]' => 'NPOSIXL[:xdigit:]',
428f3efcd01Safresh1    '(?l)[[:^xdigit:]\x{2C2}]' => 'NPOSIXL[:xdigit:]',
429f3efcd01Safresh1    '(?u)[[:xdigit:]]' => 'POSIXU[:xdigit:]',
430f3efcd01Safresh1    '(?u)[[:^xdigit:]]' => 'NPOSIXU[:xdigit:]',
431f3efcd01Safresh1    '(?a)[[:xdigit:]]' => 'POSIXA[:xdigit:]',
432f3efcd01Safresh1    '(?a)[[:^xdigit:]]' => 'NPOSIXA[:xdigit:]',
433f3efcd01Safresh1    '(?a)[[:^xdigit:]\x{2C2}]' => 'NPOSIXA[:xdigit:]',
434f3efcd01Safresh1    '[[:xdigit:][:^xdigit:]]' => 'SANY',
435f3efcd01Safresh1    '[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
436f3efcd01Safresh1    '(?l)[[:xdigit:][:^xdigit:]]' => 'SANY',
437f3efcd01Safresh1    '(?l)[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
438f3efcd01Safresh1    '(?u)[[:xdigit:][:^xdigit:]]' => 'SANY',
439f3efcd01Safresh1    '(?u)[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
440f3efcd01Safresh1    '(?a)[[:xdigit:][:^xdigit:]]' => 'SANY',
441f3efcd01Safresh1    '(?a)[^[:xdigit:][:^xdigit:]]' => 'OPFAIL',
442f3efcd01Safresh1    '(?i)[[:lower:]]' => 'POSIXD[:cased:]',
443f3efcd01Safresh1    '(?i)[[:^lower:]]' => 'NPOSIXD[:cased:]',
444f3efcd01Safresh1    '(?i)[[:^lower:]\x{2C2}]' => 'NPOSIXU[:cased:]',
445f3efcd01Safresh1    '(?i)(?l)[[:lower:]]' => 'POSIXL[:cased:]',
446f3efcd01Safresh1    '(?i)(?l)[[:^lower:]]' => 'NPOSIXL[:cased:]',
447f3efcd01Safresh1    '(?i)(?l)[[:^lower:]\x{2C2}]' => 'NPOSIXL[:cased:]',
448f3efcd01Safresh1    '(?i)(?u)[[:lower:]]' => 'POSIXU[:cased:]',
449f3efcd01Safresh1    '(?i)(?u)[[:^lower:]]' => 'NPOSIXU[:cased:]',
450f3efcd01Safresh1    '(?i)(?a)[[:lower:]]' => 'POSIXA[:alpha:]',
451f3efcd01Safresh1    '(?i)(?a)[[:^lower:]]' => 'NPOSIXA[:alpha:]',
452f3efcd01Safresh1    '(?i)(?a)[[:^lower:]\x{2C2}]' => 'NPOSIXA[:alpha:]',
453f3efcd01Safresh1    '(?i)[[:upper:]]' => 'POSIXD[:cased:]',
454f3efcd01Safresh1    '(?i)[[:^upper:]]' => 'NPOSIXD[:cased:]',
455f3efcd01Safresh1    '(?i)[[:^upper:]\x{2C2}]' => 'NPOSIXU[:cased:]',
456f3efcd01Safresh1    '(?i)(?l)[[:upper:]]' => 'POSIXL[:cased:]',
457f3efcd01Safresh1    '(?i)(?l)[[:^upper:]]' => 'NPOSIXL[:cased:]',
458f3efcd01Safresh1    '(?i)(?l)[[:^upper:]\x{2C2}]' => 'NPOSIXL[:cased:]',
459f3efcd01Safresh1    '(?i)(?u)[[:upper:]]' => 'POSIXU[:cased:]',
460f3efcd01Safresh1    '(?i)(?u)[[:^upper:]]' => 'NPOSIXU[:cased:]',
461f3efcd01Safresh1    '(?i)(?a)[[:upper:]]' => 'POSIXA[:alpha:]',
462f3efcd01Safresh1    '(?i)(?a)[[:^upper:]]' => 'NPOSIXA[:alpha:]',
463f3efcd01Safresh1    '(?i)(?a)[[:^upper:]\x{2C2}]' => 'NPOSIXA[:alpha:]',
464f3efcd01Safresh1    '(?i)[\d\w]' => 'POSIXD[\w]',
465f3efcd01Safresh1    '(?i)[\D\w]' => 'SANY',
466f3efcd01Safresh1    #'(?i)(?l)[\d\w]' => varies depending on Unicode release
467f3efcd01Safresh1    '(?i)(?l)[\D\w]' => 'ANYOFPOSIXL{i}[\\w\\D][0100-INFTY]',
468f3efcd01Safresh1    '(?i)(?u)[\d\w]' => 'POSIXU[\w]',
469f3efcd01Safresh1    '(?i)(?u)[\D\w]' => 'SANY',
470f3efcd01Safresh1    '(?i)(?a)[\d\w]' => 'POSIXA[\w]',
471f3efcd01Safresh1    '(?i)(?a)[\D\w]' => 'SANY',
472de8cc8edSafresh1    '(?l:[\x{212A}])' => 'EXACTL <\x{212a}>',
473f3efcd01Safresh1    '(?l:[\s\x{212A}])' => 'ANYOFPOSIXL[\s][1680 2000-200A 2028-2029 202F 205F 212A 3000]',
474f3efcd01Safresh1    '(?l:[^\S\x{202F}])' => 'ANYOFPOSIXL[^\\S][1680 2000-200A 2028-2029 205F 3000]',
475de8cc8edSafresh1    '(?li:[a-z])' => (($::IS_ASCII)
476de8cc8edSafresh1                     ? 'ANYOFL{i}[a-z{utf8 locale}\x{017F}\x{212A}]'
477de8cc8edSafresh1                     : 'ANYOFL{i}[a-ij-rs-z{utf8 locale}\x{017F}\x{212A}]'),
478f3efcd01Safresh1    '\p{All}' => 'SANY',
479f3efcd01Safresh1    '\P{All}' => 'OPFAIL',
480f3efcd01Safresh1    '[\p{Any}]' => 'ANYOF[\x00-\xFF][0100-10FFFF]',
481f3efcd01Safresh1
482f3efcd01Safresh1    '[\p{IsMyRuntimeProperty}]' => 'ANYOF[+main::IsMyRuntimeProperty]',
483f3efcd01Safresh1    '[^\p{IsMyRuntimeProperty}]' => 'ANYOF[^{+main::IsMyRuntimeProperty}]',
484f3efcd01Safresh1    '[a\p{IsMyRuntimeProperty}]' => 'ANYOF[a][+main::IsMyRuntimeProperty]',
485f3efcd01Safresh1    '[^a\p{IsMyRuntimeProperty}]' => 'ANYOF[^a{+main::IsMyRuntimeProperty}]',
486f3efcd01Safresh1    '[^a\x{100}\p{IsMyRuntimeProperty}]' => 'ANYOF[^a{+main::IsMyRuntimeProperty}0100]',
487f3efcd01Safresh1    '[^\p{All}\p{IsMyRuntimeProperty}]' => 'OPFAIL',
488f3efcd01Safresh1    '[\p{All}\p{IsMyRuntimeProperty}]' => 'SANY',
489f3efcd01Safresh1
490de8cc8edSafresh1    '[\x{00}-{HIGHEST_CP}]' => 'ANYOF[\x00-\xFF][0100-HIGHEST_CP]',
491f3efcd01Safresh1    '[\x{00}-{INFTY}]' => 'SANY',
492f3efcd01Safresh1    '[\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
493de8cc8edSafresh1    '[\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-HIGHEST_CP]',
494f2a19305Safresh1    '[\x{102}\x{104}]' => 'ANYOFHbbm[0102 0104]',
495de8cc8edSafresh1    '[\x{102}-\x{104}{HIGHEST_CP}]' => 'ANYOFH[0102-0104 HIGHEST_CP]',
496de8cc8edSafresh1    '[\x{102}-\x{104}\x{101}]' => 'ANYOFRb[0101-0104]',
497f3efcd01Safresh1    '[\x{102}-\x{104}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
498de8cc8edSafresh1    '[\x{102}-\x{104}\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-HIGHEST_CP]',
499de8cc8edSafresh1    '[\x{102}-\x{104}\x{102}]' => 'ANYOFRb[0102-0104]',
500f3efcd01Safresh1    '[\x{102}-\x{104}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
501de8cc8edSafresh1    '[\x{102}-\x{104}\x{102}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
502de8cc8edSafresh1    '[\x{102}-\x{104}\x{103}]' => 'ANYOFRb[0102-0104]',
503f3efcd01Safresh1    '[\x{102}-\x{104}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
504de8cc8edSafresh1    '[\x{102}-\x{104}\x{103}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
505de8cc8edSafresh1    '[\x{102}-\x{104}\x{104}]' => 'ANYOFRb[0102-0104]',
506f3efcd01Safresh1    '[\x{102}-\x{104}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
507de8cc8edSafresh1    '[\x{102}-\x{104}\x{104}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
508de8cc8edSafresh1    '[\x{102}-\x{104}\x{105}]' => 'ANYOFRb[0102-0105]',
509f3efcd01Safresh1    '[\x{102}-\x{104}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
510de8cc8edSafresh1    '[\x{102}-\x{104}\x{105}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
511f2a19305Safresh1    '[\x{102}-\x{104}\x{106}]' => 'ANYOFHbbm[0102-0104 0106]',
512f3efcd01Safresh1    '[\x{102}-\x{104}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
513de8cc8edSafresh1    '[\x{102}-\x{104}\x{106}-{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0106-HIGHEST_CP]',
514de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0108-010A HIGHEST_CP]',
515f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
516f3efcd01Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
517de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-HIGHEST_CP]',
518f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
519f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
520f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
521f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOFHbbm[0101-0105 0108-010A]',
522f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOFHbbm[0101-0106 0108-010A]',
523de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{107}]' => 'ANYOFRb[0101-010A]',
524de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{108}]' => 'ANYOFRb[0101-010A]',
525de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{109}]' => 'ANYOFRb[0101-010A]',
526de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10A}]' => 'ANYOFRb[0101-010A]',
527de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10B}]' => 'ANYOFRb[0101-010B]',
528f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
529f3efcd01Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
530de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
531f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
532f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
533f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
534f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
535f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
536de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{107}]' => 'ANYOFRb[0102-010A]',
537de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{108}]' => 'ANYOFRb[0102-010A]',
538de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{109}]' => 'ANYOFRb[0102-010A]',
539de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10A}]' => 'ANYOFRb[0102-010A]',
540de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10B}]' => 'ANYOFRb[0102-010B]',
541de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10C}]' => 'ANYOFRb[0102-010C]',
542f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
543f3efcd01Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
544de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
545f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
546f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
547f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
548de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{107}]' => 'ANYOFRb[0102-010A]',
549de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{108}]' => 'ANYOFRb[0102-010A]',
550de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{109}]' => 'ANYOFRb[0102-010A]',
551de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10A}]' => 'ANYOFRb[0102-010A]',
552de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10B}]' => 'ANYOFRb[0102-010B]',
553de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10C}]' => 'ANYOFRb[0102-010C]',
554f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
555f3efcd01Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
556de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
557f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
558f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
559de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{107}]' => 'ANYOFRb[0102-010A]',
560de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{108}]' => 'ANYOFRb[0102-010A]',
561de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{109}]' => 'ANYOFRb[0102-010A]',
562de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10A}]' => 'ANYOFRb[0102-010A]',
563de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10B}]' => 'ANYOFRb[0102-010B]',
564de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10C}]' => 'ANYOFRb[0102-010C]',
565f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
566f3efcd01Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
567de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
568f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
569de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{107}]' => 'ANYOFRb[0102-010A]',
570de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{108}]' => 'ANYOFRb[0102-010A]',
571de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{109}]' => 'ANYOFRb[0102-010A]',
572de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10A}]' => 'ANYOFRb[0102-010A]',
573de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10B}]' => 'ANYOFRb[0102-010B]',
574de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10C}]' => 'ANYOFRb[0102-010C]',
575f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOFHbbm[0102-0104 0106 0108-010A]',
576f3efcd01Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
577de8cc8edSafresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0106-HIGHEST_CP]',
578f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
579f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
580f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
581f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
582f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOFHbbm[0102-0104 0106-010B]',
583f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOFHbbm[0102-0104 0106-010C]',
584f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOFHbbm[0102-0104 0107-010A]',
585f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
586f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
587f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
588f2a19305Safresh1    '[\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOFHbbm[0102-0104 0108-010B]',
589de8cc8edSafresh1    '[\x{103}\x{102}]' => 'EXACTFU_REQ8 <\x{103}>',
590f2a19305Safresh1    '[\x{104}\x{102}]' => 'ANYOFHbbm[0102 0104]',
591de8cc8edSafresh1    '[\x{104}\x{102}\x{103}]' => 'ANYOFRb[0102-0104]',
592f3efcd01Safresh1    '[\x{106}-{INFTY}\x{104}]' => 'ANYOFH[0104 0106-INFTY]',
593f3efcd01Safresh1    '[\x{106}-{INFTY}\x{104}-{INFTY}]' => 'ANYOFH[0104-INFTY]',
594de8cc8edSafresh1    '[\x{106}-{INFTY}\x{104}-{HIGHEST_CP}]' => 'ANYOFH[0104-INFTY]',
595f3efcd01Safresh1    '[\x{106}-{INFTY}\x{104}-\x{105}]' => 'ANYOFH[0104-INFTY]',
596f3efcd01Safresh1    '[\x{106}-{INFTY}\x{104}-\x{106}]' => 'ANYOFH[0104-INFTY]',
597f3efcd01Safresh1    '[\x{106}-{INFTY}\x{104}-\x{107}]' => 'ANYOFH[0104-INFTY]',
598f3efcd01Safresh1    '[\x{106}-{INFTY}\x{105}]' => 'ANYOFH[0105-INFTY]',
599f3efcd01Safresh1    '[\x{106}-{INFTY}\x{105}-{INFTY}]' => 'ANYOFH[0105-INFTY]',
600de8cc8edSafresh1    '[\x{106}-{INFTY}\x{105}-{HIGHEST_CP}]' => 'ANYOFH[0105-INFTY]',
601f3efcd01Safresh1    '[\x{106}-{INFTY}\x{105}-\x{106}]' => 'ANYOFH[0105-INFTY]',
602f3efcd01Safresh1    '[\x{106}-{INFTY}\x{105}-\x{107}]' => 'ANYOFH[0105-INFTY]',
603f3efcd01Safresh1    '[\x{106}-{INFTY}\x{106}]' => 'ANYOFH[0106-INFTY]',
604f3efcd01Safresh1    '[\x{106}-{INFTY}\x{106}-{INFTY}]' => 'ANYOFH[0106-INFTY]',
605de8cc8edSafresh1    '[\x{106}-{INFTY}\x{106}-{HIGHEST_CP}]' => 'ANYOFH[0106-INFTY]',
606f3efcd01Safresh1    '[\x{106}-{INFTY}\x{106}-\x{107}]' => 'ANYOFH[0106-INFTY]',
607f3efcd01Safresh1    '[\x{106}-{INFTY}\x{107}]' => 'ANYOFH[0106-INFTY]',
608f3efcd01Safresh1    '[\x{106}-{INFTY}\x{107}-{INFTY}]' => 'ANYOFH[0106-INFTY]',
609de8cc8edSafresh1    '[\x{106}-{INFTY}\x{107}-{HIGHEST_CP}]' => 'ANYOFH[0106-INFTY]',
610f3efcd01Safresh1    '[\x{106}-{INFTY}\x{107}-\x{107}]' => 'ANYOFH[0106-INFTY]',
611de8cc8edSafresh1    '[\x{10C}-{INFTY}{HIGHEST_CP}]' => 'ANYOFH[010C-INFTY]',
612de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{00}-{HIGHEST_CP}]' => 'SANY',
613f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{00}-{INFTY}]' => 'SANY',
614f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
615de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-INFTY]',
616f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}\x{104}]' => 'ANYOFH[0102 0104 010C-INFTY]',
617de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}{HIGHEST_CP}]' => 'ANYOFH[0102-0104 010C-INFTY]',
618f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{100}]' => 'ANYOFH[0100 0102-0104 010C-INFTY]',
619f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{101}]' => 'ANYOFH[0101-0104 010C-INFTY]',
620f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
621de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-INFTY]',
622f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{102}]' => 'ANYOFH[0102-0104 010C-INFTY]',
623f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
624de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{102}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
625f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{103}]' => 'ANYOFH[0102-0104 010C-INFTY]',
626f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
627de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{103}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
628f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{104}]' => 'ANYOFH[0102-0104 010C-INFTY]',
629f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
630de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{104}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
631f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{105}]' => 'ANYOFH[0102-0105 010C-INFTY]',
632f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
633de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{105}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
634f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{106}]' => 'ANYOFH[0102-0104 0106 010C-INFTY]',
635f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
636de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{106}-{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0106-INFTY]',
637de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
638f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
639f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
640de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-INFTY]',
641f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
642f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
643f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOFH[0101-0104 0108-010A 010C-INFTY]',
644f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOFH[0101-0105 0108-010A 010C-INFTY]',
645f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOFH[0101-0106 0108-010A 010C-INFTY]',
646f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{107}]' => 'ANYOFH[0101-010A 010C-INFTY]',
647f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{108}]' => 'ANYOFH[0101-010A 010C-INFTY]',
648f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{109}]' => 'ANYOFH[0101-010A 010C-INFTY]',
649f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10A}]' => 'ANYOFH[0101-010A 010C-INFTY]',
650f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10B}]' => 'ANYOFH[0101-INFTY]',
651f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
652f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
653de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
654f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
655f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
656f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
657f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
658f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
659f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
660f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
661f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
662f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
663f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
664f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
665f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
666f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
667de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
668f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
669f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
670f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
671f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
672f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
673f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
674f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
675f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
676f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
677f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
678f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
679de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
680f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
681f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
682f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
683f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
684f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
685f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
686f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
687f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
688f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOFH[0102-0105 0108-010A 010C-INFTY]',
689f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
690de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{HIGHEST_CP}]' => 'ANYOFH[0102-INFTY]',
691f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOFH[0102-0106 0108-010A 010C-INFTY]',
692f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{107}]' => 'ANYOFH[0102-010A 010C-INFTY]',
693f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{108}]' => 'ANYOFH[0102-010A 010C-INFTY]',
694f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{109}]' => 'ANYOFH[0102-010A 010C-INFTY]',
695f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10A}]' => 'ANYOFH[0102-010A 010C-INFTY]',
696f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10B}]' => 'ANYOFH[0102-INFTY]',
697f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10C}]' => 'ANYOFH[0102-INFTY]',
698f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOFH[0102-0104 0106 0108-010A 010C-INFTY]',
699f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
700de8cc8edSafresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0106-INFTY]',
701f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
702f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
703f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
704f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOFH[0102-0104 0106-010A 010C-INFTY]',
705f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOFH[0102-0104 0106-INFTY]',
706f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOFH[0102-0104 0106-INFTY]',
707f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOFH[0102-0104 0107-010A 010C-INFTY]',
708f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
709f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
710f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOFH[0102-0104 0108-010A 010C-INFTY]',
711f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOFH[0102-0104 0108-INFTY]',
712f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{103}\x{102}]' => 'ANYOFH[0102-0103 010C-INFTY]',
713f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{104}\x{102}]' => 'ANYOFH[0102 0104 010C-INFTY]',
714f3efcd01Safresh1    '[\x{10C}-{INFTY}\x{104}\x{102}\x{103}]' => 'ANYOFH[0102-0104 010C-INFTY]',
715de8cc8edSafresh1    '[{HIGHEST_CP}]' => 'EXACT_REQ8 <\x{HIGHEST_CP}>',
716f3efcd01Safresh1
717de8cc8edSafresh1    '(?8)(?i)[\x{410}]' => 'EXACTFU_REQ8 <\x{430}>',
718de8cc8edSafresh1    '(?8)(?i)[\x{399}]' => 'EXACTFU_REQ8 <\x{3b9}>',
719de8cc8edSafresh1    '(?8)(?i)[\x{345}\x{399}\x{3B9}\x{1FBE}]' => 'EXACTFU_REQ8 <\x{3b9}>',
720de8cc8edSafresh1    '(?i)[\x{2b9}]' => 'EXACT_REQ8 <\x{2b9}>',           # Doesn't participate in a fold
721de8cc8edSafresh1    '(?8)(?i)[\x{2b9}]' => 'EXACT_REQ8 <\x{2b9}>',
722de8cc8edSafresh1    '(?i)[\x{2bc}]' => 'EXACTFU_REQ8 <\x{2bc}>', # Part of a multi-char fold, ASCII component
723de8cc8edSafresh1    '(?i)[\x{390}]' => 'EXACTFU_REQ8 <\x{3b9}\x{308}\x{301}>', # Part of a multi-char fold, no ASCII component
724f3efcd01Safresh1
725f3efcd01Safresh1    '(?i)[\x{1E9E}]' => 'EXACTFU <ss>',
726f3efcd01Safresh1    '(?iaa)[\x{1E9E}]' => 'EXACTFAA <\x{17f}\x{17f}>',
727f3efcd01Safresh1    '(?i)[\x{FB00}]' => 'EXACTFU <ff>',
728de8cc8edSafresh1    '(?iaa)[\x{FB00}]' => 'EXACT_REQ8 <\x{fb00}>',
729f3efcd01Safresh1    '(?i)[\x{FB00}]' => 'EXACTFU <ff>',
730f3efcd01Safresh1    '(?i)[\x{FB01}]' => 'EXACTFU <fi>',
731f3efcd01Safresh1    '(?i)[\x{FB02}]' => 'EXACTFU <fl>',
732f3efcd01Safresh1    '(?i)[\x{FB03}]' => 'EXACTFU <ffi>',
733f3efcd01Safresh1    '(?i)[\x{FB04}]' => 'EXACTFU <ffl>',
734f3efcd01Safresh1    '(?i)[\x{FB05}]' => 'EXACTFU <st>',
735f3efcd01Safresh1    '(?i)[\x{FB06}]' => 'EXACTFU <st>',
736f3efcd01Safresh1
737f3efcd01Safresh1    '[a][b]' => 'EXACT <ab>',
738de8cc8edSafresh1    '[a]\x{100}' => 'EXACT_REQ8 <a\x{100}>',
739de8cc8edSafresh1    '(?8)[\x{100}]a' => 'EXACT_REQ8 <\x{100}a>',
740f3efcd01Safresh1    '(?i)[b][c]' => 'EXACTFU <bc>',
741de8cc8edSafresh1    '(?i)[b]\x{100}' => 'EXACTFU_REQ8 <b\x{101}>',
742de8cc8edSafresh1    '(?8)(?i)[\x{100}]b' => 'EXACTFU_REQ8 <\x{101}b>',
743f3efcd01Safresh1    '(?i)b[s]' => 'EXACTFU <bs>',
744f3efcd01Safresh1    '(?i)b[s]c' => 'EXACTFU <bsc>',
745f3efcd01Safresh1    '(?i)bs[s]c' => 'EXACTF <bss>',  # The c goes into a 2nd node
746f3efcd01Safresh1    '(?iu)bs[s]c' => 'EXACTFUP <bssc>',
747f3efcd01Safresh1    '(?i)b[s]sc' => 'EXACTF <bssc>',
748f3efcd01Safresh1    '(?iu)b[s]sc' => 'EXACTFUP <bssc>',
749f3efcd01Safresh1    '(?i)[b]st' => 'EXACTFU <bst>',
750f3efcd01Safresh1    '(?i)[b]st[s]' => 'EXACTFU <bsts>',
751f3efcd01Safresh1    '(?i)[b]st[s]st' => 'EXACTF <bstsst>',
752f3efcd01Safresh1    '(?iu)[b]st[s]st' => 'EXACTFUP <bstsst>',
753f3efcd01Safresh1    '(?i)[s][s]' => 'EXACTF <ss>',
754f3efcd01Safresh1    '(?iu)[s][s]' => 'EXACTFUP <ss>',
755f3efcd01Safresh1);
756f3efcd01Safresh1
757f3efcd01Safresh1my @single_chars_to_test =
758f3efcd01Safresh1(
759f3efcd01Safresh1    "\x00",     # Always potentially problematic
760f3efcd01Safresh1    "\x01",     # Unnamed control
761f3efcd01Safresh1    "\b",       # Named control
762f3efcd01Safresh1    "\n",       # Potentially special
763f3efcd01Safresh1    "\r",       # Potentially special
764f3efcd01Safresh1    "\cK",      # Potentially special
765f3efcd01Safresh1    "0",        # Digit
766f3efcd01Safresh1    ":",        # Not in any fold
767f3efcd01Safresh1    "A",        # ASCII capital, participates in multi-char fold
768f3efcd01Safresh1    "a",        # ASCII small, participates in multi-char fold
769f3efcd01Safresh1    "B",        # ASCII capital, participates only in case-pair fold
770f3efcd01Safresh1    "b",        # ASCII small, participates only in case-pair fold
771f3efcd01Safresh1    "K",        # ASCII capital, folded to from above Latin1
772f3efcd01Safresh1    "k",        # ASCII small, folded to from above Latin1
773f3efcd01Safresh1    "\c?",      # Potentially special
774f3efcd01Safresh1    "\x80",     # Latin1 control
775f3efcd01Safresh1    "\xB5",     # Micro sign, folds to above Latin1
776f3efcd01Safresh1    "\xC0",     # Latin1 capital, participates only in case-pair fold
777f3efcd01Safresh1    "\xE0",     # Latin1 small, participates only in case-pair fold
778f3efcd01Safresh1    "\xC5",     # Latin1 capital, folded to from above Latin1
779f3efcd01Safresh1    "\xE5",     # Latin1 small, folded to from above Latin1
780f3efcd01Safresh1    "\xDF",     # Small sharp S. folds to 'ss'
781f3efcd01Safresh1    "\xF7",     # Doesn't participate in any fold
782f3efcd01Safresh1    "\xFF",     # Folded to by above Latin1
783f3efcd01Safresh1    "\x{100}",  # First few above Latin1 characters
784f3efcd01Safresh1    "\x{101}",
785f3efcd01Safresh1    "\x{102}",
786f3efcd01Safresh1    "\x{103}",
787f3efcd01Safresh1    "\x{104}",
788f3efcd01Safresh1    "\x{105}",
789f3efcd01Safresh1    "\x{106}",
790f3efcd01Safresh1    "\x{107}",
791f3efcd01Safresh1    "\x{108}",
792de8cc8edSafresh1    "\x{2029}",
793f3efcd01Safresh1);
794f3efcd01Safresh1
795f3efcd01Safresh1my @single_tests;
796f3efcd01Safresh1for my $char (@single_chars_to_test) {
797f3efcd01Safresh1    my $cp = ord $char;
798f3efcd01Safresh1    my $hex = sprintf "%02x", $cp;
799f3efcd01Safresh1    my $oct = sprintf "%o", $cp;
800f3efcd01Safresh1    my $cp_string;
801f3efcd01Safresh1
802f3efcd01Safresh1    my $cased;
803f3efcd01Safresh1    my $folded_hex;
804f3efcd01Safresh1
805f3efcd01Safresh1    {
806f3efcd01Safresh1        use feature 'unicode_strings';
807f3efcd01Safresh1        $cased = uc $char ne $char || lc $char ne $char;
808f3efcd01Safresh1        $folded_hex = ($cased)
809f3efcd01Safresh1                      ? sprintf("%02x", ord lc $char)
810f3efcd01Safresh1                      : $hex;
811f3efcd01Safresh1        #print STDERR "$hex, $folded_hex\n";
812f3efcd01Safresh1    }
813f3efcd01Safresh1
814f3efcd01Safresh1    for my $fold ("", "i") {
815f3efcd01Safresh1        #next unless $fold;
816f3efcd01Safresh1        for my $charset ("", "u", "l", "aa") {
817f3efcd01Safresh1            #next if $charset eq "aa" && ! $fold;
818f3efcd01Safresh1
819f3efcd01Safresh1            my $modifiers = $fold . $charset;
820f3efcd01Safresh1            $modifiers = "(?$modifiers)" if $modifiers;
821f3efcd01Safresh1
822f3efcd01Safresh1            for my $upgrade ("", "(?8)") {
823f3efcd01Safresh1                push @single_tests, "$upgrade$modifiers\[\\x{$hex}\]";
824f3efcd01Safresh1                if ($cp < 256 || $upgrade) {
825f3efcd01Safresh1                    push @single_tests, get_compiled("$upgrade$modifiers\\x{$hex}");
826f3efcd01Safresh1                }
827f3efcd01Safresh1                else {
828de8cc8edSafresh1                    use feature 'fc';
829de8cc8edSafresh1
830de8cc8edSafresh1                    my %list = ( sprintf("%X", $cp) => 1 );
831f3efcd01Safresh1                    if ($fold) {
832de8cc8edSafresh1                        for my $op (qw(fc lc uc)) {
833de8cc8edSafresh1                            my $result = eval "$op(\"$char\")";
834de8cc8edSafresh1                            $list{sprintf "%X", ord $result} = 1;
835f3efcd01Safresh1                        }
836f3efcd01Safresh1                    }
837de8cc8edSafresh1
838de8cc8edSafresh1                    my $mod_cp = $cp;
839de8cc8edSafresh1                    my $op;
840de8cc8edSafresh1
841de8cc8edSafresh1                    if (! $fold || scalar keys %list == 1) {
842de8cc8edSafresh1                        $op = ($charset eq 'l')
843de8cc8edSafresh1                                ? 'EXACTL'
844de8cc8edSafresh1                                : ($cp < 256)
845de8cc8edSafresh1                                ? 'EXACT'
846de8cc8edSafresh1                                : 'EXACT_REQ8';
847f3efcd01Safresh1                    }
848f3efcd01Safresh1                    else {
849de8cc8edSafresh1                        $op = ($charset eq 'aa')
850de8cc8edSafresh1                        ? 'EXACTFAA'
851de8cc8edSafresh1                        : ($charset eq 'l')
852de8cc8edSafresh1                            ? (($cp < 256)
853de8cc8edSafresh1                            ? 'EXACTFL'
854de8cc8edSafresh1                            : 'EXACTFLU8')
855de8cc8edSafresh1                            : ($cp < 256)
856de8cc8edSafresh1                            ? 'EXACTFU'
857de8cc8edSafresh1                            : 'EXACTFU_REQ8';
858de8cc8edSafresh1                        $mod_cp = ord fc $char;
859f3efcd01Safresh1                    }
860de8cc8edSafresh1
861de8cc8edSafresh1                    push @single_tests, sprintf "$op <\\x{%X}>", $mod_cp;
862f3efcd01Safresh1                }
863f3efcd01Safresh1            }
864f3efcd01Safresh1        }
865f3efcd01Safresh1    }
866f3efcd01Safresh1}
867f3efcd01Safresh1
868f3efcd01Safresh1unshift @tests, @single_tests;
869f3efcd01Safresh1
8705759b3d2Safresh1plan(scalar (@tests - 1) / 2);  # -1 because of the marker.
8715759b3d2Safresh1
8725759b3d2Safresh1my $skip_ebcdic = $::IS_EBCDIC;
8735759b3d2Safresh1while (defined (my $test = shift @tests)) {
8745759b3d2Safresh1
8755759b3d2Safresh1    if ($test eq 'ebcdic_ok_below_this_marker') {
8765759b3d2Safresh1        $skip_ebcdic = 0;
8775759b3d2Safresh1        next;
8785759b3d2Safresh1    }
8795759b3d2Safresh1
8805759b3d2Safresh1    my $expected = shift @tests;
8815759b3d2Safresh1
8825759b3d2Safresh1    SKIP: {
8835759b3d2Safresh1        skip("test not ported to EBCDIC", 1) if $skip_ebcdic;
8845759b3d2Safresh1
8855759b3d2Safresh1        my $display_expected = $expected
886de8cc8edSafresh1                                        =~ s/ HIGHEST_CP /$highest_cp_string/xgr;
887f3efcd01Safresh1        my $test_name = "Verify compilation of $test displays as"
888de8cc8edSafresh1                      . " $expected";
8895759b3d2Safresh1
890f3efcd01Safresh1        my $result = get_compiled($test);
891de8cc8edSafresh1        if ($expected =~ / ^ ANYOF[HR] /x) {
892f3efcd01Safresh1            like($result, qr/ ^ \Q$expected\E (?:\Q (First UTF-8 byte=\x\E
893de8cc8edSafresh1                              [[:xdigit:]]{2} )? /x, $test_name);
8945759b3d2Safresh1        }
895f3efcd01Safresh1        else {
896de8cc8edSafresh1            is($result, $expected, $test_name);
8975759b3d2Safresh1        }
8985759b3d2Safresh1    }
8995759b3d2Safresh1}
900