File Coverage

blib/lib/Eoldutf8.pm
Criterion Covered Total %
statement 1045 3228 32.3
branch 1093 2770 39.4
condition 122 355 34.3
subroutine 55 110 50.0
pod 7 74 9.4
total 2322 6537 35.5


line stmt bran cond sub pod time code
1             package Eoldutf8;
2 306     306   1774 use strict;
  306         518  
  306         48592  
3             ######################################################################
4             #
5             # Eoldutf8 - Run-time routines for OldUTF8.pm
6             #
7             # http://search.cpan.org/dist/Char-OldUTF8/
8             #
9             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2019 INABA Hitoshi
10             ######################################################################
11              
12 306     306   4222 use 5.00503; # Galapagos Consensus 1998 for primetools
  306         910  
13             # use 5.008001; # Lancaster Consensus 2013 for toolchains
14              
15             # 12.3. Delaying use Until Runtime
16             # in Chapter 12. Packages, Libraries, and Modules
17             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
18             # (and so on)
19              
20             # Version numbers should be boring
21             # http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/
22             # For the impatient, the disinterested or those who just want to follow
23             # a recipe, my advice for all modules is this:
24             # our $VERSION = "0.001"; # or "0.001_001" for a dev release
25             # $VERSION = eval $VERSION; # No!! because '1.10' makes '1.1'
26              
27 306     306   1683 use vars qw($VERSION);
  306         833  
  306         60798  
28             $VERSION = '1.13';
29             $VERSION = $VERSION;
30              
31             BEGIN {
32 306 50   306   2363 if ($^X =~ / jperl /oxmsi) {
33 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
34             }
35 306         506 if (CORE::ord('A') == 193) {
36             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
37             }
38 306         43681 if (CORE::ord('A') != 0x41) {
39             die __FILE__, ": is not US-ASCII script (must be US-ASCII script).\n";
40             }
41             }
42              
43             BEGIN {
44              
45             # instead of utf8.pm
46 306     306   20930 CORE::eval q{
  306     306   1924  
  306     108   557  
  306         45536  
  0         0  
  0         0  
  0         0  
  0         0  
47             no warnings qw(redefine);
48             *utf8::upgrade = sub { CORE::length $_[0] };
49             *utf8::downgrade = sub { 1 };
50             *utf8::encode = sub { };
51             *utf8::decode = sub { 1 };
52             *utf8::is_utf8 = sub { };
53             *utf8::valid = sub { 1 };
54             };
55 306 50       124887 if ($@) {
56 0         0 *utf8::upgrade = sub { CORE::length $_[0] };
  0         0  
57 0         0 *utf8::downgrade = sub { 1 };
  0         0  
58 0         0 *utf8::encode = sub { };
59 0         0 *utf8::decode = sub { 1 };
  0         0  
60 0         0 *utf8::is_utf8 = sub { };
61 0         0 *utf8::valid = sub { 1 };
  0         0  
62             }
63             }
64              
65             # instead of Symbol.pm
66 0         0 BEGIN {
67             sub gensym () {
68 0     0 0 0 return \do { local *_ };
  0         0  
69             }
70              
71             sub qualify ($$) {
72 0     0 0 0 my($name) = @_;
73              
74 0 0       0 if (ref $name) {
    0          
    0          
    0          
    0          
    0          
    0          
75 0         0 return $name;
76             }
77             elsif (Eoldutf8::index($name,'::') >= 0) {
78 0         0 return $name;
79             }
80             elsif (Eoldutf8::index($name,"'") >= 0) {
81 0         0 return $name;
82             }
83              
84             # special character, "^xyz"
85             elsif ($name =~ /\A \^ [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]+ \z/x) {
86              
87             # RGS 2001-11-05 : translate leading ^X to control-char
88 0         0 $name =~ s{\A \^ ([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]) }{'qq(\c'.$1.')'}xee;
  0         0  
89 0         0 return 'main::' . $name;
90             }
91              
92             # Global names
93             elsif ($name =~ /\A (?: ARGV | ARGVOUT | ENV | INC | SIG | STDERR | STDIN | STDOUT ) \z/x) {
94 0         0 return 'main::' . $name;
95             }
96              
97             # or other
98             elsif ($name =~ /\A [^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] \z/x) {
99 0         0 return 'main::' . $name;
100             }
101              
102             elsif (defined $_[1]) {
103 0         0 return $_[1] . '::' . $name;
104             }
105             else {
106 0         0 return (caller)[0] . '::' . $name;
107             }
108             }
109              
110             sub qualify_to_ref ($;$) {
111 0 0   0 0 0 if (defined $_[1]) {
112 306     306   2121 no strict qw(refs);
  306         623  
  306         22734  
113 0         0 return \*{ qualify $_[0], $_[1] };
  0         0  
114             }
115             else {
116 306     306   1805 no strict qw(refs);
  306     0   592  
  306         57922  
117 0         0 return \*{ qualify $_[0], (caller)[0] };
  0         0  
118             }
119             }
120             }
121              
122             # P.714 29.2.39. flock
123             # in Chapter 29: Functions
124             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
125              
126             # P.863 flock
127             # in Chapter 27: Functions
128             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
129              
130             sub LOCK_SH() {1}
131             sub LOCK_EX() {2}
132             sub LOCK_UN() {8}
133             sub LOCK_NB() {4}
134              
135             # instead of Carp.pm
136             sub carp;
137             sub croak;
138             sub cluck;
139             sub confess;
140              
141             # 6.18. Matching Multiple-Byte Characters
142             # in Chapter 6. Pattern Matching
143             # of ISBN 978-1-56592-243-3 Perl Perl Cookbook.
144             # (and so on)
145              
146             # regexp of character
147             my $your_char = q{(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF]|[\x00-\x7F\xF5-\xFF]};
148 306     306   2259 use vars qw($qq_char); $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  306         604  
  306         21431  
149 306     306   2733 use vars qw($q_char); $q_char = qr/$your_char/oxms;
  306         662  
  306         3763798  
150              
151             #
152             # old UTF-8 character range per length
153             #
154             my %range_tr = ();
155              
156             #
157             # old UTF-8 case conversion
158             #
159             my %lc = ();
160             @lc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
161             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
162             my %uc = ();
163             @uc{qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)} =
164             qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
165             my %fc = ();
166             @fc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
167             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
168              
169             if (0) {
170             }
171              
172             elsif (__PACKAGE__ =~ / \b Eoldutf8 \z/oxms) {
173             %range_tr = (
174             1 => [ [0x00..0x7F],
175             [0xF5..0xFF], # malformed octet
176             ],
177             2 => [ [0xC0..0xDF],[0x80..0xBF],
178             ],
179             3 => [ [0xE0..0xEF],[0x80..0xBF],[0x80..0xBF],
180             ],
181             4 => [ [0xF0..0xF4],[0x80..0xBF],[0x80..0xBF],[0x80..0xBF],
182             ],
183             );
184              
185             # CaseFolding-12.0.0.txt
186             # Date: 2019-01-22, 08:18:22 GMT
187             # c 2019 UnicodeR, Inc.
188             # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
189             # For terms of use, see http://www.unicode.org/terms_of_use.html
190             #
191             # Unicode Character Database
192             # For documentation, see http://www.unicode.org/reports/tr44/
193              
194             # you can use "make_CaseFolding.pl" to update this hash
195              
196             %fc = (
197             "\x41" => "\x61", # LATIN CAPITAL LETTER A
198             "\x42" => "\x62", # LATIN CAPITAL LETTER B
199             "\x43" => "\x63", # LATIN CAPITAL LETTER C
200             "\x44" => "\x64", # LATIN CAPITAL LETTER D
201             "\x45" => "\x65", # LATIN CAPITAL LETTER E
202             "\x46" => "\x66", # LATIN CAPITAL LETTER F
203             "\x47" => "\x67", # LATIN CAPITAL LETTER G
204             "\x48" => "\x68", # LATIN CAPITAL LETTER H
205             "\x49" => "\x69", # LATIN CAPITAL LETTER I
206             "\x4A" => "\x6A", # LATIN CAPITAL LETTER J
207             "\x4B" => "\x6B", # LATIN CAPITAL LETTER K
208             "\x4C" => "\x6C", # LATIN CAPITAL LETTER L
209             "\x4D" => "\x6D", # LATIN CAPITAL LETTER M
210             "\x4E" => "\x6E", # LATIN CAPITAL LETTER N
211             "\x4F" => "\x6F", # LATIN CAPITAL LETTER O
212             "\x50" => "\x70", # LATIN CAPITAL LETTER P
213             "\x51" => "\x71", # LATIN CAPITAL LETTER Q
214             "\x52" => "\x72", # LATIN CAPITAL LETTER R
215             "\x53" => "\x73", # LATIN CAPITAL LETTER S
216             "\x54" => "\x74", # LATIN CAPITAL LETTER T
217             "\x55" => "\x75", # LATIN CAPITAL LETTER U
218             "\x56" => "\x76", # LATIN CAPITAL LETTER V
219             "\x57" => "\x77", # LATIN CAPITAL LETTER W
220             "\x58" => "\x78", # LATIN CAPITAL LETTER X
221             "\x59" => "\x79", # LATIN CAPITAL LETTER Y
222             "\x5A" => "\x7A", # LATIN CAPITAL LETTER Z
223             "\xC2\xB5" => "\xCE\xBC", # MICRO SIGN
224             "\xC3\x80" => "\xC3\xA0", # LATIN CAPITAL LETTER A WITH GRAVE
225             "\xC3\x81" => "\xC3\xA1", # LATIN CAPITAL LETTER A WITH ACUTE
226             "\xC3\x82" => "\xC3\xA2", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
227             "\xC3\x83" => "\xC3\xA3", # LATIN CAPITAL LETTER A WITH TILDE
228             "\xC3\x84" => "\xC3\xA4", # LATIN CAPITAL LETTER A WITH DIAERESIS
229             "\xC3\x85" => "\xC3\xA5", # LATIN CAPITAL LETTER A WITH RING ABOVE
230             "\xC3\x86" => "\xC3\xA6", # LATIN CAPITAL LETTER AE
231             "\xC3\x87" => "\xC3\xA7", # LATIN CAPITAL LETTER C WITH CEDILLA
232             "\xC3\x88" => "\xC3\xA8", # LATIN CAPITAL LETTER E WITH GRAVE
233             "\xC3\x89" => "\xC3\xA9", # LATIN CAPITAL LETTER E WITH ACUTE
234             "\xC3\x8A" => "\xC3\xAA", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
235             "\xC3\x8B" => "\xC3\xAB", # LATIN CAPITAL LETTER E WITH DIAERESIS
236             "\xC3\x8C" => "\xC3\xAC", # LATIN CAPITAL LETTER I WITH GRAVE
237             "\xC3\x8D" => "\xC3\xAD", # LATIN CAPITAL LETTER I WITH ACUTE
238             "\xC3\x8E" => "\xC3\xAE", # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
239             "\xC3\x8F" => "\xC3\xAF", # LATIN CAPITAL LETTER I WITH DIAERESIS
240             "\xC3\x90" => "\xC3\xB0", # LATIN CAPITAL LETTER ETH
241             "\xC3\x91" => "\xC3\xB1", # LATIN CAPITAL LETTER N WITH TILDE
242             "\xC3\x92" => "\xC3\xB2", # LATIN CAPITAL LETTER O WITH GRAVE
243             "\xC3\x93" => "\xC3\xB3", # LATIN CAPITAL LETTER O WITH ACUTE
244             "\xC3\x94" => "\xC3\xB4", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
245             "\xC3\x95" => "\xC3\xB5", # LATIN CAPITAL LETTER O WITH TILDE
246             "\xC3\x96" => "\xC3\xB6", # LATIN CAPITAL LETTER O WITH DIAERESIS
247             "\xC3\x98" => "\xC3\xB8", # LATIN CAPITAL LETTER O WITH STROKE
248             "\xC3\x99" => "\xC3\xB9", # LATIN CAPITAL LETTER U WITH GRAVE
249             "\xC3\x9A" => "\xC3\xBA", # LATIN CAPITAL LETTER U WITH ACUTE
250             "\xC3\x9B" => "\xC3\xBB", # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
251             "\xC3\x9C" => "\xC3\xBC", # LATIN CAPITAL LETTER U WITH DIAERESIS
252             "\xC3\x9D" => "\xC3\xBD", # LATIN CAPITAL LETTER Y WITH ACUTE
253             "\xC3\x9E" => "\xC3\xBE", # LATIN CAPITAL LETTER THORN
254             "\xC3\x9F" => "\x73\x73", # LATIN SMALL LETTER SHARP S
255             "\xC4\x80" => "\xC4\x81", # LATIN CAPITAL LETTER A WITH MACRON
256             "\xC4\x82" => "\xC4\x83", # LATIN CAPITAL LETTER A WITH BREVE
257             "\xC4\x84" => "\xC4\x85", # LATIN CAPITAL LETTER A WITH OGONEK
258             "\xC4\x86" => "\xC4\x87", # LATIN CAPITAL LETTER C WITH ACUTE
259             "\xC4\x88" => "\xC4\x89", # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
260             "\xC4\x8A" => "\xC4\x8B", # LATIN CAPITAL LETTER C WITH DOT ABOVE
261             "\xC4\x8C" => "\xC4\x8D", # LATIN CAPITAL LETTER C WITH CARON
262             "\xC4\x8E" => "\xC4\x8F", # LATIN CAPITAL LETTER D WITH CARON
263             "\xC4\x90" => "\xC4\x91", # LATIN CAPITAL LETTER D WITH STROKE
264             "\xC4\x92" => "\xC4\x93", # LATIN CAPITAL LETTER E WITH MACRON
265             "\xC4\x94" => "\xC4\x95", # LATIN CAPITAL LETTER E WITH BREVE
266             "\xC4\x96" => "\xC4\x97", # LATIN CAPITAL LETTER E WITH DOT ABOVE
267             "\xC4\x98" => "\xC4\x99", # LATIN CAPITAL LETTER E WITH OGONEK
268             "\xC4\x9A" => "\xC4\x9B", # LATIN CAPITAL LETTER E WITH CARON
269             "\xC4\x9C" => "\xC4\x9D", # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
270             "\xC4\x9E" => "\xC4\x9F", # LATIN CAPITAL LETTER G WITH BREVE
271             "\xC4\xA0" => "\xC4\xA1", # LATIN CAPITAL LETTER G WITH DOT ABOVE
272             "\xC4\xA2" => "\xC4\xA3", # LATIN CAPITAL LETTER G WITH CEDILLA
273             "\xC4\xA4" => "\xC4\xA5", # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
274             "\xC4\xA6" => "\xC4\xA7", # LATIN CAPITAL LETTER H WITH STROKE
275             "\xC4\xA8" => "\xC4\xA9", # LATIN CAPITAL LETTER I WITH TILDE
276             "\xC4\xAA" => "\xC4\xAB", # LATIN CAPITAL LETTER I WITH MACRON
277             "\xC4\xAC" => "\xC4\xAD", # LATIN CAPITAL LETTER I WITH BREVE
278             "\xC4\xAE" => "\xC4\xAF", # LATIN CAPITAL LETTER I WITH OGONEK
279             "\xC4\xB0" => "\x69\xCC\x87", # LATIN CAPITAL LETTER I WITH DOT ABOVE
280             "\xC4\xB2" => "\xC4\xB3", # LATIN CAPITAL LIGATURE IJ
281             "\xC4\xB4" => "\xC4\xB5", # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
282             "\xC4\xB6" => "\xC4\xB7", # LATIN CAPITAL LETTER K WITH CEDILLA
283             "\xC4\xB9" => "\xC4\xBA", # LATIN CAPITAL LETTER L WITH ACUTE
284             "\xC4\xBB" => "\xC4\xBC", # LATIN CAPITAL LETTER L WITH CEDILLA
285             "\xC4\xBD" => "\xC4\xBE", # LATIN CAPITAL LETTER L WITH CARON
286             "\xC4\xBF" => "\xC5\x80", # LATIN CAPITAL LETTER L WITH MIDDLE DOT
287             "\xC5\x81" => "\xC5\x82", # LATIN CAPITAL LETTER L WITH STROKE
288             "\xC5\x83" => "\xC5\x84", # LATIN CAPITAL LETTER N WITH ACUTE
289             "\xC5\x85" => "\xC5\x86", # LATIN CAPITAL LETTER N WITH CEDILLA
290             "\xC5\x87" => "\xC5\x88", # LATIN CAPITAL LETTER N WITH CARON
291             "\xC5\x89" => "\xCA\xBC\x6E", # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
292             "\xC5\x8A" => "\xC5\x8B", # LATIN CAPITAL LETTER ENG
293             "\xC5\x8C" => "\xC5\x8D", # LATIN CAPITAL LETTER O WITH MACRON
294             "\xC5\x8E" => "\xC5\x8F", # LATIN CAPITAL LETTER O WITH BREVE
295             "\xC5\x90" => "\xC5\x91", # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
296             "\xC5\x92" => "\xC5\x93", # LATIN CAPITAL LIGATURE OE
297             "\xC5\x94" => "\xC5\x95", # LATIN CAPITAL LETTER R WITH ACUTE
298             "\xC5\x96" => "\xC5\x97", # LATIN CAPITAL LETTER R WITH CEDILLA
299             "\xC5\x98" => "\xC5\x99", # LATIN CAPITAL LETTER R WITH CARON
300             "\xC5\x9A" => "\xC5\x9B", # LATIN CAPITAL LETTER S WITH ACUTE
301             "\xC5\x9C" => "\xC5\x9D", # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
302             "\xC5\x9E" => "\xC5\x9F", # LATIN CAPITAL LETTER S WITH CEDILLA
303             "\xC5\xA0" => "\xC5\xA1", # LATIN CAPITAL LETTER S WITH CARON
304             "\xC5\xA2" => "\xC5\xA3", # LATIN CAPITAL LETTER T WITH CEDILLA
305             "\xC5\xA4" => "\xC5\xA5", # LATIN CAPITAL LETTER T WITH CARON
306             "\xC5\xA6" => "\xC5\xA7", # LATIN CAPITAL LETTER T WITH STROKE
307             "\xC5\xA8" => "\xC5\xA9", # LATIN CAPITAL LETTER U WITH TILDE
308             "\xC5\xAA" => "\xC5\xAB", # LATIN CAPITAL LETTER U WITH MACRON
309             "\xC5\xAC" => "\xC5\xAD", # LATIN CAPITAL LETTER U WITH BREVE
310             "\xC5\xAE" => "\xC5\xAF", # LATIN CAPITAL LETTER U WITH RING ABOVE
311             "\xC5\xB0" => "\xC5\xB1", # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
312             "\xC5\xB2" => "\xC5\xB3", # LATIN CAPITAL LETTER U WITH OGONEK
313             "\xC5\xB4" => "\xC5\xB5", # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
314             "\xC5\xB6" => "\xC5\xB7", # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
315             "\xC5\xB8" => "\xC3\xBF", # LATIN CAPITAL LETTER Y WITH DIAERESIS
316             "\xC5\xB9" => "\xC5\xBA", # LATIN CAPITAL LETTER Z WITH ACUTE
317             "\xC5\xBB" => "\xC5\xBC", # LATIN CAPITAL LETTER Z WITH DOT ABOVE
318             "\xC5\xBD" => "\xC5\xBE", # LATIN CAPITAL LETTER Z WITH CARON
319             "\xC5\xBF" => "\x73", # LATIN SMALL LETTER LONG S
320             "\xC6\x81" => "\xC9\x93", # LATIN CAPITAL LETTER B WITH HOOK
321             "\xC6\x82" => "\xC6\x83", # LATIN CAPITAL LETTER B WITH TOPBAR
322             "\xC6\x84" => "\xC6\x85", # LATIN CAPITAL LETTER TONE SIX
323             "\xC6\x86" => "\xC9\x94", # LATIN CAPITAL LETTER OPEN O
324             "\xC6\x87" => "\xC6\x88", # LATIN CAPITAL LETTER C WITH HOOK
325             "\xC6\x89" => "\xC9\x96", # LATIN CAPITAL LETTER AFRICAN D
326             "\xC6\x8A" => "\xC9\x97", # LATIN CAPITAL LETTER D WITH HOOK
327             "\xC6\x8B" => "\xC6\x8C", # LATIN CAPITAL LETTER D WITH TOPBAR
328             "\xC6\x8E" => "\xC7\x9D", # LATIN CAPITAL LETTER REVERSED E
329             "\xC6\x8F" => "\xC9\x99", # LATIN CAPITAL LETTER SCHWA
330             "\xC6\x90" => "\xC9\x9B", # LATIN CAPITAL LETTER OPEN E
331             "\xC6\x91" => "\xC6\x92", # LATIN CAPITAL LETTER F WITH HOOK
332             "\xC6\x93" => "\xC9\xA0", # LATIN CAPITAL LETTER G WITH HOOK
333             "\xC6\x94" => "\xC9\xA3", # LATIN CAPITAL LETTER GAMMA
334             "\xC6\x96" => "\xC9\xA9", # LATIN CAPITAL LETTER IOTA
335             "\xC6\x97" => "\xC9\xA8", # LATIN CAPITAL LETTER I WITH STROKE
336             "\xC6\x98" => "\xC6\x99", # LATIN CAPITAL LETTER K WITH HOOK
337             "\xC6\x9C" => "\xC9\xAF", # LATIN CAPITAL LETTER TURNED M
338             "\xC6\x9D" => "\xC9\xB2", # LATIN CAPITAL LETTER N WITH LEFT HOOK
339             "\xC6\x9F" => "\xC9\xB5", # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
340             "\xC6\xA0" => "\xC6\xA1", # LATIN CAPITAL LETTER O WITH HORN
341             "\xC6\xA2" => "\xC6\xA3", # LATIN CAPITAL LETTER OI
342             "\xC6\xA4" => "\xC6\xA5", # LATIN CAPITAL LETTER P WITH HOOK
343             "\xC6\xA6" => "\xCA\x80", # LATIN LETTER YR
344             "\xC6\xA7" => "\xC6\xA8", # LATIN CAPITAL LETTER TONE TWO
345             "\xC6\xA9" => "\xCA\x83", # LATIN CAPITAL LETTER ESH
346             "\xC6\xAC" => "\xC6\xAD", # LATIN CAPITAL LETTER T WITH HOOK
347             "\xC6\xAE" => "\xCA\x88", # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
348             "\xC6\xAF" => "\xC6\xB0", # LATIN CAPITAL LETTER U WITH HORN
349             "\xC6\xB1" => "\xCA\x8A", # LATIN CAPITAL LETTER UPSILON
350             "\xC6\xB2" => "\xCA\x8B", # LATIN CAPITAL LETTER V WITH HOOK
351             "\xC6\xB3" => "\xC6\xB4", # LATIN CAPITAL LETTER Y WITH HOOK
352             "\xC6\xB5" => "\xC6\xB6", # LATIN CAPITAL LETTER Z WITH STROKE
353             "\xC6\xB7" => "\xCA\x92", # LATIN CAPITAL LETTER EZH
354             "\xC6\xB8" => "\xC6\xB9", # LATIN CAPITAL LETTER EZH REVERSED
355             "\xC6\xBC" => "\xC6\xBD", # LATIN CAPITAL LETTER TONE FIVE
356             "\xC7\x84" => "\xC7\x86", # LATIN CAPITAL LETTER DZ WITH CARON
357             "\xC7\x85" => "\xC7\x86", # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
358             "\xC7\x87" => "\xC7\x89", # LATIN CAPITAL LETTER LJ
359             "\xC7\x88" => "\xC7\x89", # LATIN CAPITAL LETTER L WITH SMALL LETTER J
360             "\xC7\x8A" => "\xC7\x8C", # LATIN CAPITAL LETTER NJ
361             "\xC7\x8B" => "\xC7\x8C", # LATIN CAPITAL LETTER N WITH SMALL LETTER J
362             "\xC7\x8D" => "\xC7\x8E", # LATIN CAPITAL LETTER A WITH CARON
363             "\xC7\x8F" => "\xC7\x90", # LATIN CAPITAL LETTER I WITH CARON
364             "\xC7\x91" => "\xC7\x92", # LATIN CAPITAL LETTER O WITH CARON
365             "\xC7\x93" => "\xC7\x94", # LATIN CAPITAL LETTER U WITH CARON
366             "\xC7\x95" => "\xC7\x96", # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
367             "\xC7\x97" => "\xC7\x98", # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
368             "\xC7\x99" => "\xC7\x9A", # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
369             "\xC7\x9B" => "\xC7\x9C", # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
370             "\xC7\x9E" => "\xC7\x9F", # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
371             "\xC7\xA0" => "\xC7\xA1", # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
372             "\xC7\xA2" => "\xC7\xA3", # LATIN CAPITAL LETTER AE WITH MACRON
373             "\xC7\xA4" => "\xC7\xA5", # LATIN CAPITAL LETTER G WITH STROKE
374             "\xC7\xA6" => "\xC7\xA7", # LATIN CAPITAL LETTER G WITH CARON
375             "\xC7\xA8" => "\xC7\xA9", # LATIN CAPITAL LETTER K WITH CARON
376             "\xC7\xAA" => "\xC7\xAB", # LATIN CAPITAL LETTER O WITH OGONEK
377             "\xC7\xAC" => "\xC7\xAD", # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
378             "\xC7\xAE" => "\xC7\xAF", # LATIN CAPITAL LETTER EZH WITH CARON
379             "\xC7\xB0" => "\x6A\xCC\x8C", # LATIN SMALL LETTER J WITH CARON
380             "\xC7\xB1" => "\xC7\xB3", # LATIN CAPITAL LETTER DZ
381             "\xC7\xB2" => "\xC7\xB3", # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
382             "\xC7\xB4" => "\xC7\xB5", # LATIN CAPITAL LETTER G WITH ACUTE
383             "\xC7\xB6" => "\xC6\x95", # LATIN CAPITAL LETTER HWAIR
384             "\xC7\xB7" => "\xC6\xBF", # LATIN CAPITAL LETTER WYNN
385             "\xC7\xB8" => "\xC7\xB9", # LATIN CAPITAL LETTER N WITH GRAVE
386             "\xC7\xBA" => "\xC7\xBB", # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
387             "\xC7\xBC" => "\xC7\xBD", # LATIN CAPITAL LETTER AE WITH ACUTE
388             "\xC7\xBE" => "\xC7\xBF", # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
389             "\xC8\x80" => "\xC8\x81", # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
390             "\xC8\x82" => "\xC8\x83", # LATIN CAPITAL LETTER A WITH INVERTED BREVE
391             "\xC8\x84" => "\xC8\x85", # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
392             "\xC8\x86" => "\xC8\x87", # LATIN CAPITAL LETTER E WITH INVERTED BREVE
393             "\xC8\x88" => "\xC8\x89", # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
394             "\xC8\x8A" => "\xC8\x8B", # LATIN CAPITAL LETTER I WITH INVERTED BREVE
395             "\xC8\x8C" => "\xC8\x8D", # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
396             "\xC8\x8E" => "\xC8\x8F", # LATIN CAPITAL LETTER O WITH INVERTED BREVE
397             "\xC8\x90" => "\xC8\x91", # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
398             "\xC8\x92" => "\xC8\x93", # LATIN CAPITAL LETTER R WITH INVERTED BREVE
399             "\xC8\x94" => "\xC8\x95", # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
400             "\xC8\x96" => "\xC8\x97", # LATIN CAPITAL LETTER U WITH INVERTED BREVE
401             "\xC8\x98" => "\xC8\x99", # LATIN CAPITAL LETTER S WITH COMMA BELOW
402             "\xC8\x9A" => "\xC8\x9B", # LATIN CAPITAL LETTER T WITH COMMA BELOW
403             "\xC8\x9C" => "\xC8\x9D", # LATIN CAPITAL LETTER YOGH
404             "\xC8\x9E" => "\xC8\x9F", # LATIN CAPITAL LETTER H WITH CARON
405             "\xC8\xA0" => "\xC6\x9E", # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
406             "\xC8\xA2" => "\xC8\xA3", # LATIN CAPITAL LETTER OU
407             "\xC8\xA4" => "\xC8\xA5", # LATIN CAPITAL LETTER Z WITH HOOK
408             "\xC8\xA6" => "\xC8\xA7", # LATIN CAPITAL LETTER A WITH DOT ABOVE
409             "\xC8\xA8" => "\xC8\xA9", # LATIN CAPITAL LETTER E WITH CEDILLA
410             "\xC8\xAA" => "\xC8\xAB", # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
411             "\xC8\xAC" => "\xC8\xAD", # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
412             "\xC8\xAE" => "\xC8\xAF", # LATIN CAPITAL LETTER O WITH DOT ABOVE
413             "\xC8\xB0" => "\xC8\xB1", # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
414             "\xC8\xB2" => "\xC8\xB3", # LATIN CAPITAL LETTER Y WITH MACRON
415             "\xC8\xBA" => "\xE2\xB1\xA5", # LATIN CAPITAL LETTER A WITH STROKE
416             "\xC8\xBB" => "\xC8\xBC", # LATIN CAPITAL LETTER C WITH STROKE
417             "\xC8\xBD" => "\xC6\x9A", # LATIN CAPITAL LETTER L WITH BAR
418             "\xC8\xBE" => "\xE2\xB1\xA6", # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
419             "\xC9\x81" => "\xC9\x82", # LATIN CAPITAL LETTER GLOTTAL STOP
420             "\xC9\x83" => "\xC6\x80", # LATIN CAPITAL LETTER B WITH STROKE
421             "\xC9\x84" => "\xCA\x89", # LATIN CAPITAL LETTER U BAR
422             "\xC9\x85" => "\xCA\x8C", # LATIN CAPITAL LETTER TURNED V
423             "\xC9\x86" => "\xC9\x87", # LATIN CAPITAL LETTER E WITH STROKE
424             "\xC9\x88" => "\xC9\x89", # LATIN CAPITAL LETTER J WITH STROKE
425             "\xC9\x8A" => "\xC9\x8B", # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
426             "\xC9\x8C" => "\xC9\x8D", # LATIN CAPITAL LETTER R WITH STROKE
427             "\xC9\x8E" => "\xC9\x8F", # LATIN CAPITAL LETTER Y WITH STROKE
428             "\xCD\x85" => "\xCE\xB9", # COMBINING GREEK YPOGEGRAMMENI
429             "\xCD\xB0" => "\xCD\xB1", # GREEK CAPITAL LETTER HETA
430             "\xCD\xB2" => "\xCD\xB3", # GREEK CAPITAL LETTER ARCHAIC SAMPI
431             "\xCD\xB6" => "\xCD\xB7", # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
432             "\xCD\xBF" => "\xCF\xB3", # GREEK CAPITAL LETTER YOT
433             "\xCE\x86" => "\xCE\xAC", # GREEK CAPITAL LETTER ALPHA WITH TONOS
434             "\xCE\x88" => "\xCE\xAD", # GREEK CAPITAL LETTER EPSILON WITH TONOS
435             "\xCE\x89" => "\xCE\xAE", # GREEK CAPITAL LETTER ETA WITH TONOS
436             "\xCE\x8A" => "\xCE\xAF", # GREEK CAPITAL LETTER IOTA WITH TONOS
437             "\xCE\x8C" => "\xCF\x8C", # GREEK CAPITAL LETTER OMICRON WITH TONOS
438             "\xCE\x8E" => "\xCF\x8D", # GREEK CAPITAL LETTER UPSILON WITH TONOS
439             "\xCE\x8F" => "\xCF\x8E", # GREEK CAPITAL LETTER OMEGA WITH TONOS
440             "\xCE\x90" => "\xCE\xB9\xCC\x88\xCC\x81", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
441             "\xCE\x91" => "\xCE\xB1", # GREEK CAPITAL LETTER ALPHA
442             "\xCE\x92" => "\xCE\xB2", # GREEK CAPITAL LETTER BETA
443             "\xCE\x93" => "\xCE\xB3", # GREEK CAPITAL LETTER GAMMA
444             "\xCE\x94" => "\xCE\xB4", # GREEK CAPITAL LETTER DELTA
445             "\xCE\x95" => "\xCE\xB5", # GREEK CAPITAL LETTER EPSILON
446             "\xCE\x96" => "\xCE\xB6", # GREEK CAPITAL LETTER ZETA
447             "\xCE\x97" => "\xCE\xB7", # GREEK CAPITAL LETTER ETA
448             "\xCE\x98" => "\xCE\xB8", # GREEK CAPITAL LETTER THETA
449             "\xCE\x99" => "\xCE\xB9", # GREEK CAPITAL LETTER IOTA
450             "\xCE\x9A" => "\xCE\xBA", # GREEK CAPITAL LETTER KAPPA
451             "\xCE\x9B" => "\xCE\xBB", # GREEK CAPITAL LETTER LAMDA
452             "\xCE\x9C" => "\xCE\xBC", # GREEK CAPITAL LETTER MU
453             "\xCE\x9D" => "\xCE\xBD", # GREEK CAPITAL LETTER NU
454             "\xCE\x9E" => "\xCE\xBE", # GREEK CAPITAL LETTER XI
455             "\xCE\x9F" => "\xCE\xBF", # GREEK CAPITAL LETTER OMICRON
456             "\xCE\xA0" => "\xCF\x80", # GREEK CAPITAL LETTER PI
457             "\xCE\xA1" => "\xCF\x81", # GREEK CAPITAL LETTER RHO
458             "\xCE\xA3" => "\xCF\x83", # GREEK CAPITAL LETTER SIGMA
459             "\xCE\xA4" => "\xCF\x84", # GREEK CAPITAL LETTER TAU
460             "\xCE\xA5" => "\xCF\x85", # GREEK CAPITAL LETTER UPSILON
461             "\xCE\xA6" => "\xCF\x86", # GREEK CAPITAL LETTER PHI
462             "\xCE\xA7" => "\xCF\x87", # GREEK CAPITAL LETTER CHI
463             "\xCE\xA8" => "\xCF\x88", # GREEK CAPITAL LETTER PSI
464             "\xCE\xA9" => "\xCF\x89", # GREEK CAPITAL LETTER OMEGA
465             "\xCE\xAA" => "\xCF\x8A", # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
466             "\xCE\xAB" => "\xCF\x8B", # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
467             "\xCE\xB0" => "\xCF\x85\xCC\x88\xCC\x81", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
468             "\xCF\x82" => "\xCF\x83", # GREEK SMALL LETTER FINAL SIGMA
469             "\xCF\x8F" => "\xCF\x97", # GREEK CAPITAL KAI SYMBOL
470             "\xCF\x90" => "\xCE\xB2", # GREEK BETA SYMBOL
471             "\xCF\x91" => "\xCE\xB8", # GREEK THETA SYMBOL
472             "\xCF\x95" => "\xCF\x86", # GREEK PHI SYMBOL
473             "\xCF\x96" => "\xCF\x80", # GREEK PI SYMBOL
474             "\xCF\x98" => "\xCF\x99", # GREEK LETTER ARCHAIC KOPPA
475             "\xCF\x9A" => "\xCF\x9B", # GREEK LETTER STIGMA
476             "\xCF\x9C" => "\xCF\x9D", # GREEK LETTER DIGAMMA
477             "\xCF\x9E" => "\xCF\x9F", # GREEK LETTER KOPPA
478             "\xCF\xA0" => "\xCF\xA1", # GREEK LETTER SAMPI
479             "\xCF\xA2" => "\xCF\xA3", # COPTIC CAPITAL LETTER SHEI
480             "\xCF\xA4" => "\xCF\xA5", # COPTIC CAPITAL LETTER FEI
481             "\xCF\xA6" => "\xCF\xA7", # COPTIC CAPITAL LETTER KHEI
482             "\xCF\xA8" => "\xCF\xA9", # COPTIC CAPITAL LETTER HORI
483             "\xCF\xAA" => "\xCF\xAB", # COPTIC CAPITAL LETTER GANGIA
484             "\xCF\xAC" => "\xCF\xAD", # COPTIC CAPITAL LETTER SHIMA
485             "\xCF\xAE" => "\xCF\xAF", # COPTIC CAPITAL LETTER DEI
486             "\xCF\xB0" => "\xCE\xBA", # GREEK KAPPA SYMBOL
487             "\xCF\xB1" => "\xCF\x81", # GREEK RHO SYMBOL
488             "\xCF\xB4" => "\xCE\xB8", # GREEK CAPITAL THETA SYMBOL
489             "\xCF\xB5" => "\xCE\xB5", # GREEK LUNATE EPSILON SYMBOL
490             "\xCF\xB7" => "\xCF\xB8", # GREEK CAPITAL LETTER SHO
491             "\xCF\xB9" => "\xCF\xB2", # GREEK CAPITAL LUNATE SIGMA SYMBOL
492             "\xCF\xBA" => "\xCF\xBB", # GREEK CAPITAL LETTER SAN
493             "\xCF\xBD" => "\xCD\xBB", # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
494             "\xCF\xBE" => "\xCD\xBC", # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
495             "\xCF\xBF" => "\xCD\xBD", # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
496             "\xD0\x80" => "\xD1\x90", # CYRILLIC CAPITAL LETTER IE WITH GRAVE
497             "\xD0\x81" => "\xD1\x91", # CYRILLIC CAPITAL LETTER IO
498             "\xD0\x82" => "\xD1\x92", # CYRILLIC CAPITAL LETTER DJE
499             "\xD0\x83" => "\xD1\x93", # CYRILLIC CAPITAL LETTER GJE
500             "\xD0\x84" => "\xD1\x94", # CYRILLIC CAPITAL LETTER UKRAINIAN IE
501             "\xD0\x85" => "\xD1\x95", # CYRILLIC CAPITAL LETTER DZE
502             "\xD0\x86" => "\xD1\x96", # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
503             "\xD0\x87" => "\xD1\x97", # CYRILLIC CAPITAL LETTER YI
504             "\xD0\x88" => "\xD1\x98", # CYRILLIC CAPITAL LETTER JE
505             "\xD0\x89" => "\xD1\x99", # CYRILLIC CAPITAL LETTER LJE
506             "\xD0\x8A" => "\xD1\x9A", # CYRILLIC CAPITAL LETTER NJE
507             "\xD0\x8B" => "\xD1\x9B", # CYRILLIC CAPITAL LETTER TSHE
508             "\xD0\x8C" => "\xD1\x9C", # CYRILLIC CAPITAL LETTER KJE
509             "\xD0\x8D" => "\xD1\x9D", # CYRILLIC CAPITAL LETTER I WITH GRAVE
510             "\xD0\x8E" => "\xD1\x9E", # CYRILLIC CAPITAL LETTER SHORT U
511             "\xD0\x8F" => "\xD1\x9F", # CYRILLIC CAPITAL LETTER DZHE
512             "\xD0\x90" => "\xD0\xB0", # CYRILLIC CAPITAL LETTER A
513             "\xD0\x91" => "\xD0\xB1", # CYRILLIC CAPITAL LETTER BE
514             "\xD0\x92" => "\xD0\xB2", # CYRILLIC CAPITAL LETTER VE
515             "\xD0\x93" => "\xD0\xB3", # CYRILLIC CAPITAL LETTER GHE
516             "\xD0\x94" => "\xD0\xB4", # CYRILLIC CAPITAL LETTER DE
517             "\xD0\x95" => "\xD0\xB5", # CYRILLIC CAPITAL LETTER IE
518             "\xD0\x96" => "\xD0\xB6", # CYRILLIC CAPITAL LETTER ZHE
519             "\xD0\x97" => "\xD0\xB7", # CYRILLIC CAPITAL LETTER ZE
520             "\xD0\x98" => "\xD0\xB8", # CYRILLIC CAPITAL LETTER I
521             "\xD0\x99" => "\xD0\xB9", # CYRILLIC CAPITAL LETTER SHORT I
522             "\xD0\x9A" => "\xD0\xBA", # CYRILLIC CAPITAL LETTER KA
523             "\xD0\x9B" => "\xD0\xBB", # CYRILLIC CAPITAL LETTER EL
524             "\xD0\x9C" => "\xD0\xBC", # CYRILLIC CAPITAL LETTER EM
525             "\xD0\x9D" => "\xD0\xBD", # CYRILLIC CAPITAL LETTER EN
526             "\xD0\x9E" => "\xD0\xBE", # CYRILLIC CAPITAL LETTER O
527             "\xD0\x9F" => "\xD0\xBF", # CYRILLIC CAPITAL LETTER PE
528             "\xD0\xA0" => "\xD1\x80", # CYRILLIC CAPITAL LETTER ER
529             "\xD0\xA1" => "\xD1\x81", # CYRILLIC CAPITAL LETTER ES
530             "\xD0\xA2" => "\xD1\x82", # CYRILLIC CAPITAL LETTER TE
531             "\xD0\xA3" => "\xD1\x83", # CYRILLIC CAPITAL LETTER U
532             "\xD0\xA4" => "\xD1\x84", # CYRILLIC CAPITAL LETTER EF
533             "\xD0\xA5" => "\xD1\x85", # CYRILLIC CAPITAL LETTER HA
534             "\xD0\xA6" => "\xD1\x86", # CYRILLIC CAPITAL LETTER TSE
535             "\xD0\xA7" => "\xD1\x87", # CYRILLIC CAPITAL LETTER CHE
536             "\xD0\xA8" => "\xD1\x88", # CYRILLIC CAPITAL LETTER SHA
537             "\xD0\xA9" => "\xD1\x89", # CYRILLIC CAPITAL LETTER SHCHA
538             "\xD0\xAA" => "\xD1\x8A", # CYRILLIC CAPITAL LETTER HARD SIGN
539             "\xD0\xAB" => "\xD1\x8B", # CYRILLIC CAPITAL LETTER YERU
540             "\xD0\xAC" => "\xD1\x8C", # CYRILLIC CAPITAL LETTER SOFT SIGN
541             "\xD0\xAD" => "\xD1\x8D", # CYRILLIC CAPITAL LETTER E
542             "\xD0\xAE" => "\xD1\x8E", # CYRILLIC CAPITAL LETTER YU
543             "\xD0\xAF" => "\xD1\x8F", # CYRILLIC CAPITAL LETTER YA
544             "\xD1\xA0" => "\xD1\xA1", # CYRILLIC CAPITAL LETTER OMEGA
545             "\xD1\xA2" => "\xD1\xA3", # CYRILLIC CAPITAL LETTER YAT
546             "\xD1\xA4" => "\xD1\xA5", # CYRILLIC CAPITAL LETTER IOTIFIED E
547             "\xD1\xA6" => "\xD1\xA7", # CYRILLIC CAPITAL LETTER LITTLE YUS
548             "\xD1\xA8" => "\xD1\xA9", # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
549             "\xD1\xAA" => "\xD1\xAB", # CYRILLIC CAPITAL LETTER BIG YUS
550             "\xD1\xAC" => "\xD1\xAD", # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
551             "\xD1\xAE" => "\xD1\xAF", # CYRILLIC CAPITAL LETTER KSI
552             "\xD1\xB0" => "\xD1\xB1", # CYRILLIC CAPITAL LETTER PSI
553             "\xD1\xB2" => "\xD1\xB3", # CYRILLIC CAPITAL LETTER FITA
554             "\xD1\xB4" => "\xD1\xB5", # CYRILLIC CAPITAL LETTER IZHITSA
555             "\xD1\xB6" => "\xD1\xB7", # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
556             "\xD1\xB8" => "\xD1\xB9", # CYRILLIC CAPITAL LETTER UK
557             "\xD1\xBA" => "\xD1\xBB", # CYRILLIC CAPITAL LETTER ROUND OMEGA
558             "\xD1\xBC" => "\xD1\xBD", # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
559             "\xD1\xBE" => "\xD1\xBF", # CYRILLIC CAPITAL LETTER OT
560             "\xD2\x80" => "\xD2\x81", # CYRILLIC CAPITAL LETTER KOPPA
561             "\xD2\x8A" => "\xD2\x8B", # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
562             "\xD2\x8C" => "\xD2\x8D", # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
563             "\xD2\x8E" => "\xD2\x8F", # CYRILLIC CAPITAL LETTER ER WITH TICK
564             "\xD2\x90" => "\xD2\x91", # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
565             "\xD2\x92" => "\xD2\x93", # CYRILLIC CAPITAL LETTER GHE WITH STROKE
566             "\xD2\x94" => "\xD2\x95", # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
567             "\xD2\x96" => "\xD2\x97", # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
568             "\xD2\x98" => "\xD2\x99", # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
569             "\xD2\x9A" => "\xD2\x9B", # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
570             "\xD2\x9C" => "\xD2\x9D", # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
571             "\xD2\x9E" => "\xD2\x9F", # CYRILLIC CAPITAL LETTER KA WITH STROKE
572             "\xD2\xA0" => "\xD2\xA1", # CYRILLIC CAPITAL LETTER BASHKIR KA
573             "\xD2\xA2" => "\xD2\xA3", # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
574             "\xD2\xA4" => "\xD2\xA5", # CYRILLIC CAPITAL LIGATURE EN GHE
575             "\xD2\xA6" => "\xD2\xA7", # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
576             "\xD2\xA8" => "\xD2\xA9", # CYRILLIC CAPITAL LETTER ABKHASIAN HA
577             "\xD2\xAA" => "\xD2\xAB", # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
578             "\xD2\xAC" => "\xD2\xAD", # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
579             "\xD2\xAE" => "\xD2\xAF", # CYRILLIC CAPITAL LETTER STRAIGHT U
580             "\xD2\xB0" => "\xD2\xB1", # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
581             "\xD2\xB2" => "\xD2\xB3", # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
582             "\xD2\xB4" => "\xD2\xB5", # CYRILLIC CAPITAL LIGATURE TE TSE
583             "\xD2\xB6" => "\xD2\xB7", # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
584             "\xD2\xB8" => "\xD2\xB9", # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
585             "\xD2\xBA" => "\xD2\xBB", # CYRILLIC CAPITAL LETTER SHHA
586             "\xD2\xBC" => "\xD2\xBD", # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
587             "\xD2\xBE" => "\xD2\xBF", # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
588             "\xD3\x80" => "\xD3\x8F", # CYRILLIC LETTER PALOCHKA
589             "\xD3\x81" => "\xD3\x82", # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
590             "\xD3\x83" => "\xD3\x84", # CYRILLIC CAPITAL LETTER KA WITH HOOK
591             "\xD3\x85" => "\xD3\x86", # CYRILLIC CAPITAL LETTER EL WITH TAIL
592             "\xD3\x87" => "\xD3\x88", # CYRILLIC CAPITAL LETTER EN WITH HOOK
593             "\xD3\x89" => "\xD3\x8A", # CYRILLIC CAPITAL LETTER EN WITH TAIL
594             "\xD3\x8B" => "\xD3\x8C", # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
595             "\xD3\x8D" => "\xD3\x8E", # CYRILLIC CAPITAL LETTER EM WITH TAIL
596             "\xD3\x90" => "\xD3\x91", # CYRILLIC CAPITAL LETTER A WITH BREVE
597             "\xD3\x92" => "\xD3\x93", # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
598             "\xD3\x94" => "\xD3\x95", # CYRILLIC CAPITAL LIGATURE A IE
599             "\xD3\x96" => "\xD3\x97", # CYRILLIC CAPITAL LETTER IE WITH BREVE
600             "\xD3\x98" => "\xD3\x99", # CYRILLIC CAPITAL LETTER SCHWA
601             "\xD3\x9A" => "\xD3\x9B", # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
602             "\xD3\x9C" => "\xD3\x9D", # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
603             "\xD3\x9E" => "\xD3\x9F", # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
604             "\xD3\xA0" => "\xD3\xA1", # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
605             "\xD3\xA2" => "\xD3\xA3", # CYRILLIC CAPITAL LETTER I WITH MACRON
606             "\xD3\xA4" => "\xD3\xA5", # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
607             "\xD3\xA6" => "\xD3\xA7", # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
608             "\xD3\xA8" => "\xD3\xA9", # CYRILLIC CAPITAL LETTER BARRED O
609             "\xD3\xAA" => "\xD3\xAB", # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
610             "\xD3\xAC" => "\xD3\xAD", # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
611             "\xD3\xAE" => "\xD3\xAF", # CYRILLIC CAPITAL LETTER U WITH MACRON
612             "\xD3\xB0" => "\xD3\xB1", # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
613             "\xD3\xB2" => "\xD3\xB3", # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
614             "\xD3\xB4" => "\xD3\xB5", # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
615             "\xD3\xB6" => "\xD3\xB7", # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
616             "\xD3\xB8" => "\xD3\xB9", # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
617             "\xD3\xBA" => "\xD3\xBB", # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
618             "\xD3\xBC" => "\xD3\xBD", # CYRILLIC CAPITAL LETTER HA WITH HOOK
619             "\xD3\xBE" => "\xD3\xBF", # CYRILLIC CAPITAL LETTER HA WITH STROKE
620             "\xD4\x80" => "\xD4\x81", # CYRILLIC CAPITAL LETTER KOMI DE
621             "\xD4\x82" => "\xD4\x83", # CYRILLIC CAPITAL LETTER KOMI DJE
622             "\xD4\x84" => "\xD4\x85", # CYRILLIC CAPITAL LETTER KOMI ZJE
623             "\xD4\x86" => "\xD4\x87", # CYRILLIC CAPITAL LETTER KOMI DZJE
624             "\xD4\x88" => "\xD4\x89", # CYRILLIC CAPITAL LETTER KOMI LJE
625             "\xD4\x8A" => "\xD4\x8B", # CYRILLIC CAPITAL LETTER KOMI NJE
626             "\xD4\x8C" => "\xD4\x8D", # CYRILLIC CAPITAL LETTER KOMI SJE
627             "\xD4\x8E" => "\xD4\x8F", # CYRILLIC CAPITAL LETTER KOMI TJE
628             "\xD4\x90" => "\xD4\x91", # CYRILLIC CAPITAL LETTER REVERSED ZE
629             "\xD4\x92" => "\xD4\x93", # CYRILLIC CAPITAL LETTER EL WITH HOOK
630             "\xD4\x94" => "\xD4\x95", # CYRILLIC CAPITAL LETTER LHA
631             "\xD4\x96" => "\xD4\x97", # CYRILLIC CAPITAL LETTER RHA
632             "\xD4\x98" => "\xD4\x99", # CYRILLIC CAPITAL LETTER YAE
633             "\xD4\x9A" => "\xD4\x9B", # CYRILLIC CAPITAL LETTER QA
634             "\xD4\x9C" => "\xD4\x9D", # CYRILLIC CAPITAL LETTER WE
635             "\xD4\x9E" => "\xD4\x9F", # CYRILLIC CAPITAL LETTER ALEUT KA
636             "\xD4\xA0" => "\xD4\xA1", # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
637             "\xD4\xA2" => "\xD4\xA3", # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
638             "\xD4\xA4" => "\xD4\xA5", # CYRILLIC CAPITAL LETTER PE WITH DESCENDER
639             "\xD4\xA6" => "\xD4\xA7", # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER
640             "\xD4\xA8" => "\xD4\xA9", # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
641             "\xD4\xAA" => "\xD4\xAB", # CYRILLIC CAPITAL LETTER DZZHE
642             "\xD4\xAC" => "\xD4\xAD", # CYRILLIC CAPITAL LETTER DCHE
643             "\xD4\xAE" => "\xD4\xAF", # CYRILLIC CAPITAL LETTER EL WITH DESCENDER
644             "\xD4\xB1" => "\xD5\xA1", # ARMENIAN CAPITAL LETTER AYB
645             "\xD4\xB2" => "\xD5\xA2", # ARMENIAN CAPITAL LETTER BEN
646             "\xD4\xB3" => "\xD5\xA3", # ARMENIAN CAPITAL LETTER GIM
647             "\xD4\xB4" => "\xD5\xA4", # ARMENIAN CAPITAL LETTER DA
648             "\xD4\xB5" => "\xD5\xA5", # ARMENIAN CAPITAL LETTER ECH
649             "\xD4\xB6" => "\xD5\xA6", # ARMENIAN CAPITAL LETTER ZA
650             "\xD4\xB7" => "\xD5\xA7", # ARMENIAN CAPITAL LETTER EH
651             "\xD4\xB8" => "\xD5\xA8", # ARMENIAN CAPITAL LETTER ET
652             "\xD4\xB9" => "\xD5\xA9", # ARMENIAN CAPITAL LETTER TO
653             "\xD4\xBA" => "\xD5\xAA", # ARMENIAN CAPITAL LETTER ZHE
654             "\xD4\xBB" => "\xD5\xAB", # ARMENIAN CAPITAL LETTER INI
655             "\xD4\xBC" => "\xD5\xAC", # ARMENIAN CAPITAL LETTER LIWN
656             "\xD4\xBD" => "\xD5\xAD", # ARMENIAN CAPITAL LETTER XEH
657             "\xD4\xBE" => "\xD5\xAE", # ARMENIAN CAPITAL LETTER CA
658             "\xD4\xBF" => "\xD5\xAF", # ARMENIAN CAPITAL LETTER KEN
659             "\xD5\x80" => "\xD5\xB0", # ARMENIAN CAPITAL LETTER HO
660             "\xD5\x81" => "\xD5\xB1", # ARMENIAN CAPITAL LETTER JA
661             "\xD5\x82" => "\xD5\xB2", # ARMENIAN CAPITAL LETTER GHAD
662             "\xD5\x83" => "\xD5\xB3", # ARMENIAN CAPITAL LETTER CHEH
663             "\xD5\x84" => "\xD5\xB4", # ARMENIAN CAPITAL LETTER MEN
664             "\xD5\x85" => "\xD5\xB5", # ARMENIAN CAPITAL LETTER YI
665             "\xD5\x86" => "\xD5\xB6", # ARMENIAN CAPITAL LETTER NOW
666             "\xD5\x87" => "\xD5\xB7", # ARMENIAN CAPITAL LETTER SHA
667             "\xD5\x88" => "\xD5\xB8", # ARMENIAN CAPITAL LETTER VO
668             "\xD5\x89" => "\xD5\xB9", # ARMENIAN CAPITAL LETTER CHA
669             "\xD5\x8A" => "\xD5\xBA", # ARMENIAN CAPITAL LETTER PEH
670             "\xD5\x8B" => "\xD5\xBB", # ARMENIAN CAPITAL LETTER JHEH
671             "\xD5\x8C" => "\xD5\xBC", # ARMENIAN CAPITAL LETTER RA
672             "\xD5\x8D" => "\xD5\xBD", # ARMENIAN CAPITAL LETTER SEH
673             "\xD5\x8E" => "\xD5\xBE", # ARMENIAN CAPITAL LETTER VEW
674             "\xD5\x8F" => "\xD5\xBF", # ARMENIAN CAPITAL LETTER TIWN
675             "\xD5\x90" => "\xD6\x80", # ARMENIAN CAPITAL LETTER REH
676             "\xD5\x91" => "\xD6\x81", # ARMENIAN CAPITAL LETTER CO
677             "\xD5\x92" => "\xD6\x82", # ARMENIAN CAPITAL LETTER YIWN
678             "\xD5\x93" => "\xD6\x83", # ARMENIAN CAPITAL LETTER PIWR
679             "\xD5\x94" => "\xD6\x84", # ARMENIAN CAPITAL LETTER KEH
680             "\xD5\x95" => "\xD6\x85", # ARMENIAN CAPITAL LETTER OH
681             "\xD5\x96" => "\xD6\x86", # ARMENIAN CAPITAL LETTER FEH
682             "\xD6\x87" => "\xD5\xA5\xD6\x82", # ARMENIAN SMALL LIGATURE ECH YIWN
683             "\xE1\x82\xA0" => "\xE2\xB4\x80", # GEORGIAN CAPITAL LETTER AN
684             "\xE1\x82\xA1" => "\xE2\xB4\x81", # GEORGIAN CAPITAL LETTER BAN
685             "\xE1\x82\xA2" => "\xE2\xB4\x82", # GEORGIAN CAPITAL LETTER GAN
686             "\xE1\x82\xA3" => "\xE2\xB4\x83", # GEORGIAN CAPITAL LETTER DON
687             "\xE1\x82\xA4" => "\xE2\xB4\x84", # GEORGIAN CAPITAL LETTER EN
688             "\xE1\x82\xA5" => "\xE2\xB4\x85", # GEORGIAN CAPITAL LETTER VIN
689             "\xE1\x82\xA6" => "\xE2\xB4\x86", # GEORGIAN CAPITAL LETTER ZEN
690             "\xE1\x82\xA7" => "\xE2\xB4\x87", # GEORGIAN CAPITAL LETTER TAN
691             "\xE1\x82\xA8" => "\xE2\xB4\x88", # GEORGIAN CAPITAL LETTER IN
692             "\xE1\x82\xA9" => "\xE2\xB4\x89", # GEORGIAN CAPITAL LETTER KAN
693             "\xE1\x82\xAA" => "\xE2\xB4\x8A", # GEORGIAN CAPITAL LETTER LAS
694             "\xE1\x82\xAB" => "\xE2\xB4\x8B", # GEORGIAN CAPITAL LETTER MAN
695             "\xE1\x82\xAC" => "\xE2\xB4\x8C", # GEORGIAN CAPITAL LETTER NAR
696             "\xE1\x82\xAD" => "\xE2\xB4\x8D", # GEORGIAN CAPITAL LETTER ON
697             "\xE1\x82\xAE" => "\xE2\xB4\x8E", # GEORGIAN CAPITAL LETTER PAR
698             "\xE1\x82\xAF" => "\xE2\xB4\x8F", # GEORGIAN CAPITAL LETTER ZHAR
699             "\xE1\x82\xB0" => "\xE2\xB4\x90", # GEORGIAN CAPITAL LETTER RAE
700             "\xE1\x82\xB1" => "\xE2\xB4\x91", # GEORGIAN CAPITAL LETTER SAN
701             "\xE1\x82\xB2" => "\xE2\xB4\x92", # GEORGIAN CAPITAL LETTER TAR
702             "\xE1\x82\xB3" => "\xE2\xB4\x93", # GEORGIAN CAPITAL LETTER UN
703             "\xE1\x82\xB4" => "\xE2\xB4\x94", # GEORGIAN CAPITAL LETTER PHAR
704             "\xE1\x82\xB5" => "\xE2\xB4\x95", # GEORGIAN CAPITAL LETTER KHAR
705             "\xE1\x82\xB6" => "\xE2\xB4\x96", # GEORGIAN CAPITAL LETTER GHAN
706             "\xE1\x82\xB7" => "\xE2\xB4\x97", # GEORGIAN CAPITAL LETTER QAR
707             "\xE1\x82\xB8" => "\xE2\xB4\x98", # GEORGIAN CAPITAL LETTER SHIN
708             "\xE1\x82\xB9" => "\xE2\xB4\x99", # GEORGIAN CAPITAL LETTER CHIN
709             "\xE1\x82\xBA" => "\xE2\xB4\x9A", # GEORGIAN CAPITAL LETTER CAN
710             "\xE1\x82\xBB" => "\xE2\xB4\x9B", # GEORGIAN CAPITAL LETTER JIL
711             "\xE1\x82\xBC" => "\xE2\xB4\x9C", # GEORGIAN CAPITAL LETTER CIL
712             "\xE1\x82\xBD" => "\xE2\xB4\x9D", # GEORGIAN CAPITAL LETTER CHAR
713             "\xE1\x82\xBE" => "\xE2\xB4\x9E", # GEORGIAN CAPITAL LETTER XAN
714             "\xE1\x82\xBF" => "\xE2\xB4\x9F", # GEORGIAN CAPITAL LETTER JHAN
715             "\xE1\x83\x80" => "\xE2\xB4\xA0", # GEORGIAN CAPITAL LETTER HAE
716             "\xE1\x83\x81" => "\xE2\xB4\xA1", # GEORGIAN CAPITAL LETTER HE
717             "\xE1\x83\x82" => "\xE2\xB4\xA2", # GEORGIAN CAPITAL LETTER HIE
718             "\xE1\x83\x83" => "\xE2\xB4\xA3", # GEORGIAN CAPITAL LETTER WE
719             "\xE1\x83\x84" => "\xE2\xB4\xA4", # GEORGIAN CAPITAL LETTER HAR
720             "\xE1\x83\x85" => "\xE2\xB4\xA5", # GEORGIAN CAPITAL LETTER HOE
721             "\xE1\x83\x87" => "\xE2\xB4\xA7", # GEORGIAN CAPITAL LETTER YN
722             "\xE1\x83\x8D" => "\xE2\xB4\xAD", # GEORGIAN CAPITAL LETTER AEN
723             "\xE1\x8F\xB8" => "\xE1\x8F\xB0", # CHEROKEE SMALL LETTER YE
724             "\xE1\x8F\xB9" => "\xE1\x8F\xB1", # CHEROKEE SMALL LETTER YI
725             "\xE1\x8F\xBA" => "\xE1\x8F\xB2", # CHEROKEE SMALL LETTER YO
726             "\xE1\x8F\xBB" => "\xE1\x8F\xB3", # CHEROKEE SMALL LETTER YU
727             "\xE1\x8F\xBC" => "\xE1\x8F\xB4", # CHEROKEE SMALL LETTER YV
728             "\xE1\x8F\xBD" => "\xE1\x8F\xB5", # CHEROKEE SMALL LETTER MV
729             "\xE1\xB2\x80" => "\xD0\xB2", # CYRILLIC SMALL LETTER ROUNDED VE
730             "\xE1\xB2\x81" => "\xD0\xB4", # CYRILLIC SMALL LETTER LONG-LEGGED DE
731             "\xE1\xB2\x82" => "\xD0\xBE", # CYRILLIC SMALL LETTER NARROW O
732             "\xE1\xB2\x83" => "\xD1\x81", # CYRILLIC SMALL LETTER WIDE ES
733             "\xE1\xB2\x84" => "\xD1\x82", # CYRILLIC SMALL LETTER TALL TE
734             "\xE1\xB2\x85" => "\xD1\x82", # CYRILLIC SMALL LETTER THREE-LEGGED TE
735             "\xE1\xB2\x86" => "\xD1\x8A", # CYRILLIC SMALL LETTER TALL HARD SIGN
736             "\xE1\xB2\x87" => "\xD1\xA3", # CYRILLIC SMALL LETTER TALL YAT
737             "\xE1\xB2\x88" => "\xEA\x99\x8B", # CYRILLIC SMALL LETTER UNBLENDED UK
738             "\xE1\xB2\x90" => "\xE1\x83\x90", # GEORGIAN MTAVRULI CAPITAL LETTER AN
739             "\xE1\xB2\x91" => "\xE1\x83\x91", # GEORGIAN MTAVRULI CAPITAL LETTER BAN
740             "\xE1\xB2\x92" => "\xE1\x83\x92", # GEORGIAN MTAVRULI CAPITAL LETTER GAN
741             "\xE1\xB2\x93" => "\xE1\x83\x93", # GEORGIAN MTAVRULI CAPITAL LETTER DON
742             "\xE1\xB2\x94" => "\xE1\x83\x94", # GEORGIAN MTAVRULI CAPITAL LETTER EN
743             "\xE1\xB2\x95" => "\xE1\x83\x95", # GEORGIAN MTAVRULI CAPITAL LETTER VIN
744             "\xE1\xB2\x96" => "\xE1\x83\x96", # GEORGIAN MTAVRULI CAPITAL LETTER ZEN
745             "\xE1\xB2\x97" => "\xE1\x83\x97", # GEORGIAN MTAVRULI CAPITAL LETTER TAN
746             "\xE1\xB2\x98" => "\xE1\x83\x98", # GEORGIAN MTAVRULI CAPITAL LETTER IN
747             "\xE1\xB2\x99" => "\xE1\x83\x99", # GEORGIAN MTAVRULI CAPITAL LETTER KAN
748             "\xE1\xB2\x9A" => "\xE1\x83\x9A", # GEORGIAN MTAVRULI CAPITAL LETTER LAS
749             "\xE1\xB2\x9B" => "\xE1\x83\x9B", # GEORGIAN MTAVRULI CAPITAL LETTER MAN
750             "\xE1\xB2\x9C" => "\xE1\x83\x9C", # GEORGIAN MTAVRULI CAPITAL LETTER NAR
751             "\xE1\xB2\x9D" => "\xE1\x83\x9D", # GEORGIAN MTAVRULI CAPITAL LETTER ON
752             "\xE1\xB2\x9E" => "\xE1\x83\x9E", # GEORGIAN MTAVRULI CAPITAL LETTER PAR
753             "\xE1\xB2\x9F" => "\xE1\x83\x9F", # GEORGIAN MTAVRULI CAPITAL LETTER ZHAR
754             "\xE1\xB2\xA0" => "\xE1\x83\xA0", # GEORGIAN MTAVRULI CAPITAL LETTER RAE
755             "\xE1\xB2\xA1" => "\xE1\x83\xA1", # GEORGIAN MTAVRULI CAPITAL LETTER SAN
756             "\xE1\xB2\xA2" => "\xE1\x83\xA2", # GEORGIAN MTAVRULI CAPITAL LETTER TAR
757             "\xE1\xB2\xA3" => "\xE1\x83\xA3", # GEORGIAN MTAVRULI CAPITAL LETTER UN
758             "\xE1\xB2\xA4" => "\xE1\x83\xA4", # GEORGIAN MTAVRULI CAPITAL LETTER PHAR
759             "\xE1\xB2\xA5" => "\xE1\x83\xA5", # GEORGIAN MTAVRULI CAPITAL LETTER KHAR
760             "\xE1\xB2\xA6" => "\xE1\x83\xA6", # GEORGIAN MTAVRULI CAPITAL LETTER GHAN
761             "\xE1\xB2\xA7" => "\xE1\x83\xA7", # GEORGIAN MTAVRULI CAPITAL LETTER QAR
762             "\xE1\xB2\xA8" => "\xE1\x83\xA8", # GEORGIAN MTAVRULI CAPITAL LETTER SHIN
763             "\xE1\xB2\xA9" => "\xE1\x83\xA9", # GEORGIAN MTAVRULI CAPITAL LETTER CHIN
764             "\xE1\xB2\xAA" => "\xE1\x83\xAA", # GEORGIAN MTAVRULI CAPITAL LETTER CAN
765             "\xE1\xB2\xAB" => "\xE1\x83\xAB", # GEORGIAN MTAVRULI CAPITAL LETTER JIL
766             "\xE1\xB2\xAC" => "\xE1\x83\xAC", # GEORGIAN MTAVRULI CAPITAL LETTER CIL
767             "\xE1\xB2\xAD" => "\xE1\x83\xAD", # GEORGIAN MTAVRULI CAPITAL LETTER CHAR
768             "\xE1\xB2\xAE" => "\xE1\x83\xAE", # GEORGIAN MTAVRULI CAPITAL LETTER XAN
769             "\xE1\xB2\xAF" => "\xE1\x83\xAF", # GEORGIAN MTAVRULI CAPITAL LETTER JHAN
770             "\xE1\xB2\xB0" => "\xE1\x83\xB0", # GEORGIAN MTAVRULI CAPITAL LETTER HAE
771             "\xE1\xB2\xB1" => "\xE1\x83\xB1", # GEORGIAN MTAVRULI CAPITAL LETTER HE
772             "\xE1\xB2\xB2" => "\xE1\x83\xB2", # GEORGIAN MTAVRULI CAPITAL LETTER HIE
773             "\xE1\xB2\xB3" => "\xE1\x83\xB3", # GEORGIAN MTAVRULI CAPITAL LETTER WE
774             "\xE1\xB2\xB4" => "\xE1\x83\xB4", # GEORGIAN MTAVRULI CAPITAL LETTER HAR
775             "\xE1\xB2\xB5" => "\xE1\x83\xB5", # GEORGIAN MTAVRULI CAPITAL LETTER HOE
776             "\xE1\xB2\xB6" => "\xE1\x83\xB6", # GEORGIAN MTAVRULI CAPITAL LETTER FI
777             "\xE1\xB2\xB7" => "\xE1\x83\xB7", # GEORGIAN MTAVRULI CAPITAL LETTER YN
778             "\xE1\xB2\xB8" => "\xE1\x83\xB8", # GEORGIAN MTAVRULI CAPITAL LETTER ELIFI
779             "\xE1\xB2\xB9" => "\xE1\x83\xB9", # GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN
780             "\xE1\xB2\xBA" => "\xE1\x83\xBA", # GEORGIAN MTAVRULI CAPITAL LETTER AIN
781             "\xE1\xB2\xBD" => "\xE1\x83\xBD", # GEORGIAN MTAVRULI CAPITAL LETTER AEN
782             "\xE1\xB2\xBE" => "\xE1\x83\xBE", # GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN
783             "\xE1\xB2\xBF" => "\xE1\x83\xBF", # GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
784             "\xE1\xB8\x80" => "\xE1\xB8\x81", # LATIN CAPITAL LETTER A WITH RING BELOW
785             "\xE1\xB8\x82" => "\xE1\xB8\x83", # LATIN CAPITAL LETTER B WITH DOT ABOVE
786             "\xE1\xB8\x84" => "\xE1\xB8\x85", # LATIN CAPITAL LETTER B WITH DOT BELOW
787             "\xE1\xB8\x86" => "\xE1\xB8\x87", # LATIN CAPITAL LETTER B WITH LINE BELOW
788             "\xE1\xB8\x88" => "\xE1\xB8\x89", # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
789             "\xE1\xB8\x8A" => "\xE1\xB8\x8B", # LATIN CAPITAL LETTER D WITH DOT ABOVE
790             "\xE1\xB8\x8C" => "\xE1\xB8\x8D", # LATIN CAPITAL LETTER D WITH DOT BELOW
791             "\xE1\xB8\x8E" => "\xE1\xB8\x8F", # LATIN CAPITAL LETTER D WITH LINE BELOW
792             "\xE1\xB8\x90" => "\xE1\xB8\x91", # LATIN CAPITAL LETTER D WITH CEDILLA
793             "\xE1\xB8\x92" => "\xE1\xB8\x93", # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
794             "\xE1\xB8\x94" => "\xE1\xB8\x95", # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
795             "\xE1\xB8\x96" => "\xE1\xB8\x97", # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
796             "\xE1\xB8\x98" => "\xE1\xB8\x99", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
797             "\xE1\xB8\x9A" => "\xE1\xB8\x9B", # LATIN CAPITAL LETTER E WITH TILDE BELOW
798             "\xE1\xB8\x9C" => "\xE1\xB8\x9D", # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
799             "\xE1\xB8\x9E" => "\xE1\xB8\x9F", # LATIN CAPITAL LETTER F WITH DOT ABOVE
800             "\xE1\xB8\xA0" => "\xE1\xB8\xA1", # LATIN CAPITAL LETTER G WITH MACRON
801             "\xE1\xB8\xA2" => "\xE1\xB8\xA3", # LATIN CAPITAL LETTER H WITH DOT ABOVE
802             "\xE1\xB8\xA4" => "\xE1\xB8\xA5", # LATIN CAPITAL LETTER H WITH DOT BELOW
803             "\xE1\xB8\xA6" => "\xE1\xB8\xA7", # LATIN CAPITAL LETTER H WITH DIAERESIS
804             "\xE1\xB8\xA8" => "\xE1\xB8\xA9", # LATIN CAPITAL LETTER H WITH CEDILLA
805             "\xE1\xB8\xAA" => "\xE1\xB8\xAB", # LATIN CAPITAL LETTER H WITH BREVE BELOW
806             "\xE1\xB8\xAC" => "\xE1\xB8\xAD", # LATIN CAPITAL LETTER I WITH TILDE BELOW
807             "\xE1\xB8\xAE" => "\xE1\xB8\xAF", # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
808             "\xE1\xB8\xB0" => "\xE1\xB8\xB1", # LATIN CAPITAL LETTER K WITH ACUTE
809             "\xE1\xB8\xB2" => "\xE1\xB8\xB3", # LATIN CAPITAL LETTER K WITH DOT BELOW
810             "\xE1\xB8\xB4" => "\xE1\xB8\xB5", # LATIN CAPITAL LETTER K WITH LINE BELOW
811             "\xE1\xB8\xB6" => "\xE1\xB8\xB7", # LATIN CAPITAL LETTER L WITH DOT BELOW
812             "\xE1\xB8\xB8" => "\xE1\xB8\xB9", # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
813             "\xE1\xB8\xBA" => "\xE1\xB8\xBB", # LATIN CAPITAL LETTER L WITH LINE BELOW
814             "\xE1\xB8\xBC" => "\xE1\xB8\xBD", # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
815             "\xE1\xB8\xBE" => "\xE1\xB8\xBF", # LATIN CAPITAL LETTER M WITH ACUTE
816             "\xE1\xB9\x80" => "\xE1\xB9\x81", # LATIN CAPITAL LETTER M WITH DOT ABOVE
817             "\xE1\xB9\x82" => "\xE1\xB9\x83", # LATIN CAPITAL LETTER M WITH DOT BELOW
818             "\xE1\xB9\x84" => "\xE1\xB9\x85", # LATIN CAPITAL LETTER N WITH DOT ABOVE
819             "\xE1\xB9\x86" => "\xE1\xB9\x87", # LATIN CAPITAL LETTER N WITH DOT BELOW
820             "\xE1\xB9\x88" => "\xE1\xB9\x89", # LATIN CAPITAL LETTER N WITH LINE BELOW
821             "\xE1\xB9\x8A" => "\xE1\xB9\x8B", # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
822             "\xE1\xB9\x8C" => "\xE1\xB9\x8D", # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
823             "\xE1\xB9\x8E" => "\xE1\xB9\x8F", # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
824             "\xE1\xB9\x90" => "\xE1\xB9\x91", # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
825             "\xE1\xB9\x92" => "\xE1\xB9\x93", # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
826             "\xE1\xB9\x94" => "\xE1\xB9\x95", # LATIN CAPITAL LETTER P WITH ACUTE
827             "\xE1\xB9\x96" => "\xE1\xB9\x97", # LATIN CAPITAL LETTER P WITH DOT ABOVE
828             "\xE1\xB9\x98" => "\xE1\xB9\x99", # LATIN CAPITAL LETTER R WITH DOT ABOVE
829             "\xE1\xB9\x9A" => "\xE1\xB9\x9B", # LATIN CAPITAL LETTER R WITH DOT BELOW
830             "\xE1\xB9\x9C" => "\xE1\xB9\x9D", # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
831             "\xE1\xB9\x9E" => "\xE1\xB9\x9F", # LATIN CAPITAL LETTER R WITH LINE BELOW
832             "\xE1\xB9\xA0" => "\xE1\xB9\xA1", # LATIN CAPITAL LETTER S WITH DOT ABOVE
833             "\xE1\xB9\xA2" => "\xE1\xB9\xA3", # LATIN CAPITAL LETTER S WITH DOT BELOW
834             "\xE1\xB9\xA4" => "\xE1\xB9\xA5", # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
835             "\xE1\xB9\xA6" => "\xE1\xB9\xA7", # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
836             "\xE1\xB9\xA8" => "\xE1\xB9\xA9", # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
837             "\xE1\xB9\xAA" => "\xE1\xB9\xAB", # LATIN CAPITAL LETTER T WITH DOT ABOVE
838             "\xE1\xB9\xAC" => "\xE1\xB9\xAD", # LATIN CAPITAL LETTER T WITH DOT BELOW
839             "\xE1\xB9\xAE" => "\xE1\xB9\xAF", # LATIN CAPITAL LETTER T WITH LINE BELOW
840             "\xE1\xB9\xB0" => "\xE1\xB9\xB1", # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
841             "\xE1\xB9\xB2" => "\xE1\xB9\xB3", # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
842             "\xE1\xB9\xB4" => "\xE1\xB9\xB5", # LATIN CAPITAL LETTER U WITH TILDE BELOW
843             "\xE1\xB9\xB6" => "\xE1\xB9\xB7", # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
844             "\xE1\xB9\xB8" => "\xE1\xB9\xB9", # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
845             "\xE1\xB9\xBA" => "\xE1\xB9\xBB", # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
846             "\xE1\xB9\xBC" => "\xE1\xB9\xBD", # LATIN CAPITAL LETTER V WITH TILDE
847             "\xE1\xB9\xBE" => "\xE1\xB9\xBF", # LATIN CAPITAL LETTER V WITH DOT BELOW
848             "\xE1\xBA\x80" => "\xE1\xBA\x81", # LATIN CAPITAL LETTER W WITH GRAVE
849             "\xE1\xBA\x82" => "\xE1\xBA\x83", # LATIN CAPITAL LETTER W WITH ACUTE
850             "\xE1\xBA\x84" => "\xE1\xBA\x85", # LATIN CAPITAL LETTER W WITH DIAERESIS
851             "\xE1\xBA\x86" => "\xE1\xBA\x87", # LATIN CAPITAL LETTER W WITH DOT ABOVE
852             "\xE1\xBA\x88" => "\xE1\xBA\x89", # LATIN CAPITAL LETTER W WITH DOT BELOW
853             "\xE1\xBA\x8A" => "\xE1\xBA\x8B", # LATIN CAPITAL LETTER X WITH DOT ABOVE
854             "\xE1\xBA\x8C" => "\xE1\xBA\x8D", # LATIN CAPITAL LETTER X WITH DIAERESIS
855             "\xE1\xBA\x8E" => "\xE1\xBA\x8F", # LATIN CAPITAL LETTER Y WITH DOT ABOVE
856             "\xE1\xBA\x90" => "\xE1\xBA\x91", # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
857             "\xE1\xBA\x92" => "\xE1\xBA\x93", # LATIN CAPITAL LETTER Z WITH DOT BELOW
858             "\xE1\xBA\x94" => "\xE1\xBA\x95", # LATIN CAPITAL LETTER Z WITH LINE BELOW
859             "\xE1\xBA\x96" => "\x68\xCC\xB1", # LATIN SMALL LETTER H WITH LINE BELOW
860             "\xE1\xBA\x97" => "\x74\xCC\x88", # LATIN SMALL LETTER T WITH DIAERESIS
861             "\xE1\xBA\x98" => "\x77\xCC\x8A", # LATIN SMALL LETTER W WITH RING ABOVE
862             "\xE1\xBA\x99" => "\x79\xCC\x8A", # LATIN SMALL LETTER Y WITH RING ABOVE
863             "\xE1\xBA\x9A" => "\x61\xCA\xBE", # LATIN SMALL LETTER A WITH RIGHT HALF RING
864             "\xE1\xBA\x9B" => "\xE1\xB9\xA1", # LATIN SMALL LETTER LONG S WITH DOT ABOVE
865             "\xE1\xBA\x9E" => "\x73\x73", # LATIN CAPITAL LETTER SHARP S
866             "\xE1\xBA\xA0" => "\xE1\xBA\xA1", # LATIN CAPITAL LETTER A WITH DOT BELOW
867             "\xE1\xBA\xA2" => "\xE1\xBA\xA3", # LATIN CAPITAL LETTER A WITH HOOK ABOVE
868             "\xE1\xBA\xA4" => "\xE1\xBA\xA5", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
869             "\xE1\xBA\xA6" => "\xE1\xBA\xA7", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
870             "\xE1\xBA\xA8" => "\xE1\xBA\xA9", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
871             "\xE1\xBA\xAA" => "\xE1\xBA\xAB", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
872             "\xE1\xBA\xAC" => "\xE1\xBA\xAD", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
873             "\xE1\xBA\xAE" => "\xE1\xBA\xAF", # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
874             "\xE1\xBA\xB0" => "\xE1\xBA\xB1", # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
875             "\xE1\xBA\xB2" => "\xE1\xBA\xB3", # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
876             "\xE1\xBA\xB4" => "\xE1\xBA\xB5", # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
877             "\xE1\xBA\xB6" => "\xE1\xBA\xB7", # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
878             "\xE1\xBA\xB8" => "\xE1\xBA\xB9", # LATIN CAPITAL LETTER E WITH DOT BELOW
879             "\xE1\xBA\xBA" => "\xE1\xBA\xBB", # LATIN CAPITAL LETTER E WITH HOOK ABOVE
880             "\xE1\xBA\xBC" => "\xE1\xBA\xBD", # LATIN CAPITAL LETTER E WITH TILDE
881             "\xE1\xBA\xBE" => "\xE1\xBA\xBF", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
882             "\xE1\xBB\x80" => "\xE1\xBB\x81", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
883             "\xE1\xBB\x82" => "\xE1\xBB\x83", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
884             "\xE1\xBB\x84" => "\xE1\xBB\x85", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
885             "\xE1\xBB\x86" => "\xE1\xBB\x87", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
886             "\xE1\xBB\x88" => "\xE1\xBB\x89", # LATIN CAPITAL LETTER I WITH HOOK ABOVE
887             "\xE1\xBB\x8A" => "\xE1\xBB\x8B", # LATIN CAPITAL LETTER I WITH DOT BELOW
888             "\xE1\xBB\x8C" => "\xE1\xBB\x8D", # LATIN CAPITAL LETTER O WITH DOT BELOW
889             "\xE1\xBB\x8E" => "\xE1\xBB\x8F", # LATIN CAPITAL LETTER O WITH HOOK ABOVE
890             "\xE1\xBB\x90" => "\xE1\xBB\x91", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
891             "\xE1\xBB\x92" => "\xE1\xBB\x93", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
892             "\xE1\xBB\x94" => "\xE1\xBB\x95", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
893             "\xE1\xBB\x96" => "\xE1\xBB\x97", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
894             "\xE1\xBB\x98" => "\xE1\xBB\x99", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
895             "\xE1\xBB\x9A" => "\xE1\xBB\x9B", # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
896             "\xE1\xBB\x9C" => "\xE1\xBB\x9D", # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
897             "\xE1\xBB\x9E" => "\xE1\xBB\x9F", # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
898             "\xE1\xBB\xA0" => "\xE1\xBB\xA1", # LATIN CAPITAL LETTER O WITH HORN AND TILDE
899             "\xE1\xBB\xA2" => "\xE1\xBB\xA3", # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
900             "\xE1\xBB\xA4" => "\xE1\xBB\xA5", # LATIN CAPITAL LETTER U WITH DOT BELOW
901             "\xE1\xBB\xA6" => "\xE1\xBB\xA7", # LATIN CAPITAL LETTER U WITH HOOK ABOVE
902             "\xE1\xBB\xA8" => "\xE1\xBB\xA9", # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
903             "\xE1\xBB\xAA" => "\xE1\xBB\xAB", # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
904             "\xE1\xBB\xAC" => "\xE1\xBB\xAD", # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
905             "\xE1\xBB\xAE" => "\xE1\xBB\xAF", # LATIN CAPITAL LETTER U WITH HORN AND TILDE
906             "\xE1\xBB\xB0" => "\xE1\xBB\xB1", # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
907             "\xE1\xBB\xB2" => "\xE1\xBB\xB3", # LATIN CAPITAL LETTER Y WITH GRAVE
908             "\xE1\xBB\xB4" => "\xE1\xBB\xB5", # LATIN CAPITAL LETTER Y WITH DOT BELOW
909             "\xE1\xBB\xB6" => "\xE1\xBB\xB7", # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
910             "\xE1\xBB\xB8" => "\xE1\xBB\xB9", # LATIN CAPITAL LETTER Y WITH TILDE
911             "\xE1\xBB\xBA" => "\xE1\xBB\xBB", # LATIN CAPITAL LETTER MIDDLE-WELSH LL
912             "\xE1\xBB\xBC" => "\xE1\xBB\xBD", # LATIN CAPITAL LETTER MIDDLE-WELSH V
913             "\xE1\xBB\xBE" => "\xE1\xBB\xBF", # LATIN CAPITAL LETTER Y WITH LOOP
914             "\xE1\xBC\x88" => "\xE1\xBC\x80", # GREEK CAPITAL LETTER ALPHA WITH PSILI
915             "\xE1\xBC\x89" => "\xE1\xBC\x81", # GREEK CAPITAL LETTER ALPHA WITH DASIA
916             "\xE1\xBC\x8A" => "\xE1\xBC\x82", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
917             "\xE1\xBC\x8B" => "\xE1\xBC\x83", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
918             "\xE1\xBC\x8C" => "\xE1\xBC\x84", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
919             "\xE1\xBC\x8D" => "\xE1\xBC\x85", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
920             "\xE1\xBC\x8E" => "\xE1\xBC\x86", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
921             "\xE1\xBC\x8F" => "\xE1\xBC\x87", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
922             "\xE1\xBC\x98" => "\xE1\xBC\x90", # GREEK CAPITAL LETTER EPSILON WITH PSILI
923             "\xE1\xBC\x99" => "\xE1\xBC\x91", # GREEK CAPITAL LETTER EPSILON WITH DASIA
924             "\xE1\xBC\x9A" => "\xE1\xBC\x92", # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
925             "\xE1\xBC\x9B" => "\xE1\xBC\x93", # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
926             "\xE1\xBC\x9C" => "\xE1\xBC\x94", # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
927             "\xE1\xBC\x9D" => "\xE1\xBC\x95", # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
928             "\xE1\xBC\xA8" => "\xE1\xBC\xA0", # GREEK CAPITAL LETTER ETA WITH PSILI
929             "\xE1\xBC\xA9" => "\xE1\xBC\xA1", # GREEK CAPITAL LETTER ETA WITH DASIA
930             "\xE1\xBC\xAA" => "\xE1\xBC\xA2", # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
931             "\xE1\xBC\xAB" => "\xE1\xBC\xA3", # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
932             "\xE1\xBC\xAC" => "\xE1\xBC\xA4", # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
933             "\xE1\xBC\xAD" => "\xE1\xBC\xA5", # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
934             "\xE1\xBC\xAE" => "\xE1\xBC\xA6", # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
935             "\xE1\xBC\xAF" => "\xE1\xBC\xA7", # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
936             "\xE1\xBC\xB8" => "\xE1\xBC\xB0", # GREEK CAPITAL LETTER IOTA WITH PSILI
937             "\xE1\xBC\xB9" => "\xE1\xBC\xB1", # GREEK CAPITAL LETTER IOTA WITH DASIA
938             "\xE1\xBC\xBA" => "\xE1\xBC\xB2", # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
939             "\xE1\xBC\xBB" => "\xE1\xBC\xB3", # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
940             "\xE1\xBC\xBC" => "\xE1\xBC\xB4", # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
941             "\xE1\xBC\xBD" => "\xE1\xBC\xB5", # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
942             "\xE1\xBC\xBE" => "\xE1\xBC\xB6", # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
943             "\xE1\xBC\xBF" => "\xE1\xBC\xB7", # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
944             "\xE1\xBD\x88" => "\xE1\xBD\x80", # GREEK CAPITAL LETTER OMICRON WITH PSILI
945             "\xE1\xBD\x89" => "\xE1\xBD\x81", # GREEK CAPITAL LETTER OMICRON WITH DASIA
946             "\xE1\xBD\x8A" => "\xE1\xBD\x82", # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
947             "\xE1\xBD\x8B" => "\xE1\xBD\x83", # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
948             "\xE1\xBD\x8C" => "\xE1\xBD\x84", # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
949             "\xE1\xBD\x8D" => "\xE1\xBD\x85", # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
950             "\xE1\xBD\x90" => "\xCF\x85\xCC\x93", # GREEK SMALL LETTER UPSILON WITH PSILI
951             "\xE1\xBD\x92" => "\xCF\x85\xCC\x93\xCC\x80", # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
952             "\xE1\xBD\x94" => "\xCF\x85\xCC\x93\xCC\x81", # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
953             "\xE1\xBD\x96" => "\xCF\x85\xCC\x93\xCD\x82", # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
954             "\xE1\xBD\x99" => "\xE1\xBD\x91", # GREEK CAPITAL LETTER UPSILON WITH DASIA
955             "\xE1\xBD\x9B" => "\xE1\xBD\x93", # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
956             "\xE1\xBD\x9D" => "\xE1\xBD\x95", # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
957             "\xE1\xBD\x9F" => "\xE1\xBD\x97", # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
958             "\xE1\xBD\xA8" => "\xE1\xBD\xA0", # GREEK CAPITAL LETTER OMEGA WITH PSILI
959             "\xE1\xBD\xA9" => "\xE1\xBD\xA1", # GREEK CAPITAL LETTER OMEGA WITH DASIA
960             "\xE1\xBD\xAA" => "\xE1\xBD\xA2", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
961             "\xE1\xBD\xAB" => "\xE1\xBD\xA3", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
962             "\xE1\xBD\xAC" => "\xE1\xBD\xA4", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
963             "\xE1\xBD\xAD" => "\xE1\xBD\xA5", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
964             "\xE1\xBD\xAE" => "\xE1\xBD\xA6", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
965             "\xE1\xBD\xAF" => "\xE1\xBD\xA7", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
966             "\xE1\xBE\x80" => "\xE1\xBC\x80\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
967             "\xE1\xBE\x81" => "\xE1\xBC\x81\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
968             "\xE1\xBE\x82" => "\xE1\xBC\x82\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
969             "\xE1\xBE\x83" => "\xE1\xBC\x83\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
970             "\xE1\xBE\x84" => "\xE1\xBC\x84\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
971             "\xE1\xBE\x85" => "\xE1\xBC\x85\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
972             "\xE1\xBE\x86" => "\xE1\xBC\x86\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
973             "\xE1\xBE\x87" => "\xE1\xBC\x87\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
974             "\xE1\xBE\x88" => "\xE1\xBC\x80\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
975             "\xE1\xBE\x89" => "\xE1\xBC\x81\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
976             "\xE1\xBE\x8A" => "\xE1\xBC\x82\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
977             "\xE1\xBE\x8B" => "\xE1\xBC\x83\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
978             "\xE1\xBE\x8C" => "\xE1\xBC\x84\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
979             "\xE1\xBE\x8D" => "\xE1\xBC\x85\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
980             "\xE1\xBE\x8E" => "\xE1\xBC\x86\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
981             "\xE1\xBE\x8F" => "\xE1\xBC\x87\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
982             "\xE1\xBE\x90" => "\xE1\xBC\xA0\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
983             "\xE1\xBE\x91" => "\xE1\xBC\xA1\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
984             "\xE1\xBE\x92" => "\xE1\xBC\xA2\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
985             "\xE1\xBE\x93" => "\xE1\xBC\xA3\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
986             "\xE1\xBE\x94" => "\xE1\xBC\xA4\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
987             "\xE1\xBE\x95" => "\xE1\xBC\xA5\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
988             "\xE1\xBE\x96" => "\xE1\xBC\xA6\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
989             "\xE1\xBE\x97" => "\xE1\xBC\xA7\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
990             "\xE1\xBE\x98" => "\xE1\xBC\xA0\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
991             "\xE1\xBE\x99" => "\xE1\xBC\xA1\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
992             "\xE1\xBE\x9A" => "\xE1\xBC\xA2\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
993             "\xE1\xBE\x9B" => "\xE1\xBC\xA3\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
994             "\xE1\xBE\x9C" => "\xE1\xBC\xA4\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
995             "\xE1\xBE\x9D" => "\xE1\xBC\xA5\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
996             "\xE1\xBE\x9E" => "\xE1\xBC\xA6\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
997             "\xE1\xBE\x9F" => "\xE1\xBC\xA7\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
998             "\xE1\xBE\xA0" => "\xE1\xBD\xA0\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
999             "\xE1\xBE\xA1" => "\xE1\xBD\xA1\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
1000             "\xE1\xBE\xA2" => "\xE1\xBD\xA2\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
1001             "\xE1\xBE\xA3" => "\xE1\xBD\xA3\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
1002             "\xE1\xBE\xA4" => "\xE1\xBD\xA4\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
1003             "\xE1\xBE\xA5" => "\xE1\xBD\xA5\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
1004             "\xE1\xBE\xA6" => "\xE1\xBD\xA6\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
1005             "\xE1\xBE\xA7" => "\xE1\xBD\xA7\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
1006             "\xE1\xBE\xA8" => "\xE1\xBD\xA0\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
1007             "\xE1\xBE\xA9" => "\xE1\xBD\xA1\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
1008             "\xE1\xBE\xAA" => "\xE1\xBD\xA2\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
1009             "\xE1\xBE\xAB" => "\xE1\xBD\xA3\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
1010             "\xE1\xBE\xAC" => "\xE1\xBD\xA4\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
1011             "\xE1\xBE\xAD" => "\xE1\xBD\xA5\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
1012             "\xE1\xBE\xAE" => "\xE1\xBD\xA6\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
1013             "\xE1\xBE\xAF" => "\xE1\xBD\xA7\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
1014             "\xE1\xBE\xB2" => "\xE1\xBD\xB0\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
1015             "\xE1\xBE\xB3" => "\xCE\xB1\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
1016             "\xE1\xBE\xB4" => "\xCE\xAC\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
1017             "\xE1\xBE\xB6" => "\xCE\xB1\xCD\x82", # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
1018             "\xE1\xBE\xB7" => "\xCE\xB1\xCD\x82\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
1019             "\xE1\xBE\xB8" => "\xE1\xBE\xB0", # GREEK CAPITAL LETTER ALPHA WITH VRACHY
1020             "\xE1\xBE\xB9" => "\xE1\xBE\xB1", # GREEK CAPITAL LETTER ALPHA WITH MACRON
1021             "\xE1\xBE\xBA" => "\xE1\xBD\xB0", # GREEK CAPITAL LETTER ALPHA WITH VARIA
1022             "\xE1\xBE\xBB" => "\xE1\xBD\xB1", # GREEK CAPITAL LETTER ALPHA WITH OXIA
1023             "\xE1\xBE\xBC" => "\xCE\xB1\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
1024             "\xE1\xBE\xBE" => "\xCE\xB9", # GREEK PROSGEGRAMMENI
1025             "\xE1\xBF\x82" => "\xE1\xBD\xB4\xCE\xB9", # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
1026             "\xE1\xBF\x83" => "\xCE\xB7\xCE\xB9", # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
1027             "\xE1\xBF\x84" => "\xCE\xAE\xCE\xB9", # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
1028             "\xE1\xBF\x86" => "\xCE\xB7\xCD\x82", # GREEK SMALL LETTER ETA WITH PERISPOMENI
1029             "\xE1\xBF\x87" => "\xCE\xB7\xCD\x82\xCE\xB9", # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
1030             "\xE1\xBF\x88" => "\xE1\xBD\xB2", # GREEK CAPITAL LETTER EPSILON WITH VARIA
1031             "\xE1\xBF\x89" => "\xE1\xBD\xB3", # GREEK CAPITAL LETTER EPSILON WITH OXIA
1032             "\xE1\xBF\x8A" => "\xE1\xBD\xB4", # GREEK CAPITAL LETTER ETA WITH VARIA
1033             "\xE1\xBF\x8B" => "\xE1\xBD\xB5", # GREEK CAPITAL LETTER ETA WITH OXIA
1034             "\xE1\xBF\x8C" => "\xCE\xB7\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
1035             "\xE1\xBF\x92" => "\xCE\xB9\xCC\x88\xCC\x80", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
1036             "\xE1\xBF\x93" => "\xCE\xB9\xCC\x88\xCC\x81", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
1037             "\xE1\xBF\x96" => "\xCE\xB9\xCD\x82", # GREEK SMALL LETTER IOTA WITH PERISPOMENI
1038             "\xE1\xBF\x97" => "\xCE\xB9\xCC\x88\xCD\x82", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
1039             "\xE1\xBF\x98" => "\xE1\xBF\x90", # GREEK CAPITAL LETTER IOTA WITH VRACHY
1040             "\xE1\xBF\x99" => "\xE1\xBF\x91", # GREEK CAPITAL LETTER IOTA WITH MACRON
1041             "\xE1\xBF\x9A" => "\xE1\xBD\xB6", # GREEK CAPITAL LETTER IOTA WITH VARIA
1042             "\xE1\xBF\x9B" => "\xE1\xBD\xB7", # GREEK CAPITAL LETTER IOTA WITH OXIA
1043             "\xE1\xBF\xA2" => "\xCF\x85\xCC\x88\xCC\x80", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
1044             "\xE1\xBF\xA3" => "\xCF\x85\xCC\x88\xCC\x81", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
1045             "\xE1\xBF\xA4" => "\xCF\x81\xCC\x93", # GREEK SMALL LETTER RHO WITH PSILI
1046             "\xE1\xBF\xA6" => "\xCF\x85\xCD\x82", # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
1047             "\xE1\xBF\xA7" => "\xCF\x85\xCC\x88\xCD\x82", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
1048             "\xE1\xBF\xA8" => "\xE1\xBF\xA0", # GREEK CAPITAL LETTER UPSILON WITH VRACHY
1049             "\xE1\xBF\xA9" => "\xE1\xBF\xA1", # GREEK CAPITAL LETTER UPSILON WITH MACRON
1050             "\xE1\xBF\xAA" => "\xE1\xBD\xBA", # GREEK CAPITAL LETTER UPSILON WITH VARIA
1051             "\xE1\xBF\xAB" => "\xE1\xBD\xBB", # GREEK CAPITAL LETTER UPSILON WITH OXIA
1052             "\xE1\xBF\xAC" => "\xE1\xBF\xA5", # GREEK CAPITAL LETTER RHO WITH DASIA
1053             "\xE1\xBF\xB2" => "\xE1\xBD\xBC\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
1054             "\xE1\xBF\xB3" => "\xCF\x89\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
1055             "\xE1\xBF\xB4" => "\xCF\x8E\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
1056             "\xE1\xBF\xB6" => "\xCF\x89\xCD\x82", # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
1057             "\xE1\xBF\xB7" => "\xCF\x89\xCD\x82\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
1058             "\xE1\xBF\xB8" => "\xE1\xBD\xB8", # GREEK CAPITAL LETTER OMICRON WITH VARIA
1059             "\xE1\xBF\xB9" => "\xE1\xBD\xB9", # GREEK CAPITAL LETTER OMICRON WITH OXIA
1060             "\xE1\xBF\xBA" => "\xE1\xBD\xBC", # GREEK CAPITAL LETTER OMEGA WITH VARIA
1061             "\xE1\xBF\xBB" => "\xE1\xBD\xBD", # GREEK CAPITAL LETTER OMEGA WITH OXIA
1062             "\xE1\xBF\xBC" => "\xCF\x89\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
1063             "\xE2\x84\xA6" => "\xCF\x89", # OHM SIGN
1064             "\xE2\x84\xAA" => "\x6B", # KELVIN SIGN
1065             "\xE2\x84\xAB" => "\xC3\xA5", # ANGSTROM SIGN
1066             "\xE2\x84\xB2" => "\xE2\x85\x8E", # TURNED CAPITAL F
1067             "\xE2\x85\xA0" => "\xE2\x85\xB0", # ROMAN NUMERAL ONE
1068             "\xE2\x85\xA1" => "\xE2\x85\xB1", # ROMAN NUMERAL TWO
1069             "\xE2\x85\xA2" => "\xE2\x85\xB2", # ROMAN NUMERAL THREE
1070             "\xE2\x85\xA3" => "\xE2\x85\xB3", # ROMAN NUMERAL FOUR
1071             "\xE2\x85\xA4" => "\xE2\x85\xB4", # ROMAN NUMERAL FIVE
1072             "\xE2\x85\xA5" => "\xE2\x85\xB5", # ROMAN NUMERAL SIX
1073             "\xE2\x85\xA6" => "\xE2\x85\xB6", # ROMAN NUMERAL SEVEN
1074             "\xE2\x85\xA7" => "\xE2\x85\xB7", # ROMAN NUMERAL EIGHT
1075             "\xE2\x85\xA8" => "\xE2\x85\xB8", # ROMAN NUMERAL NINE
1076             "\xE2\x85\xA9" => "\xE2\x85\xB9", # ROMAN NUMERAL TEN
1077             "\xE2\x85\xAA" => "\xE2\x85\xBA", # ROMAN NUMERAL ELEVEN
1078             "\xE2\x85\xAB" => "\xE2\x85\xBB", # ROMAN NUMERAL TWELVE
1079             "\xE2\x85\xAC" => "\xE2\x85\xBC", # ROMAN NUMERAL FIFTY
1080             "\xE2\x85\xAD" => "\xE2\x85\xBD", # ROMAN NUMERAL ONE HUNDRED
1081             "\xE2\x85\xAE" => "\xE2\x85\xBE", # ROMAN NUMERAL FIVE HUNDRED
1082             "\xE2\x85\xAF" => "\xE2\x85\xBF", # ROMAN NUMERAL ONE THOUSAND
1083             "\xE2\x86\x83" => "\xE2\x86\x84", # ROMAN NUMERAL REVERSED ONE HUNDRED
1084             "\xE2\x92\xB6" => "\xE2\x93\x90", # CIRCLED LATIN CAPITAL LETTER A
1085             "\xE2\x92\xB7" => "\xE2\x93\x91", # CIRCLED LATIN CAPITAL LETTER B
1086             "\xE2\x92\xB8" => "\xE2\x93\x92", # CIRCLED LATIN CAPITAL LETTER C
1087             "\xE2\x92\xB9" => "\xE2\x93\x93", # CIRCLED LATIN CAPITAL LETTER D
1088             "\xE2\x92\xBA" => "\xE2\x93\x94", # CIRCLED LATIN CAPITAL LETTER E
1089             "\xE2\x92\xBB" => "\xE2\x93\x95", # CIRCLED LATIN CAPITAL LETTER F
1090             "\xE2\x92\xBC" => "\xE2\x93\x96", # CIRCLED LATIN CAPITAL LETTER G
1091             "\xE2\x92\xBD" => "\xE2\x93\x97", # CIRCLED LATIN CAPITAL LETTER H
1092             "\xE2\x92\xBE" => "\xE2\x93\x98", # CIRCLED LATIN CAPITAL LETTER I
1093             "\xE2\x92\xBF" => "\xE2\x93\x99", # CIRCLED LATIN CAPITAL LETTER J
1094             "\xE2\x93\x80" => "\xE2\x93\x9A", # CIRCLED LATIN CAPITAL LETTER K
1095             "\xE2\x93\x81" => "\xE2\x93\x9B", # CIRCLED LATIN CAPITAL LETTER L
1096             "\xE2\x93\x82" => "\xE2\x93\x9C", # CIRCLED LATIN CAPITAL LETTER M
1097             "\xE2\x93\x83" => "\xE2\x93\x9D", # CIRCLED LATIN CAPITAL LETTER N
1098             "\xE2\x93\x84" => "\xE2\x93\x9E", # CIRCLED LATIN CAPITAL LETTER O
1099             "\xE2\x93\x85" => "\xE2\x93\x9F", # CIRCLED LATIN CAPITAL LETTER P
1100             "\xE2\x93\x86" => "\xE2\x93\xA0", # CIRCLED LATIN CAPITAL LETTER Q
1101             "\xE2\x93\x87" => "\xE2\x93\xA1", # CIRCLED LATIN CAPITAL LETTER R
1102             "\xE2\x93\x88" => "\xE2\x93\xA2", # CIRCLED LATIN CAPITAL LETTER S
1103             "\xE2\x93\x89" => "\xE2\x93\xA3", # CIRCLED LATIN CAPITAL LETTER T
1104             "\xE2\x93\x8A" => "\xE2\x93\xA4", # CIRCLED LATIN CAPITAL LETTER U
1105             "\xE2\x93\x8B" => "\xE2\x93\xA5", # CIRCLED LATIN CAPITAL LETTER V
1106             "\xE2\x93\x8C" => "\xE2\x93\xA6", # CIRCLED LATIN CAPITAL LETTER W
1107             "\xE2\x93\x8D" => "\xE2\x93\xA7", # CIRCLED LATIN CAPITAL LETTER X
1108             "\xE2\x93\x8E" => "\xE2\x93\xA8", # CIRCLED LATIN CAPITAL LETTER Y
1109             "\xE2\x93\x8F" => "\xE2\x93\xA9", # CIRCLED LATIN CAPITAL LETTER Z
1110             "\xE2\xB0\x80" => "\xE2\xB0\xB0", # GLAGOLITIC CAPITAL LETTER AZU
1111             "\xE2\xB0\x81" => "\xE2\xB0\xB1", # GLAGOLITIC CAPITAL LETTER BUKY
1112             "\xE2\xB0\x82" => "\xE2\xB0\xB2", # GLAGOLITIC CAPITAL LETTER VEDE
1113             "\xE2\xB0\x83" => "\xE2\xB0\xB3", # GLAGOLITIC CAPITAL LETTER GLAGOLI
1114             "\xE2\xB0\x84" => "\xE2\xB0\xB4", # GLAGOLITIC CAPITAL LETTER DOBRO
1115             "\xE2\xB0\x85" => "\xE2\xB0\xB5", # GLAGOLITIC CAPITAL LETTER YESTU
1116             "\xE2\xB0\x86" => "\xE2\xB0\xB6", # GLAGOLITIC CAPITAL LETTER ZHIVETE
1117             "\xE2\xB0\x87" => "\xE2\xB0\xB7", # GLAGOLITIC CAPITAL LETTER DZELO
1118             "\xE2\xB0\x88" => "\xE2\xB0\xB8", # GLAGOLITIC CAPITAL LETTER ZEMLJA
1119             "\xE2\xB0\x89" => "\xE2\xB0\xB9", # GLAGOLITIC CAPITAL LETTER IZHE
1120             "\xE2\xB0\x8A" => "\xE2\xB0\xBA", # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
1121             "\xE2\xB0\x8B" => "\xE2\xB0\xBB", # GLAGOLITIC CAPITAL LETTER I
1122             "\xE2\xB0\x8C" => "\xE2\xB0\xBC", # GLAGOLITIC CAPITAL LETTER DJERVI
1123             "\xE2\xB0\x8D" => "\xE2\xB0\xBD", # GLAGOLITIC CAPITAL LETTER KAKO
1124             "\xE2\xB0\x8E" => "\xE2\xB0\xBE", # GLAGOLITIC CAPITAL LETTER LJUDIJE
1125             "\xE2\xB0\x8F" => "\xE2\xB0\xBF", # GLAGOLITIC CAPITAL LETTER MYSLITE
1126             "\xE2\xB0\x90" => "\xE2\xB1\x80", # GLAGOLITIC CAPITAL LETTER NASHI
1127             "\xE2\xB0\x91" => "\xE2\xB1\x81", # GLAGOLITIC CAPITAL LETTER ONU
1128             "\xE2\xB0\x92" => "\xE2\xB1\x82", # GLAGOLITIC CAPITAL LETTER POKOJI
1129             "\xE2\xB0\x93" => "\xE2\xB1\x83", # GLAGOLITIC CAPITAL LETTER RITSI
1130             "\xE2\xB0\x94" => "\xE2\xB1\x84", # GLAGOLITIC CAPITAL LETTER SLOVO
1131             "\xE2\xB0\x95" => "\xE2\xB1\x85", # GLAGOLITIC CAPITAL LETTER TVRIDO
1132             "\xE2\xB0\x96" => "\xE2\xB1\x86", # GLAGOLITIC CAPITAL LETTER UKU
1133             "\xE2\xB0\x97" => "\xE2\xB1\x87", # GLAGOLITIC CAPITAL LETTER FRITU
1134             "\xE2\xB0\x98" => "\xE2\xB1\x88", # GLAGOLITIC CAPITAL LETTER HERU
1135             "\xE2\xB0\x99" => "\xE2\xB1\x89", # GLAGOLITIC CAPITAL LETTER OTU
1136             "\xE2\xB0\x9A" => "\xE2\xB1\x8A", # GLAGOLITIC CAPITAL LETTER PE
1137             "\xE2\xB0\x9B" => "\xE2\xB1\x8B", # GLAGOLITIC CAPITAL LETTER SHTA
1138             "\xE2\xB0\x9C" => "\xE2\xB1\x8C", # GLAGOLITIC CAPITAL LETTER TSI
1139             "\xE2\xB0\x9D" => "\xE2\xB1\x8D", # GLAGOLITIC CAPITAL LETTER CHRIVI
1140             "\xE2\xB0\x9E" => "\xE2\xB1\x8E", # GLAGOLITIC CAPITAL LETTER SHA
1141             "\xE2\xB0\x9F" => "\xE2\xB1\x8F", # GLAGOLITIC CAPITAL LETTER YERU
1142             "\xE2\xB0\xA0" => "\xE2\xB1\x90", # GLAGOLITIC CAPITAL LETTER YERI
1143             "\xE2\xB0\xA1" => "\xE2\xB1\x91", # GLAGOLITIC CAPITAL LETTER YATI
1144             "\xE2\xB0\xA2" => "\xE2\xB1\x92", # GLAGOLITIC CAPITAL LETTER SPIDERY HA
1145             "\xE2\xB0\xA3" => "\xE2\xB1\x93", # GLAGOLITIC CAPITAL LETTER YU
1146             "\xE2\xB0\xA4" => "\xE2\xB1\x94", # GLAGOLITIC CAPITAL LETTER SMALL YUS
1147             "\xE2\xB0\xA5" => "\xE2\xB1\x95", # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
1148             "\xE2\xB0\xA6" => "\xE2\xB1\x96", # GLAGOLITIC CAPITAL LETTER YO
1149             "\xE2\xB0\xA7" => "\xE2\xB1\x97", # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
1150             "\xE2\xB0\xA8" => "\xE2\xB1\x98", # GLAGOLITIC CAPITAL LETTER BIG YUS
1151             "\xE2\xB0\xA9" => "\xE2\xB1\x99", # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
1152             "\xE2\xB0\xAA" => "\xE2\xB1\x9A", # GLAGOLITIC CAPITAL LETTER FITA
1153             "\xE2\xB0\xAB" => "\xE2\xB1\x9B", # GLAGOLITIC CAPITAL LETTER IZHITSA
1154             "\xE2\xB0\xAC" => "\xE2\xB1\x9C", # GLAGOLITIC CAPITAL LETTER SHTAPIC
1155             "\xE2\xB0\xAD" => "\xE2\xB1\x9D", # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
1156             "\xE2\xB0\xAE" => "\xE2\xB1\x9E", # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
1157             "\xE2\xB1\xA0" => "\xE2\xB1\xA1", # LATIN CAPITAL LETTER L WITH DOUBLE BAR
1158             "\xE2\xB1\xA2" => "\xC9\xAB", # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
1159             "\xE2\xB1\xA3" => "\xE1\xB5\xBD", # LATIN CAPITAL LETTER P WITH STROKE
1160             "\xE2\xB1\xA4" => "\xC9\xBD", # LATIN CAPITAL LETTER R WITH TAIL
1161             "\xE2\xB1\xA7" => "\xE2\xB1\xA8", # LATIN CAPITAL LETTER H WITH DESCENDER
1162             "\xE2\xB1\xA9" => "\xE2\xB1\xAA", # LATIN CAPITAL LETTER K WITH DESCENDER
1163             "\xE2\xB1\xAB" => "\xE2\xB1\xAC", # LATIN CAPITAL LETTER Z WITH DESCENDER
1164             "\xE2\xB1\xAD" => "\xC9\x91", # LATIN CAPITAL LETTER ALPHA
1165             "\xE2\xB1\xAE" => "\xC9\xB1", # LATIN CAPITAL LETTER M WITH HOOK
1166             "\xE2\xB1\xAF" => "\xC9\x90", # LATIN CAPITAL LETTER TURNED A
1167             "\xE2\xB1\xB0" => "\xC9\x92", # LATIN CAPITAL LETTER TURNED ALPHA
1168             "\xE2\xB1\xB2" => "\xE2\xB1\xB3", # LATIN CAPITAL LETTER W WITH HOOK
1169             "\xE2\xB1\xB5" => "\xE2\xB1\xB6", # LATIN CAPITAL LETTER HALF H
1170             "\xE2\xB1\xBE" => "\xC8\xBF", # LATIN CAPITAL LETTER S WITH SWASH TAIL
1171             "\xE2\xB1\xBF" => "\xC9\x80", # LATIN CAPITAL LETTER Z WITH SWASH TAIL
1172             "\xE2\xB2\x80" => "\xE2\xB2\x81", # COPTIC CAPITAL LETTER ALFA
1173             "\xE2\xB2\x82" => "\xE2\xB2\x83", # COPTIC CAPITAL LETTER VIDA
1174             "\xE2\xB2\x84" => "\xE2\xB2\x85", # COPTIC CAPITAL LETTER GAMMA
1175             "\xE2\xB2\x86" => "\xE2\xB2\x87", # COPTIC CAPITAL LETTER DALDA
1176             "\xE2\xB2\x88" => "\xE2\xB2\x89", # COPTIC CAPITAL LETTER EIE
1177             "\xE2\xB2\x8A" => "\xE2\xB2\x8B", # COPTIC CAPITAL LETTER SOU
1178             "\xE2\xB2\x8C" => "\xE2\xB2\x8D", # COPTIC CAPITAL LETTER ZATA
1179             "\xE2\xB2\x8E" => "\xE2\xB2\x8F", # COPTIC CAPITAL LETTER HATE
1180             "\xE2\xB2\x90" => "\xE2\xB2\x91", # COPTIC CAPITAL LETTER THETHE
1181             "\xE2\xB2\x92" => "\xE2\xB2\x93", # COPTIC CAPITAL LETTER IAUDA
1182             "\xE2\xB2\x94" => "\xE2\xB2\x95", # COPTIC CAPITAL LETTER KAPA
1183             "\xE2\xB2\x96" => "\xE2\xB2\x97", # COPTIC CAPITAL LETTER LAULA
1184             "\xE2\xB2\x98" => "\xE2\xB2\x99", # COPTIC CAPITAL LETTER MI
1185             "\xE2\xB2\x9A" => "\xE2\xB2\x9B", # COPTIC CAPITAL LETTER NI
1186             "\xE2\xB2\x9C" => "\xE2\xB2\x9D", # COPTIC CAPITAL LETTER KSI
1187             "\xE2\xB2\x9E" => "\xE2\xB2\x9F", # COPTIC CAPITAL LETTER O
1188             "\xE2\xB2\xA0" => "\xE2\xB2\xA1", # COPTIC CAPITAL LETTER PI
1189             "\xE2\xB2\xA2" => "\xE2\xB2\xA3", # COPTIC CAPITAL LETTER RO
1190             "\xE2\xB2\xA4" => "\xE2\xB2\xA5", # COPTIC CAPITAL LETTER SIMA
1191             "\xE2\xB2\xA6" => "\xE2\xB2\xA7", # COPTIC CAPITAL LETTER TAU
1192             "\xE2\xB2\xA8" => "\xE2\xB2\xA9", # COPTIC CAPITAL LETTER UA
1193             "\xE2\xB2\xAA" => "\xE2\xB2\xAB", # COPTIC CAPITAL LETTER FI
1194             "\xE2\xB2\xAC" => "\xE2\xB2\xAD", # COPTIC CAPITAL LETTER KHI
1195             "\xE2\xB2\xAE" => "\xE2\xB2\xAF", # COPTIC CAPITAL LETTER PSI
1196             "\xE2\xB2\xB0" => "\xE2\xB2\xB1", # COPTIC CAPITAL LETTER OOU
1197             "\xE2\xB2\xB2" => "\xE2\xB2\xB3", # COPTIC CAPITAL LETTER DIALECT-P ALEF
1198             "\xE2\xB2\xB4" => "\xE2\xB2\xB5", # COPTIC CAPITAL LETTER OLD COPTIC AIN
1199             "\xE2\xB2\xB6" => "\xE2\xB2\xB7", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
1200             "\xE2\xB2\xB8" => "\xE2\xB2\xB9", # COPTIC CAPITAL LETTER DIALECT-P KAPA
1201             "\xE2\xB2\xBA" => "\xE2\xB2\xBB", # COPTIC CAPITAL LETTER DIALECT-P NI
1202             "\xE2\xB2\xBC" => "\xE2\xB2\xBD", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
1203             "\xE2\xB2\xBE" => "\xE2\xB2\xBF", # COPTIC CAPITAL LETTER OLD COPTIC OOU
1204             "\xE2\xB3\x80" => "\xE2\xB3\x81", # COPTIC CAPITAL LETTER SAMPI
1205             "\xE2\xB3\x82" => "\xE2\xB3\x83", # COPTIC CAPITAL LETTER CROSSED SHEI
1206             "\xE2\xB3\x84" => "\xE2\xB3\x85", # COPTIC CAPITAL LETTER OLD COPTIC SHEI
1207             "\xE2\xB3\x86" => "\xE2\xB3\x87", # COPTIC CAPITAL LETTER OLD COPTIC ESH
1208             "\xE2\xB3\x88" => "\xE2\xB3\x89", # COPTIC CAPITAL LETTER AKHMIMIC KHEI
1209             "\xE2\xB3\x8A" => "\xE2\xB3\x8B", # COPTIC CAPITAL LETTER DIALECT-P HORI
1210             "\xE2\xB3\x8C" => "\xE2\xB3\x8D", # COPTIC CAPITAL LETTER OLD COPTIC HORI
1211             "\xE2\xB3\x8E" => "\xE2\xB3\x8F", # COPTIC CAPITAL LETTER OLD COPTIC HA
1212             "\xE2\xB3\x90" => "\xE2\xB3\x91", # COPTIC CAPITAL LETTER L-SHAPED HA
1213             "\xE2\xB3\x92" => "\xE2\xB3\x93", # COPTIC CAPITAL LETTER OLD COPTIC HEI
1214             "\xE2\xB3\x94" => "\xE2\xB3\x95", # COPTIC CAPITAL LETTER OLD COPTIC HAT
1215             "\xE2\xB3\x96" => "\xE2\xB3\x97", # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
1216             "\xE2\xB3\x98" => "\xE2\xB3\x99", # COPTIC CAPITAL LETTER OLD COPTIC DJA
1217             "\xE2\xB3\x9A" => "\xE2\xB3\x9B", # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
1218             "\xE2\xB3\x9C" => "\xE2\xB3\x9D", # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
1219             "\xE2\xB3\x9E" => "\xE2\xB3\x9F", # COPTIC CAPITAL LETTER OLD NUBIAN NGI
1220             "\xE2\xB3\xA0" => "\xE2\xB3\xA1", # COPTIC CAPITAL LETTER OLD NUBIAN NYI
1221             "\xE2\xB3\xA2" => "\xE2\xB3\xA3", # COPTIC CAPITAL LETTER OLD NUBIAN WAU
1222             "\xE2\xB3\xAB" => "\xE2\xB3\xAC", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
1223             "\xE2\xB3\xAD" => "\xE2\xB3\xAE", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
1224             "\xE2\xB3\xB2" => "\xE2\xB3\xB3", # COPTIC CAPITAL LETTER BOHAIRIC KHEI
1225             "\xEA\x99\x80" => "\xEA\x99\x81", # CYRILLIC CAPITAL LETTER ZEMLYA
1226             "\xEA\x99\x82" => "\xEA\x99\x83", # CYRILLIC CAPITAL LETTER DZELO
1227             "\xEA\x99\x84" => "\xEA\x99\x85", # CYRILLIC CAPITAL LETTER REVERSED DZE
1228             "\xEA\x99\x86" => "\xEA\x99\x87", # CYRILLIC CAPITAL LETTER IOTA
1229             "\xEA\x99\x88" => "\xEA\x99\x89", # CYRILLIC CAPITAL LETTER DJERV
1230             "\xEA\x99\x8A" => "\xEA\x99\x8B", # CYRILLIC CAPITAL LETTER MONOGRAPH UK
1231             "\xEA\x99\x8C" => "\xEA\x99\x8D", # CYRILLIC CAPITAL LETTER BROAD OMEGA
1232             "\xEA\x99\x8E" => "\xEA\x99\x8F", # CYRILLIC CAPITAL LETTER NEUTRAL YER
1233             "\xEA\x99\x90" => "\xEA\x99\x91", # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
1234             "\xEA\x99\x92" => "\xEA\x99\x93", # CYRILLIC CAPITAL LETTER IOTIFIED YAT
1235             "\xEA\x99\x94" => "\xEA\x99\x95", # CYRILLIC CAPITAL LETTER REVERSED YU
1236             "\xEA\x99\x96" => "\xEA\x99\x97", # CYRILLIC CAPITAL LETTER IOTIFIED A
1237             "\xEA\x99\x98" => "\xEA\x99\x99", # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
1238             "\xEA\x99\x9A" => "\xEA\x99\x9B", # CYRILLIC CAPITAL LETTER BLENDED YUS
1239             "\xEA\x99\x9C" => "\xEA\x99\x9D", # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
1240             "\xEA\x99\x9E" => "\xEA\x99\x9F", # CYRILLIC CAPITAL LETTER YN
1241             "\xEA\x99\xA0" => "\xEA\x99\xA1", # CYRILLIC CAPITAL LETTER REVERSED TSE
1242             "\xEA\x99\xA2" => "\xEA\x99\xA3", # CYRILLIC CAPITAL LETTER SOFT DE
1243             "\xEA\x99\xA4" => "\xEA\x99\xA5", # CYRILLIC CAPITAL LETTER SOFT EL
1244             "\xEA\x99\xA6" => "\xEA\x99\xA7", # CYRILLIC CAPITAL LETTER SOFT EM
1245             "\xEA\x99\xA8" => "\xEA\x99\xA9", # CYRILLIC CAPITAL LETTER MONOCULAR O
1246             "\xEA\x99\xAA" => "\xEA\x99\xAB", # CYRILLIC CAPITAL LETTER BINOCULAR O
1247             "\xEA\x99\xAC" => "\xEA\x99\xAD", # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
1248             "\xEA\x9A\x80" => "\xEA\x9A\x81", # CYRILLIC CAPITAL LETTER DWE
1249             "\xEA\x9A\x82" => "\xEA\x9A\x83", # CYRILLIC CAPITAL LETTER DZWE
1250             "\xEA\x9A\x84" => "\xEA\x9A\x85", # CYRILLIC CAPITAL LETTER ZHWE
1251             "\xEA\x9A\x86" => "\xEA\x9A\x87", # CYRILLIC CAPITAL LETTER CCHE
1252             "\xEA\x9A\x88" => "\xEA\x9A\x89", # CYRILLIC CAPITAL LETTER DZZE
1253             "\xEA\x9A\x8A" => "\xEA\x9A\x8B", # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
1254             "\xEA\x9A\x8C" => "\xEA\x9A\x8D", # CYRILLIC CAPITAL LETTER TWE
1255             "\xEA\x9A\x8E" => "\xEA\x9A\x8F", # CYRILLIC CAPITAL LETTER TSWE
1256             "\xEA\x9A\x90" => "\xEA\x9A\x91", # CYRILLIC CAPITAL LETTER TSSE
1257             "\xEA\x9A\x92" => "\xEA\x9A\x93", # CYRILLIC CAPITAL LETTER TCHE
1258             "\xEA\x9A\x94" => "\xEA\x9A\x95", # CYRILLIC CAPITAL LETTER HWE
1259             "\xEA\x9A\x96" => "\xEA\x9A\x97", # CYRILLIC CAPITAL LETTER SHWE
1260             "\xEA\x9A\x98" => "\xEA\x9A\x99", # CYRILLIC CAPITAL LETTER DOUBLE O
1261             "\xEA\x9A\x9A" => "\xEA\x9A\x9B", # CYRILLIC CAPITAL LETTER CROSSED O
1262             "\xEA\x9C\xA2" => "\xEA\x9C\xA3", # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
1263             "\xEA\x9C\xA4" => "\xEA\x9C\xA5", # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
1264             "\xEA\x9C\xA6" => "\xEA\x9C\xA7", # LATIN CAPITAL LETTER HENG
1265             "\xEA\x9C\xA8" => "\xEA\x9C\xA9", # LATIN CAPITAL LETTER TZ
1266             "\xEA\x9C\xAA" => "\xEA\x9C\xAB", # LATIN CAPITAL LETTER TRESILLO
1267             "\xEA\x9C\xAC" => "\xEA\x9C\xAD", # LATIN CAPITAL LETTER CUATRILLO
1268             "\xEA\x9C\xAE" => "\xEA\x9C\xAF", # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
1269             "\xEA\x9C\xB2" => "\xEA\x9C\xB3", # LATIN CAPITAL LETTER AA
1270             "\xEA\x9C\xB4" => "\xEA\x9C\xB5", # LATIN CAPITAL LETTER AO
1271             "\xEA\x9C\xB6" => "\xEA\x9C\xB7", # LATIN CAPITAL LETTER AU
1272             "\xEA\x9C\xB8" => "\xEA\x9C\xB9", # LATIN CAPITAL LETTER AV
1273             "\xEA\x9C\xBA" => "\xEA\x9C\xBB", # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
1274             "\xEA\x9C\xBC" => "\xEA\x9C\xBD", # LATIN CAPITAL LETTER AY
1275             "\xEA\x9C\xBE" => "\xEA\x9C\xBF", # LATIN CAPITAL LETTER REVERSED C WITH DOT
1276             "\xEA\x9D\x80" => "\xEA\x9D\x81", # LATIN CAPITAL LETTER K WITH STROKE
1277             "\xEA\x9D\x82" => "\xEA\x9D\x83", # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
1278             "\xEA\x9D\x84" => "\xEA\x9D\x85", # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
1279             "\xEA\x9D\x86" => "\xEA\x9D\x87", # LATIN CAPITAL LETTER BROKEN L
1280             "\xEA\x9D\x88" => "\xEA\x9D\x89", # LATIN CAPITAL LETTER L WITH HIGH STROKE
1281             "\xEA\x9D\x8A" => "\xEA\x9D\x8B", # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
1282             "\xEA\x9D\x8C" => "\xEA\x9D\x8D", # LATIN CAPITAL LETTER O WITH LOOP
1283             "\xEA\x9D\x8E" => "\xEA\x9D\x8F", # LATIN CAPITAL LETTER OO
1284             "\xEA\x9D\x90" => "\xEA\x9D\x91", # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
1285             "\xEA\x9D\x92" => "\xEA\x9D\x93", # LATIN CAPITAL LETTER P WITH FLOURISH
1286             "\xEA\x9D\x94" => "\xEA\x9D\x95", # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
1287             "\xEA\x9D\x96" => "\xEA\x9D\x97", # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
1288             "\xEA\x9D\x98" => "\xEA\x9D\x99", # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
1289             "\xEA\x9D\x9A" => "\xEA\x9D\x9B", # LATIN CAPITAL LETTER R ROTUNDA
1290             "\xEA\x9D\x9C" => "\xEA\x9D\x9D", # LATIN CAPITAL LETTER RUM ROTUNDA
1291             "\xEA\x9D\x9E" => "\xEA\x9D\x9F", # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
1292             "\xEA\x9D\xA0" => "\xEA\x9D\xA1", # LATIN CAPITAL LETTER VY
1293             "\xEA\x9D\xA2" => "\xEA\x9D\xA3", # LATIN CAPITAL LETTER VISIGOTHIC Z
1294             "\xEA\x9D\xA4" => "\xEA\x9D\xA5", # LATIN CAPITAL LETTER THORN WITH STROKE
1295             "\xEA\x9D\xA6" => "\xEA\x9D\xA7", # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
1296             "\xEA\x9D\xA8" => "\xEA\x9D\xA9", # LATIN CAPITAL LETTER VEND
1297             "\xEA\x9D\xAA" => "\xEA\x9D\xAB", # LATIN CAPITAL LETTER ET
1298             "\xEA\x9D\xAC" => "\xEA\x9D\xAD", # LATIN CAPITAL LETTER IS
1299             "\xEA\x9D\xAE" => "\xEA\x9D\xAF", # LATIN CAPITAL LETTER CON
1300             "\xEA\x9D\xB9" => "\xEA\x9D\xBA", # LATIN CAPITAL LETTER INSULAR D
1301             "\xEA\x9D\xBB" => "\xEA\x9D\xBC", # LATIN CAPITAL LETTER INSULAR F
1302             "\xEA\x9D\xBD" => "\xE1\xB5\xB9", # LATIN CAPITAL LETTER INSULAR G
1303             "\xEA\x9D\xBE" => "\xEA\x9D\xBF", # LATIN CAPITAL LETTER TURNED INSULAR G
1304             "\xEA\x9E\x80" => "\xEA\x9E\x81", # LATIN CAPITAL LETTER TURNED L
1305             "\xEA\x9E\x82" => "\xEA\x9E\x83", # LATIN CAPITAL LETTER INSULAR R
1306             "\xEA\x9E\x84" => "\xEA\x9E\x85", # LATIN CAPITAL LETTER INSULAR S
1307             "\xEA\x9E\x86" => "\xEA\x9E\x87", # LATIN CAPITAL LETTER INSULAR T
1308             "\xEA\x9E\x8B" => "\xEA\x9E\x8C", # LATIN CAPITAL LETTER SALTILLO
1309             "\xEA\x9E\x8D" => "\xC9\xA5", # LATIN CAPITAL LETTER TURNED H
1310             "\xEA\x9E\x90" => "\xEA\x9E\x91", # LATIN CAPITAL LETTER N WITH DESCENDER
1311             "\xEA\x9E\x92" => "\xEA\x9E\x93", # LATIN CAPITAL LETTER C WITH BAR
1312             "\xEA\x9E\x96" => "\xEA\x9E\x97", # LATIN CAPITAL LETTER B WITH FLOURISH
1313             "\xEA\x9E\x98" => "\xEA\x9E\x99", # LATIN CAPITAL LETTER F WITH STROKE
1314             "\xEA\x9E\x9A" => "\xEA\x9E\x9B", # LATIN CAPITAL LETTER VOLAPUK AE
1315             "\xEA\x9E\x9C" => "\xEA\x9E\x9D", # LATIN CAPITAL LETTER VOLAPUK OE
1316             "\xEA\x9E\x9E" => "\xEA\x9E\x9F", # LATIN CAPITAL LETTER VOLAPUK UE
1317             "\xEA\x9E\xA0" => "\xEA\x9E\xA1", # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE
1318             "\xEA\x9E\xA2" => "\xEA\x9E\xA3", # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
1319             "\xEA\x9E\xA4" => "\xEA\x9E\xA5", # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
1320             "\xEA\x9E\xA6" => "\xEA\x9E\xA7", # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
1321             "\xEA\x9E\xA8" => "\xEA\x9E\xA9", # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
1322             "\xEA\x9E\xAA" => "\xC9\xA6", # LATIN CAPITAL LETTER H WITH HOOK
1323             "\xEA\x9E\xAB" => "\xC9\x9C", # LATIN CAPITAL LETTER REVERSED OPEN E
1324             "\xEA\x9E\xAC" => "\xC9\xA1", # LATIN CAPITAL LETTER SCRIPT G
1325             "\xEA\x9E\xAD" => "\xC9\xAC", # LATIN CAPITAL LETTER L WITH BELT
1326             "\xEA\x9E\xAE" => "\xC9\xAA", # LATIN CAPITAL LETTER SMALL CAPITAL I
1327             "\xEA\x9E\xB0" => "\xCA\x9E", # LATIN CAPITAL LETTER TURNED K
1328             "\xEA\x9E\xB1" => "\xCA\x87", # LATIN CAPITAL LETTER TURNED T
1329             "\xEA\x9E\xB2" => "\xCA\x9D", # LATIN CAPITAL LETTER J WITH CROSSED-TAIL
1330             "\xEA\x9E\xB3" => "\xEA\xAD\x93", # LATIN CAPITAL LETTER CHI
1331             "\xEA\x9E\xB4" => "\xEA\x9E\xB5", # LATIN CAPITAL LETTER BETA
1332             "\xEA\x9E\xB6" => "\xEA\x9E\xB7", # LATIN CAPITAL LETTER OMEGA
1333             "\xEA\x9E\xB8" => "\xEA\x9E\xB9", # LATIN CAPITAL LETTER U WITH STROKE
1334             "\xEA\x9E\xBA" => "\xEA\x9E\xBB", # LATIN CAPITAL LETTER GLOTTAL A
1335             "\xEA\x9E\xBC" => "\xEA\x9E\xBD", # LATIN CAPITAL LETTER GLOTTAL I
1336             "\xEA\x9E\xBE" => "\xEA\x9E\xBF", # LATIN CAPITAL LETTER GLOTTAL U
1337             "\xEA\x9F\x82" => "\xEA\x9F\x83", # LATIN CAPITAL LETTER ANGLICANA W
1338             "\xEA\x9F\x84" => "\xEA\x9E\x94", # LATIN CAPITAL LETTER C WITH PALATAL HOOK
1339             "\xEA\x9F\x85" => "\xCA\x82", # LATIN CAPITAL LETTER S WITH HOOK
1340             "\xEA\x9F\x86" => "\xE1\xB6\x8E", # LATIN CAPITAL LETTER Z WITH PALATAL HOOK
1341             "\xEA\xAD\xB0" => "\xE1\x8E\xA0", # CHEROKEE SMALL LETTER A
1342             "\xEA\xAD\xB1" => "\xE1\x8E\xA1", # CHEROKEE SMALL LETTER E
1343             "\xEA\xAD\xB2" => "\xE1\x8E\xA2", # CHEROKEE SMALL LETTER I
1344             "\xEA\xAD\xB3" => "\xE1\x8E\xA3", # CHEROKEE SMALL LETTER O
1345             "\xEA\xAD\xB4" => "\xE1\x8E\xA4", # CHEROKEE SMALL LETTER U
1346             "\xEA\xAD\xB5" => "\xE1\x8E\xA5", # CHEROKEE SMALL LETTER V
1347             "\xEA\xAD\xB6" => "\xE1\x8E\xA6", # CHEROKEE SMALL LETTER GA
1348             "\xEA\xAD\xB7" => "\xE1\x8E\xA7", # CHEROKEE SMALL LETTER KA
1349             "\xEA\xAD\xB8" => "\xE1\x8E\xA8", # CHEROKEE SMALL LETTER GE
1350             "\xEA\xAD\xB9" => "\xE1\x8E\xA9", # CHEROKEE SMALL LETTER GI
1351             "\xEA\xAD\xBA" => "\xE1\x8E\xAA", # CHEROKEE SMALL LETTER GO
1352             "\xEA\xAD\xBB" => "\xE1\x8E\xAB", # CHEROKEE SMALL LETTER GU
1353             "\xEA\xAD\xBC" => "\xE1\x8E\xAC", # CHEROKEE SMALL LETTER GV
1354             "\xEA\xAD\xBD" => "\xE1\x8E\xAD", # CHEROKEE SMALL LETTER HA
1355             "\xEA\xAD\xBE" => "\xE1\x8E\xAE", # CHEROKEE SMALL LETTER HE
1356             "\xEA\xAD\xBF" => "\xE1\x8E\xAF", # CHEROKEE SMALL LETTER HI
1357             "\xEA\xAE\x80" => "\xE1\x8E\xB0", # CHEROKEE SMALL LETTER HO
1358             "\xEA\xAE\x81" => "\xE1\x8E\xB1", # CHEROKEE SMALL LETTER HU
1359             "\xEA\xAE\x82" => "\xE1\x8E\xB2", # CHEROKEE SMALL LETTER HV
1360             "\xEA\xAE\x83" => "\xE1\x8E\xB3", # CHEROKEE SMALL LETTER LA
1361             "\xEA\xAE\x84" => "\xE1\x8E\xB4", # CHEROKEE SMALL LETTER LE
1362             "\xEA\xAE\x85" => "\xE1\x8E\xB5", # CHEROKEE SMALL LETTER LI
1363             "\xEA\xAE\x86" => "\xE1\x8E\xB6", # CHEROKEE SMALL LETTER LO
1364             "\xEA\xAE\x87" => "\xE1\x8E\xB7", # CHEROKEE SMALL LETTER LU
1365             "\xEA\xAE\x88" => "\xE1\x8E\xB8", # CHEROKEE SMALL LETTER LV
1366             "\xEA\xAE\x89" => "\xE1\x8E\xB9", # CHEROKEE SMALL LETTER MA
1367             "\xEA\xAE\x8A" => "\xE1\x8E\xBA", # CHEROKEE SMALL LETTER ME
1368             "\xEA\xAE\x8B" => "\xE1\x8E\xBB", # CHEROKEE SMALL LETTER MI
1369             "\xEA\xAE\x8C" => "\xE1\x8E\xBC", # CHEROKEE SMALL LETTER MO
1370             "\xEA\xAE\x8D" => "\xE1\x8E\xBD", # CHEROKEE SMALL LETTER MU
1371             "\xEA\xAE\x8E" => "\xE1\x8E\xBE", # CHEROKEE SMALL LETTER NA
1372             "\xEA\xAE\x8F" => "\xE1\x8E\xBF", # CHEROKEE SMALL LETTER HNA
1373             "\xEA\xAE\x90" => "\xE1\x8F\x80", # CHEROKEE SMALL LETTER NAH
1374             "\xEA\xAE\x91" => "\xE1\x8F\x81", # CHEROKEE SMALL LETTER NE
1375             "\xEA\xAE\x92" => "\xE1\x8F\x82", # CHEROKEE SMALL LETTER NI
1376             "\xEA\xAE\x93" => "\xE1\x8F\x83", # CHEROKEE SMALL LETTER NO
1377             "\xEA\xAE\x94" => "\xE1\x8F\x84", # CHEROKEE SMALL LETTER NU
1378             "\xEA\xAE\x95" => "\xE1\x8F\x85", # CHEROKEE SMALL LETTER NV
1379             "\xEA\xAE\x96" => "\xE1\x8F\x86", # CHEROKEE SMALL LETTER QUA
1380             "\xEA\xAE\x97" => "\xE1\x8F\x87", # CHEROKEE SMALL LETTER QUE
1381             "\xEA\xAE\x98" => "\xE1\x8F\x88", # CHEROKEE SMALL LETTER QUI
1382             "\xEA\xAE\x99" => "\xE1\x8F\x89", # CHEROKEE SMALL LETTER QUO
1383             "\xEA\xAE\x9A" => "\xE1\x8F\x8A", # CHEROKEE SMALL LETTER QUU
1384             "\xEA\xAE\x9B" => "\xE1\x8F\x8B", # CHEROKEE SMALL LETTER QUV
1385             "\xEA\xAE\x9C" => "\xE1\x8F\x8C", # CHEROKEE SMALL LETTER SA
1386             "\xEA\xAE\x9D" => "\xE1\x8F\x8D", # CHEROKEE SMALL LETTER S
1387             "\xEA\xAE\x9E" => "\xE1\x8F\x8E", # CHEROKEE SMALL LETTER SE
1388             "\xEA\xAE\x9F" => "\xE1\x8F\x8F", # CHEROKEE SMALL LETTER SI
1389             "\xEA\xAE\xA0" => "\xE1\x8F\x90", # CHEROKEE SMALL LETTER SO
1390             "\xEA\xAE\xA1" => "\xE1\x8F\x91", # CHEROKEE SMALL LETTER SU
1391             "\xEA\xAE\xA2" => "\xE1\x8F\x92", # CHEROKEE SMALL LETTER SV
1392             "\xEA\xAE\xA3" => "\xE1\x8F\x93", # CHEROKEE SMALL LETTER DA
1393             "\xEA\xAE\xA4" => "\xE1\x8F\x94", # CHEROKEE SMALL LETTER TA
1394             "\xEA\xAE\xA5" => "\xE1\x8F\x95", # CHEROKEE SMALL LETTER DE
1395             "\xEA\xAE\xA6" => "\xE1\x8F\x96", # CHEROKEE SMALL LETTER TE
1396             "\xEA\xAE\xA7" => "\xE1\x8F\x97", # CHEROKEE SMALL LETTER DI
1397             "\xEA\xAE\xA8" => "\xE1\x8F\x98", # CHEROKEE SMALL LETTER TI
1398             "\xEA\xAE\xA9" => "\xE1\x8F\x99", # CHEROKEE SMALL LETTER DO
1399             "\xEA\xAE\xAA" => "\xE1\x8F\x9A", # CHEROKEE SMALL LETTER DU
1400             "\xEA\xAE\xAB" => "\xE1\x8F\x9B", # CHEROKEE SMALL LETTER DV
1401             "\xEA\xAE\xAC" => "\xE1\x8F\x9C", # CHEROKEE SMALL LETTER DLA
1402             "\xEA\xAE\xAD" => "\xE1\x8F\x9D", # CHEROKEE SMALL LETTER TLA
1403             "\xEA\xAE\xAE" => "\xE1\x8F\x9E", # CHEROKEE SMALL LETTER TLE
1404             "\xEA\xAE\xAF" => "\xE1\x8F\x9F", # CHEROKEE SMALL LETTER TLI
1405             "\xEA\xAE\xB0" => "\xE1\x8F\xA0", # CHEROKEE SMALL LETTER TLO
1406             "\xEA\xAE\xB1" => "\xE1\x8F\xA1", # CHEROKEE SMALL LETTER TLU
1407             "\xEA\xAE\xB2" => "\xE1\x8F\xA2", # CHEROKEE SMALL LETTER TLV
1408             "\xEA\xAE\xB3" => "\xE1\x8F\xA3", # CHEROKEE SMALL LETTER TSA
1409             "\xEA\xAE\xB4" => "\xE1\x8F\xA4", # CHEROKEE SMALL LETTER TSE
1410             "\xEA\xAE\xB5" => "\xE1\x8F\xA5", # CHEROKEE SMALL LETTER TSI
1411             "\xEA\xAE\xB6" => "\xE1\x8F\xA6", # CHEROKEE SMALL LETTER TSO
1412             "\xEA\xAE\xB7" => "\xE1\x8F\xA7", # CHEROKEE SMALL LETTER TSU
1413             "\xEA\xAE\xB8" => "\xE1\x8F\xA8", # CHEROKEE SMALL LETTER TSV
1414             "\xEA\xAE\xB9" => "\xE1\x8F\xA9", # CHEROKEE SMALL LETTER WA
1415             "\xEA\xAE\xBA" => "\xE1\x8F\xAA", # CHEROKEE SMALL LETTER WE
1416             "\xEA\xAE\xBB" => "\xE1\x8F\xAB", # CHEROKEE SMALL LETTER WI
1417             "\xEA\xAE\xBC" => "\xE1\x8F\xAC", # CHEROKEE SMALL LETTER WO
1418             "\xEA\xAE\xBD" => "\xE1\x8F\xAD", # CHEROKEE SMALL LETTER WU
1419             "\xEA\xAE\xBE" => "\xE1\x8F\xAE", # CHEROKEE SMALL LETTER WV
1420             "\xEA\xAE\xBF" => "\xE1\x8F\xAF", # CHEROKEE SMALL LETTER YA
1421             "\xEF\xAC\x80" => "\x66\x66", # LATIN SMALL LIGATURE FF
1422             "\xEF\xAC\x81" => "\x66\x69", # LATIN SMALL LIGATURE FI
1423             "\xEF\xAC\x82" => "\x66\x6C", # LATIN SMALL LIGATURE FL
1424             "\xEF\xAC\x83" => "\x66\x66\x69", # LATIN SMALL LIGATURE FFI
1425             "\xEF\xAC\x84" => "\x66\x66\x6C", # LATIN SMALL LIGATURE FFL
1426             "\xEF\xAC\x85" => "\x73\x74", # LATIN SMALL LIGATURE LONG S T
1427             "\xEF\xAC\x86" => "\x73\x74", # LATIN SMALL LIGATURE ST
1428             "\xEF\xAC\x93" => "\xD5\xB4\xD5\xB6", # ARMENIAN SMALL LIGATURE MEN NOW
1429             "\xEF\xAC\x94" => "\xD5\xB4\xD5\xA5", # ARMENIAN SMALL LIGATURE MEN ECH
1430             "\xEF\xAC\x95" => "\xD5\xB4\xD5\xAB", # ARMENIAN SMALL LIGATURE MEN INI
1431             "\xEF\xAC\x96" => "\xD5\xBE\xD5\xB6", # ARMENIAN SMALL LIGATURE VEW NOW
1432             "\xEF\xAC\x97" => "\xD5\xB4\xD5\xAD", # ARMENIAN SMALL LIGATURE MEN XEH
1433             "\xEF\xBC\xA1" => "\xEF\xBD\x81", # FULLWIDTH LATIN CAPITAL LETTER A
1434             "\xEF\xBC\xA2" => "\xEF\xBD\x82", # FULLWIDTH LATIN CAPITAL LETTER B
1435             "\xEF\xBC\xA3" => "\xEF\xBD\x83", # FULLWIDTH LATIN CAPITAL LETTER C
1436             "\xEF\xBC\xA4" => "\xEF\xBD\x84", # FULLWIDTH LATIN CAPITAL LETTER D
1437             "\xEF\xBC\xA5" => "\xEF\xBD\x85", # FULLWIDTH LATIN CAPITAL LETTER E
1438             "\xEF\xBC\xA6" => "\xEF\xBD\x86", # FULLWIDTH LATIN CAPITAL LETTER F
1439             "\xEF\xBC\xA7" => "\xEF\xBD\x87", # FULLWIDTH LATIN CAPITAL LETTER G
1440             "\xEF\xBC\xA8" => "\xEF\xBD\x88", # FULLWIDTH LATIN CAPITAL LETTER H
1441             "\xEF\xBC\xA9" => "\xEF\xBD\x89", # FULLWIDTH LATIN CAPITAL LETTER I
1442             "\xEF\xBC\xAA" => "\xEF\xBD\x8A", # FULLWIDTH LATIN CAPITAL LETTER J
1443             "\xEF\xBC\xAB" => "\xEF\xBD\x8B", # FULLWIDTH LATIN CAPITAL LETTER K
1444             "\xEF\xBC\xAC" => "\xEF\xBD\x8C", # FULLWIDTH LATIN CAPITAL LETTER L
1445             "\xEF\xBC\xAD" => "\xEF\xBD\x8D", # FULLWIDTH LATIN CAPITAL LETTER M
1446             "\xEF\xBC\xAE" => "\xEF\xBD\x8E", # FULLWIDTH LATIN CAPITAL LETTER N
1447             "\xEF\xBC\xAF" => "\xEF\xBD\x8F", # FULLWIDTH LATIN CAPITAL LETTER O
1448             "\xEF\xBC\xB0" => "\xEF\xBD\x90", # FULLWIDTH LATIN CAPITAL LETTER P
1449             "\xEF\xBC\xB1" => "\xEF\xBD\x91", # FULLWIDTH LATIN CAPITAL LETTER Q
1450             "\xEF\xBC\xB2" => "\xEF\xBD\x92", # FULLWIDTH LATIN CAPITAL LETTER R
1451             "\xEF\xBC\xB3" => "\xEF\xBD\x93", # FULLWIDTH LATIN CAPITAL LETTER S
1452             "\xEF\xBC\xB4" => "\xEF\xBD\x94", # FULLWIDTH LATIN CAPITAL LETTER T
1453             "\xEF\xBC\xB5" => "\xEF\xBD\x95", # FULLWIDTH LATIN CAPITAL LETTER U
1454             "\xEF\xBC\xB6" => "\xEF\xBD\x96", # FULLWIDTH LATIN CAPITAL LETTER V
1455             "\xEF\xBC\xB7" => "\xEF\xBD\x97", # FULLWIDTH LATIN CAPITAL LETTER W
1456             "\xEF\xBC\xB8" => "\xEF\xBD\x98", # FULLWIDTH LATIN CAPITAL LETTER X
1457             "\xEF\xBC\xB9" => "\xEF\xBD\x99", # FULLWIDTH LATIN CAPITAL LETTER Y
1458             "\xEF\xBC\xBA" => "\xEF\xBD\x9A", # FULLWIDTH LATIN CAPITAL LETTER Z
1459             "\xF0\x90\x90\x80" => "\xF0\x90\x90\xA8", # DESERET CAPITAL LETTER LONG I
1460             "\xF0\x90\x90\x81" => "\xF0\x90\x90\xA9", # DESERET CAPITAL LETTER LONG E
1461             "\xF0\x90\x90\x82" => "\xF0\x90\x90\xAA", # DESERET CAPITAL LETTER LONG A
1462             "\xF0\x90\x90\x83" => "\xF0\x90\x90\xAB", # DESERET CAPITAL LETTER LONG AH
1463             "\xF0\x90\x90\x84" => "\xF0\x90\x90\xAC", # DESERET CAPITAL LETTER LONG O
1464             "\xF0\x90\x90\x85" => "\xF0\x90\x90\xAD", # DESERET CAPITAL LETTER LONG OO
1465             "\xF0\x90\x90\x86" => "\xF0\x90\x90\xAE", # DESERET CAPITAL LETTER SHORT I
1466             "\xF0\x90\x90\x87" => "\xF0\x90\x90\xAF", # DESERET CAPITAL LETTER SHORT E
1467             "\xF0\x90\x90\x88" => "\xF0\x90\x90\xB0", # DESERET CAPITAL LETTER SHORT A
1468             "\xF0\x90\x90\x89" => "\xF0\x90\x90\xB1", # DESERET CAPITAL LETTER SHORT AH
1469             "\xF0\x90\x90\x8A" => "\xF0\x90\x90\xB2", # DESERET CAPITAL LETTER SHORT O
1470             "\xF0\x90\x90\x8B" => "\xF0\x90\x90\xB3", # DESERET CAPITAL LETTER SHORT OO
1471             "\xF0\x90\x90\x8C" => "\xF0\x90\x90\xB4", # DESERET CAPITAL LETTER AY
1472             "\xF0\x90\x90\x8D" => "\xF0\x90\x90\xB5", # DESERET CAPITAL LETTER OW
1473             "\xF0\x90\x90\x8E" => "\xF0\x90\x90\xB6", # DESERET CAPITAL LETTER WU
1474             "\xF0\x90\x90\x8F" => "\xF0\x90\x90\xB7", # DESERET CAPITAL LETTER YEE
1475             "\xF0\x90\x90\x90" => "\xF0\x90\x90\xB8", # DESERET CAPITAL LETTER H
1476             "\xF0\x90\x90\x91" => "\xF0\x90\x90\xB9", # DESERET CAPITAL LETTER PEE
1477             "\xF0\x90\x90\x92" => "\xF0\x90\x90\xBA", # DESERET CAPITAL LETTER BEE
1478             "\xF0\x90\x90\x93" => "\xF0\x90\x90\xBB", # DESERET CAPITAL LETTER TEE
1479             "\xF0\x90\x90\x94" => "\xF0\x90\x90\xBC", # DESERET CAPITAL LETTER DEE
1480             "\xF0\x90\x90\x95" => "\xF0\x90\x90\xBD", # DESERET CAPITAL LETTER CHEE
1481             "\xF0\x90\x90\x96" => "\xF0\x90\x90\xBE", # DESERET CAPITAL LETTER JEE
1482             "\xF0\x90\x90\x97" => "\xF0\x90\x90\xBF", # DESERET CAPITAL LETTER KAY
1483             "\xF0\x90\x90\x98" => "\xF0\x90\x91\x80", # DESERET CAPITAL LETTER GAY
1484             "\xF0\x90\x90\x99" => "\xF0\x90\x91\x81", # DESERET CAPITAL LETTER EF
1485             "\xF0\x90\x90\x9A" => "\xF0\x90\x91\x82", # DESERET CAPITAL LETTER VEE
1486             "\xF0\x90\x90\x9B" => "\xF0\x90\x91\x83", # DESERET CAPITAL LETTER ETH
1487             "\xF0\x90\x90\x9C" => "\xF0\x90\x91\x84", # DESERET CAPITAL LETTER THEE
1488             "\xF0\x90\x90\x9D" => "\xF0\x90\x91\x85", # DESERET CAPITAL LETTER ES
1489             "\xF0\x90\x90\x9E" => "\xF0\x90\x91\x86", # DESERET CAPITAL LETTER ZEE
1490             "\xF0\x90\x90\x9F" => "\xF0\x90\x91\x87", # DESERET CAPITAL LETTER ESH
1491             "\xF0\x90\x90\xA0" => "\xF0\x90\x91\x88", # DESERET CAPITAL LETTER ZHEE
1492             "\xF0\x90\x90\xA1" => "\xF0\x90\x91\x89", # DESERET CAPITAL LETTER ER
1493             "\xF0\x90\x90\xA2" => "\xF0\x90\x91\x8A", # DESERET CAPITAL LETTER EL
1494             "\xF0\x90\x90\xA3" => "\xF0\x90\x91\x8B", # DESERET CAPITAL LETTER EM
1495             "\xF0\x90\x90\xA4" => "\xF0\x90\x91\x8C", # DESERET CAPITAL LETTER EN
1496             "\xF0\x90\x90\xA5" => "\xF0\x90\x91\x8D", # DESERET CAPITAL LETTER ENG
1497             "\xF0\x90\x90\xA6" => "\xF0\x90\x91\x8E", # DESERET CAPITAL LETTER OI
1498             "\xF0\x90\x90\xA7" => "\xF0\x90\x91\x8F", # DESERET CAPITAL LETTER EW
1499             "\xF0\x90\x92\xB0" => "\xF0\x90\x93\x98", # OSAGE CAPITAL LETTER A
1500             "\xF0\x90\x92\xB1" => "\xF0\x90\x93\x99", # OSAGE CAPITAL LETTER AI
1501             "\xF0\x90\x92\xB2" => "\xF0\x90\x93\x9A", # OSAGE CAPITAL LETTER AIN
1502             "\xF0\x90\x92\xB3" => "\xF0\x90\x93\x9B", # OSAGE CAPITAL LETTER AH
1503             "\xF0\x90\x92\xB4" => "\xF0\x90\x93\x9C", # OSAGE CAPITAL LETTER BRA
1504             "\xF0\x90\x92\xB5" => "\xF0\x90\x93\x9D", # OSAGE CAPITAL LETTER CHA
1505             "\xF0\x90\x92\xB6" => "\xF0\x90\x93\x9E", # OSAGE CAPITAL LETTER EHCHA
1506             "\xF0\x90\x92\xB7" => "\xF0\x90\x93\x9F", # OSAGE CAPITAL LETTER E
1507             "\xF0\x90\x92\xB8" => "\xF0\x90\x93\xA0", # OSAGE CAPITAL LETTER EIN
1508             "\xF0\x90\x92\xB9" => "\xF0\x90\x93\xA1", # OSAGE CAPITAL LETTER HA
1509             "\xF0\x90\x92\xBA" => "\xF0\x90\x93\xA2", # OSAGE CAPITAL LETTER HYA
1510             "\xF0\x90\x92\xBB" => "\xF0\x90\x93\xA3", # OSAGE CAPITAL LETTER I
1511             "\xF0\x90\x92\xBC" => "\xF0\x90\x93\xA4", # OSAGE CAPITAL LETTER KA
1512             "\xF0\x90\x92\xBD" => "\xF0\x90\x93\xA5", # OSAGE CAPITAL LETTER EHKA
1513             "\xF0\x90\x92\xBE" => "\xF0\x90\x93\xA6", # OSAGE CAPITAL LETTER KYA
1514             "\xF0\x90\x92\xBF" => "\xF0\x90\x93\xA7", # OSAGE CAPITAL LETTER LA
1515             "\xF0\x90\x93\x80" => "\xF0\x90\x93\xA8", # OSAGE CAPITAL LETTER MA
1516             "\xF0\x90\x93\x81" => "\xF0\x90\x93\xA9", # OSAGE CAPITAL LETTER NA
1517             "\xF0\x90\x93\x82" => "\xF0\x90\x93\xAA", # OSAGE CAPITAL LETTER O
1518             "\xF0\x90\x93\x83" => "\xF0\x90\x93\xAB", # OSAGE CAPITAL LETTER OIN
1519             "\xF0\x90\x93\x84" => "\xF0\x90\x93\xAC", # OSAGE CAPITAL LETTER PA
1520             "\xF0\x90\x93\x85" => "\xF0\x90\x93\xAD", # OSAGE CAPITAL LETTER EHPA
1521             "\xF0\x90\x93\x86" => "\xF0\x90\x93\xAE", # OSAGE CAPITAL LETTER SA
1522             "\xF0\x90\x93\x87" => "\xF0\x90\x93\xAF", # OSAGE CAPITAL LETTER SHA
1523             "\xF0\x90\x93\x88" => "\xF0\x90\x93\xB0", # OSAGE CAPITAL LETTER TA
1524             "\xF0\x90\x93\x89" => "\xF0\x90\x93\xB1", # OSAGE CAPITAL LETTER EHTA
1525             "\xF0\x90\x93\x8A" => "\xF0\x90\x93\xB2", # OSAGE CAPITAL LETTER TSA
1526             "\xF0\x90\x93\x8B" => "\xF0\x90\x93\xB3", # OSAGE CAPITAL LETTER EHTSA
1527             "\xF0\x90\x93\x8C" => "\xF0\x90\x93\xB4", # OSAGE CAPITAL LETTER TSHA
1528             "\xF0\x90\x93\x8D" => "\xF0\x90\x93\xB5", # OSAGE CAPITAL LETTER DHA
1529             "\xF0\x90\x93\x8E" => "\xF0\x90\x93\xB6", # OSAGE CAPITAL LETTER U
1530             "\xF0\x90\x93\x8F" => "\xF0\x90\x93\xB7", # OSAGE CAPITAL LETTER WA
1531             "\xF0\x90\x93\x90" => "\xF0\x90\x93\xB8", # OSAGE CAPITAL LETTER KHA
1532             "\xF0\x90\x93\x91" => "\xF0\x90\x93\xB9", # OSAGE CAPITAL LETTER GHA
1533             "\xF0\x90\x93\x92" => "\xF0\x90\x93\xBA", # OSAGE CAPITAL LETTER ZA
1534             "\xF0\x90\x93\x93" => "\xF0\x90\x93\xBB", # OSAGE CAPITAL LETTER ZHA
1535             "\xF0\x90\xB2\x80" => "\xF0\x90\xB3\x80", # OLD HUNGARIAN CAPITAL LETTER A
1536             "\xF0\x90\xB2\x81" => "\xF0\x90\xB3\x81", # OLD HUNGARIAN CAPITAL LETTER AA
1537             "\xF0\x90\xB2\x82" => "\xF0\x90\xB3\x82", # OLD HUNGARIAN CAPITAL LETTER EB
1538             "\xF0\x90\xB2\x83" => "\xF0\x90\xB3\x83", # OLD HUNGARIAN CAPITAL LETTER AMB
1539             "\xF0\x90\xB2\x84" => "\xF0\x90\xB3\x84", # OLD HUNGARIAN CAPITAL LETTER EC
1540             "\xF0\x90\xB2\x85" => "\xF0\x90\xB3\x85", # OLD HUNGARIAN CAPITAL LETTER ENC
1541             "\xF0\x90\xB2\x86" => "\xF0\x90\xB3\x86", # OLD HUNGARIAN CAPITAL LETTER ECS
1542             "\xF0\x90\xB2\x87" => "\xF0\x90\xB3\x87", # OLD HUNGARIAN CAPITAL LETTER ED
1543             "\xF0\x90\xB2\x88" => "\xF0\x90\xB3\x88", # OLD HUNGARIAN CAPITAL LETTER AND
1544             "\xF0\x90\xB2\x89" => "\xF0\x90\xB3\x89", # OLD HUNGARIAN CAPITAL LETTER E
1545             "\xF0\x90\xB2\x8A" => "\xF0\x90\xB3\x8A", # OLD HUNGARIAN CAPITAL LETTER CLOSE E
1546             "\xF0\x90\xB2\x8B" => "\xF0\x90\xB3\x8B", # OLD HUNGARIAN CAPITAL LETTER EE
1547             "\xF0\x90\xB2\x8C" => "\xF0\x90\xB3\x8C", # OLD HUNGARIAN CAPITAL LETTER EF
1548             "\xF0\x90\xB2\x8D" => "\xF0\x90\xB3\x8D", # OLD HUNGARIAN CAPITAL LETTER EG
1549             "\xF0\x90\xB2\x8E" => "\xF0\x90\xB3\x8E", # OLD HUNGARIAN CAPITAL LETTER EGY
1550             "\xF0\x90\xB2\x8F" => "\xF0\x90\xB3\x8F", # OLD HUNGARIAN CAPITAL LETTER EH
1551             "\xF0\x90\xB2\x90" => "\xF0\x90\xB3\x90", # OLD HUNGARIAN CAPITAL LETTER I
1552             "\xF0\x90\xB2\x91" => "\xF0\x90\xB3\x91", # OLD HUNGARIAN CAPITAL LETTER II
1553             "\xF0\x90\xB2\x92" => "\xF0\x90\xB3\x92", # OLD HUNGARIAN CAPITAL LETTER EJ
1554             "\xF0\x90\xB2\x93" => "\xF0\x90\xB3\x93", # OLD HUNGARIAN CAPITAL LETTER EK
1555             "\xF0\x90\xB2\x94" => "\xF0\x90\xB3\x94", # OLD HUNGARIAN CAPITAL LETTER AK
1556             "\xF0\x90\xB2\x95" => "\xF0\x90\xB3\x95", # OLD HUNGARIAN CAPITAL LETTER UNK
1557             "\xF0\x90\xB2\x96" => "\xF0\x90\xB3\x96", # OLD HUNGARIAN CAPITAL LETTER EL
1558             "\xF0\x90\xB2\x97" => "\xF0\x90\xB3\x97", # OLD HUNGARIAN CAPITAL LETTER ELY
1559             "\xF0\x90\xB2\x98" => "\xF0\x90\xB3\x98", # OLD HUNGARIAN CAPITAL LETTER EM
1560             "\xF0\x90\xB2\x99" => "\xF0\x90\xB3\x99", # OLD HUNGARIAN CAPITAL LETTER EN
1561             "\xF0\x90\xB2\x9A" => "\xF0\x90\xB3\x9A", # OLD HUNGARIAN CAPITAL LETTER ENY
1562             "\xF0\x90\xB2\x9B" => "\xF0\x90\xB3\x9B", # OLD HUNGARIAN CAPITAL LETTER O
1563             "\xF0\x90\xB2\x9C" => "\xF0\x90\xB3\x9C", # OLD HUNGARIAN CAPITAL LETTER OO
1564             "\xF0\x90\xB2\x9D" => "\xF0\x90\xB3\x9D", # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
1565             "\xF0\x90\xB2\x9E" => "\xF0\x90\xB3\x9E", # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
1566             "\xF0\x90\xB2\x9F" => "\xF0\x90\xB3\x9F", # OLD HUNGARIAN CAPITAL LETTER OEE
1567             "\xF0\x90\xB2\xA0" => "\xF0\x90\xB3\xA0", # OLD HUNGARIAN CAPITAL LETTER EP
1568             "\xF0\x90\xB2\xA1" => "\xF0\x90\xB3\xA1", # OLD HUNGARIAN CAPITAL LETTER EMP
1569             "\xF0\x90\xB2\xA2" => "\xF0\x90\xB3\xA2", # OLD HUNGARIAN CAPITAL LETTER ER
1570             "\xF0\x90\xB2\xA3" => "\xF0\x90\xB3\xA3", # OLD HUNGARIAN CAPITAL LETTER SHORT ER
1571             "\xF0\x90\xB2\xA4" => "\xF0\x90\xB3\xA4", # OLD HUNGARIAN CAPITAL LETTER ES
1572             "\xF0\x90\xB2\xA5" => "\xF0\x90\xB3\xA5", # OLD HUNGARIAN CAPITAL LETTER ESZ
1573             "\xF0\x90\xB2\xA6" => "\xF0\x90\xB3\xA6", # OLD HUNGARIAN CAPITAL LETTER ET
1574             "\xF0\x90\xB2\xA7" => "\xF0\x90\xB3\xA7", # OLD HUNGARIAN CAPITAL LETTER ENT
1575             "\xF0\x90\xB2\xA8" => "\xF0\x90\xB3\xA8", # OLD HUNGARIAN CAPITAL LETTER ETY
1576             "\xF0\x90\xB2\xA9" => "\xF0\x90\xB3\xA9", # OLD HUNGARIAN CAPITAL LETTER ECH
1577             "\xF0\x90\xB2\xAA" => "\xF0\x90\xB3\xAA", # OLD HUNGARIAN CAPITAL LETTER U
1578             "\xF0\x90\xB2\xAB" => "\xF0\x90\xB3\xAB", # OLD HUNGARIAN CAPITAL LETTER UU
1579             "\xF0\x90\xB2\xAC" => "\xF0\x90\xB3\xAC", # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
1580             "\xF0\x90\xB2\xAD" => "\xF0\x90\xB3\xAD", # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
1581             "\xF0\x90\xB2\xAE" => "\xF0\x90\xB3\xAE", # OLD HUNGARIAN CAPITAL LETTER EV
1582             "\xF0\x90\xB2\xAF" => "\xF0\x90\xB3\xAF", # OLD HUNGARIAN CAPITAL LETTER EZ
1583             "\xF0\x90\xB2\xB0" => "\xF0\x90\xB3\xB0", # OLD HUNGARIAN CAPITAL LETTER EZS
1584             "\xF0\x90\xB2\xB1" => "\xF0\x90\xB3\xB1", # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
1585             "\xF0\x90\xB2\xB2" => "\xF0\x90\xB3\xB2", # OLD HUNGARIAN CAPITAL LETTER US
1586             "\xF0\x91\xA2\xA0" => "\xF0\x91\xA3\x80", # WARANG CITI CAPITAL LETTER NGAA
1587             "\xF0\x91\xA2\xA1" => "\xF0\x91\xA3\x81", # WARANG CITI CAPITAL LETTER A
1588             "\xF0\x91\xA2\xA2" => "\xF0\x91\xA3\x82", # WARANG CITI CAPITAL LETTER WI
1589             "\xF0\x91\xA2\xA3" => "\xF0\x91\xA3\x83", # WARANG CITI CAPITAL LETTER YU
1590             "\xF0\x91\xA2\xA4" => "\xF0\x91\xA3\x84", # WARANG CITI CAPITAL LETTER YA
1591             "\xF0\x91\xA2\xA5" => "\xF0\x91\xA3\x85", # WARANG CITI CAPITAL LETTER YO
1592             "\xF0\x91\xA2\xA6" => "\xF0\x91\xA3\x86", # WARANG CITI CAPITAL LETTER II
1593             "\xF0\x91\xA2\xA7" => "\xF0\x91\xA3\x87", # WARANG CITI CAPITAL LETTER UU
1594             "\xF0\x91\xA2\xA8" => "\xF0\x91\xA3\x88", # WARANG CITI CAPITAL LETTER E
1595             "\xF0\x91\xA2\xA9" => "\xF0\x91\xA3\x89", # WARANG CITI CAPITAL LETTER O
1596             "\xF0\x91\xA2\xAA" => "\xF0\x91\xA3\x8A", # WARANG CITI CAPITAL LETTER ANG
1597             "\xF0\x91\xA2\xAB" => "\xF0\x91\xA3\x8B", # WARANG CITI CAPITAL LETTER GA
1598             "\xF0\x91\xA2\xAC" => "\xF0\x91\xA3\x8C", # WARANG CITI CAPITAL LETTER KO
1599             "\xF0\x91\xA2\xAD" => "\xF0\x91\xA3\x8D", # WARANG CITI CAPITAL LETTER ENY
1600             "\xF0\x91\xA2\xAE" => "\xF0\x91\xA3\x8E", # WARANG CITI CAPITAL LETTER YUJ
1601             "\xF0\x91\xA2\xAF" => "\xF0\x91\xA3\x8F", # WARANG CITI CAPITAL LETTER UC
1602             "\xF0\x91\xA2\xB0" => "\xF0\x91\xA3\x90", # WARANG CITI CAPITAL LETTER ENN
1603             "\xF0\x91\xA2\xB1" => "\xF0\x91\xA3\x91", # WARANG CITI CAPITAL LETTER ODD
1604             "\xF0\x91\xA2\xB2" => "\xF0\x91\xA3\x92", # WARANG CITI CAPITAL LETTER TTE
1605             "\xF0\x91\xA2\xB3" => "\xF0\x91\xA3\x93", # WARANG CITI CAPITAL LETTER NUNG
1606             "\xF0\x91\xA2\xB4" => "\xF0\x91\xA3\x94", # WARANG CITI CAPITAL LETTER DA
1607             "\xF0\x91\xA2\xB5" => "\xF0\x91\xA3\x95", # WARANG CITI CAPITAL LETTER AT
1608             "\xF0\x91\xA2\xB6" => "\xF0\x91\xA3\x96", # WARANG CITI CAPITAL LETTER AM
1609             "\xF0\x91\xA2\xB7" => "\xF0\x91\xA3\x97", # WARANG CITI CAPITAL LETTER BU
1610             "\xF0\x91\xA2\xB8" => "\xF0\x91\xA3\x98", # WARANG CITI CAPITAL LETTER PU
1611             "\xF0\x91\xA2\xB9" => "\xF0\x91\xA3\x99", # WARANG CITI CAPITAL LETTER HIYO
1612             "\xF0\x91\xA2\xBA" => "\xF0\x91\xA3\x9A", # WARANG CITI CAPITAL LETTER HOLO
1613             "\xF0\x91\xA2\xBB" => "\xF0\x91\xA3\x9B", # WARANG CITI CAPITAL LETTER HORR
1614             "\xF0\x91\xA2\xBC" => "\xF0\x91\xA3\x9C", # WARANG CITI CAPITAL LETTER HAR
1615             "\xF0\x91\xA2\xBD" => "\xF0\x91\xA3\x9D", # WARANG CITI CAPITAL LETTER SSUU
1616             "\xF0\x91\xA2\xBE" => "\xF0\x91\xA3\x9E", # WARANG CITI CAPITAL LETTER SII
1617             "\xF0\x91\xA2\xBF" => "\xF0\x91\xA3\x9F", # WARANG CITI CAPITAL LETTER VIYO
1618             "\xF0\x96\xB9\x80" => "\xF0\x96\xB9\xA0", # MEDEFAIDRIN CAPITAL LETTER M
1619             "\xF0\x96\xB9\x81" => "\xF0\x96\xB9\xA1", # MEDEFAIDRIN CAPITAL LETTER S
1620             "\xF0\x96\xB9\x82" => "\xF0\x96\xB9\xA2", # MEDEFAIDRIN CAPITAL LETTER V
1621             "\xF0\x96\xB9\x83" => "\xF0\x96\xB9\xA3", # MEDEFAIDRIN CAPITAL LETTER W
1622             "\xF0\x96\xB9\x84" => "\xF0\x96\xB9\xA4", # MEDEFAIDRIN CAPITAL LETTER ATIU
1623             "\xF0\x96\xB9\x85" => "\xF0\x96\xB9\xA5", # MEDEFAIDRIN CAPITAL LETTER Z
1624             "\xF0\x96\xB9\x86" => "\xF0\x96\xB9\xA6", # MEDEFAIDRIN CAPITAL LETTER KP
1625             "\xF0\x96\xB9\x87" => "\xF0\x96\xB9\xA7", # MEDEFAIDRIN CAPITAL LETTER P
1626             "\xF0\x96\xB9\x88" => "\xF0\x96\xB9\xA8", # MEDEFAIDRIN CAPITAL LETTER T
1627             "\xF0\x96\xB9\x89" => "\xF0\x96\xB9\xA9", # MEDEFAIDRIN CAPITAL LETTER G
1628             "\xF0\x96\xB9\x8A" => "\xF0\x96\xB9\xAA", # MEDEFAIDRIN CAPITAL LETTER F
1629             "\xF0\x96\xB9\x8B" => "\xF0\x96\xB9\xAB", # MEDEFAIDRIN CAPITAL LETTER I
1630             "\xF0\x96\xB9\x8C" => "\xF0\x96\xB9\xAC", # MEDEFAIDRIN CAPITAL LETTER K
1631             "\xF0\x96\xB9\x8D" => "\xF0\x96\xB9\xAD", # MEDEFAIDRIN CAPITAL LETTER A
1632             "\xF0\x96\xB9\x8E" => "\xF0\x96\xB9\xAE", # MEDEFAIDRIN CAPITAL LETTER J
1633             "\xF0\x96\xB9\x8F" => "\xF0\x96\xB9\xAF", # MEDEFAIDRIN CAPITAL LETTER E
1634             "\xF0\x96\xB9\x90" => "\xF0\x96\xB9\xB0", # MEDEFAIDRIN CAPITAL LETTER B
1635             "\xF0\x96\xB9\x91" => "\xF0\x96\xB9\xB1", # MEDEFAIDRIN CAPITAL LETTER C
1636             "\xF0\x96\xB9\x92" => "\xF0\x96\xB9\xB2", # MEDEFAIDRIN CAPITAL LETTER U
1637             "\xF0\x96\xB9\x93" => "\xF0\x96\xB9\xB3", # MEDEFAIDRIN CAPITAL LETTER YU
1638             "\xF0\x96\xB9\x94" => "\xF0\x96\xB9\xB4", # MEDEFAIDRIN CAPITAL LETTER L
1639             "\xF0\x96\xB9\x95" => "\xF0\x96\xB9\xB5", # MEDEFAIDRIN CAPITAL LETTER Q
1640             "\xF0\x96\xB9\x96" => "\xF0\x96\xB9\xB6", # MEDEFAIDRIN CAPITAL LETTER HP
1641             "\xF0\x96\xB9\x97" => "\xF0\x96\xB9\xB7", # MEDEFAIDRIN CAPITAL LETTER NY
1642             "\xF0\x96\xB9\x98" => "\xF0\x96\xB9\xB8", # MEDEFAIDRIN CAPITAL LETTER X
1643             "\xF0\x96\xB9\x99" => "\xF0\x96\xB9\xB9", # MEDEFAIDRIN CAPITAL LETTER D
1644             "\xF0\x96\xB9\x9A" => "\xF0\x96\xB9\xBA", # MEDEFAIDRIN CAPITAL LETTER OE
1645             "\xF0\x96\xB9\x9B" => "\xF0\x96\xB9\xBB", # MEDEFAIDRIN CAPITAL LETTER N
1646             "\xF0\x96\xB9\x9C" => "\xF0\x96\xB9\xBC", # MEDEFAIDRIN CAPITAL LETTER R
1647             "\xF0\x96\xB9\x9D" => "\xF0\x96\xB9\xBD", # MEDEFAIDRIN CAPITAL LETTER O
1648             "\xF0\x96\xB9\x9E" => "\xF0\x96\xB9\xBE", # MEDEFAIDRIN CAPITAL LETTER AI
1649             "\xF0\x96\xB9\x9F" => "\xF0\x96\xB9\xBF", # MEDEFAIDRIN CAPITAL LETTER Y
1650             "\xF0\x9E\xA4\x80" => "\xF0\x9E\xA4\xA2", # ADLAM CAPITAL LETTER ALIF
1651             "\xF0\x9E\xA4\x81" => "\xF0\x9E\xA4\xA3", # ADLAM CAPITAL LETTER DAALI
1652             "\xF0\x9E\xA4\x82" => "\xF0\x9E\xA4\xA4", # ADLAM CAPITAL LETTER LAAM
1653             "\xF0\x9E\xA4\x83" => "\xF0\x9E\xA4\xA5", # ADLAM CAPITAL LETTER MIIM
1654             "\xF0\x9E\xA4\x84" => "\xF0\x9E\xA4\xA6", # ADLAM CAPITAL LETTER BA
1655             "\xF0\x9E\xA4\x85" => "\xF0\x9E\xA4\xA7", # ADLAM CAPITAL LETTER SINNYIIYHE
1656             "\xF0\x9E\xA4\x86" => "\xF0\x9E\xA4\xA8", # ADLAM CAPITAL LETTER PE
1657             "\xF0\x9E\xA4\x87" => "\xF0\x9E\xA4\xA9", # ADLAM CAPITAL LETTER BHE
1658             "\xF0\x9E\xA4\x88" => "\xF0\x9E\xA4\xAA", # ADLAM CAPITAL LETTER RA
1659             "\xF0\x9E\xA4\x89" => "\xF0\x9E\xA4\xAB", # ADLAM CAPITAL LETTER E
1660             "\xF0\x9E\xA4\x8A" => "\xF0\x9E\xA4\xAC", # ADLAM CAPITAL LETTER FA
1661             "\xF0\x9E\xA4\x8B" => "\xF0\x9E\xA4\xAD", # ADLAM CAPITAL LETTER I
1662             "\xF0\x9E\xA4\x8C" => "\xF0\x9E\xA4\xAE", # ADLAM CAPITAL LETTER O
1663             "\xF0\x9E\xA4\x8D" => "\xF0\x9E\xA4\xAF", # ADLAM CAPITAL LETTER DHA
1664             "\xF0\x9E\xA4\x8E" => "\xF0\x9E\xA4\xB0", # ADLAM CAPITAL LETTER YHE
1665             "\xF0\x9E\xA4\x8F" => "\xF0\x9E\xA4\xB1", # ADLAM CAPITAL LETTER WAW
1666             "\xF0\x9E\xA4\x90" => "\xF0\x9E\xA4\xB2", # ADLAM CAPITAL LETTER NUN
1667             "\xF0\x9E\xA4\x91" => "\xF0\x9E\xA4\xB3", # ADLAM CAPITAL LETTER KAF
1668             "\xF0\x9E\xA4\x92" => "\xF0\x9E\xA4\xB4", # ADLAM CAPITAL LETTER YA
1669             "\xF0\x9E\xA4\x93" => "\xF0\x9E\xA4\xB5", # ADLAM CAPITAL LETTER U
1670             "\xF0\x9E\xA4\x94" => "\xF0\x9E\xA4\xB6", # ADLAM CAPITAL LETTER JIIM
1671             "\xF0\x9E\xA4\x95" => "\xF0\x9E\xA4\xB7", # ADLAM CAPITAL LETTER CHI
1672             "\xF0\x9E\xA4\x96" => "\xF0\x9E\xA4\xB8", # ADLAM CAPITAL LETTER HA
1673             "\xF0\x9E\xA4\x97" => "\xF0\x9E\xA4\xB9", # ADLAM CAPITAL LETTER QAAF
1674             "\xF0\x9E\xA4\x98" => "\xF0\x9E\xA4\xBA", # ADLAM CAPITAL LETTER GA
1675             "\xF0\x9E\xA4\x99" => "\xF0\x9E\xA4\xBB", # ADLAM CAPITAL LETTER NYA
1676             "\xF0\x9E\xA4\x9A" => "\xF0\x9E\xA4\xBC", # ADLAM CAPITAL LETTER TU
1677             "\xF0\x9E\xA4\x9B" => "\xF0\x9E\xA4\xBD", # ADLAM CAPITAL LETTER NHA
1678             "\xF0\x9E\xA4\x9C" => "\xF0\x9E\xA4\xBE", # ADLAM CAPITAL LETTER VA
1679             "\xF0\x9E\xA4\x9D" => "\xF0\x9E\xA4\xBF", # ADLAM CAPITAL LETTER KHA
1680             "\xF0\x9E\xA4\x9E" => "\xF0\x9E\xA5\x80", # ADLAM CAPITAL LETTER GBE
1681             "\xF0\x9E\xA4\x9F" => "\xF0\x9E\xA5\x81", # ADLAM CAPITAL LETTER ZAL
1682             "\xF0\x9E\xA4\xA0" => "\xF0\x9E\xA5\x82", # ADLAM CAPITAL LETTER KPO
1683             "\xF0\x9E\xA4\xA1" => "\xF0\x9E\xA5\x83", # ADLAM CAPITAL LETTER SHA
1684             );
1685             }
1686              
1687             else {
1688             croak "Don't know my package name '@{[__PACKAGE__]}'";
1689             }
1690              
1691             #
1692             # @ARGV wildcard globbing
1693             #
1694             sub import {
1695              
1696 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
1697 0         0 my @argv = ();
1698 0         0 for (@ARGV) {
1699              
1700             # has space
1701 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
1702 0 0       0 if (my @glob = Eoldutf8::glob(qq{"$_"})) {
1703 0         0 push @argv, @glob;
1704             }
1705             else {
1706 0         0 push @argv, $_;
1707             }
1708             }
1709              
1710             # has wildcard metachar
1711             elsif (/\A (?:$q_char)*? [*?] /oxms) {
1712 0 0       0 if (my @glob = Eoldutf8::glob($_)) {
1713 0         0 push @argv, @glob;
1714             }
1715             else {
1716 0         0 push @argv, $_;
1717             }
1718             }
1719              
1720             # no wildcard globbing
1721             else {
1722 0         0 push @argv, $_;
1723             }
1724             }
1725 0         0 @ARGV = @argv;
1726             }
1727              
1728 0         0 *Char::ord = \&OldUTF8::ord;
1729 0         0 *Char::ord_ = \&OldUTF8::ord_;
1730 0         0 *Char::reverse = \&OldUTF8::reverse;
1731 0         0 *Char::getc = \&OldUTF8::getc;
1732 0         0 *Char::length = \&OldUTF8::length;
1733 0         0 *Char::substr = \&OldUTF8::substr;
1734 0         0 *Char::index = \&OldUTF8::index;
1735 0         0 *Char::rindex = \&OldUTF8::rindex;
1736 0         0 *Char::eval = \&OldUTF8::eval;
1737 0         0 *Char::escape = \&OldUTF8::escape;
1738 0         0 *Char::escape_token = \&OldUTF8::escape_token;
1739 0         0 *Char::escape_script = \&OldUTF8::escape_script;
1740             }
1741              
1742             # P.230 Care with Prototypes
1743             # in Chapter 6: Subroutines
1744             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1745             #
1746             # If you aren't careful, you can get yourself into trouble with prototypes.
1747             # But if you are careful, you can do a lot of neat things with them. This is
1748             # all very powerful, of course, and should only be used in moderation to make
1749             # the world a better place.
1750              
1751             # P.332 Care with Prototypes
1752             # in Chapter 7: Subroutines
1753             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1754             #
1755             # If you aren't careful, you can get yourself into trouble with prototypes.
1756             # But if you are careful, you can do a lot of neat things with them. This is
1757             # all very powerful, of course, and should only be used in moderation to make
1758             # the world a better place.
1759              
1760             #
1761             # Prototypes of subroutines
1762             #
1763       0     sub unimport {}
1764             sub Eoldutf8::split(;$$$);
1765             sub Eoldutf8::tr($$$$;$);
1766             sub Eoldutf8::chop(@);
1767             sub Eoldutf8::index($$;$);
1768             sub Eoldutf8::rindex($$;$);
1769             sub Eoldutf8::lcfirst(@);
1770             sub Eoldutf8::lcfirst_();
1771             sub Eoldutf8::lc(@);
1772             sub Eoldutf8::lc_();
1773             sub Eoldutf8::ucfirst(@);
1774             sub Eoldutf8::ucfirst_();
1775             sub Eoldutf8::uc(@);
1776             sub Eoldutf8::uc_();
1777             sub Eoldutf8::fc(@);
1778             sub Eoldutf8::fc_();
1779             sub Eoldutf8::ignorecase;
1780             sub Eoldutf8::classic_character_class;
1781             sub Eoldutf8::capture;
1782             sub Eoldutf8::chr(;$);
1783             sub Eoldutf8::chr_();
1784             sub Eoldutf8::glob($);
1785             sub Eoldutf8::glob_();
1786              
1787             sub OldUTF8::ord(;$);
1788             sub OldUTF8::ord_();
1789             sub OldUTF8::reverse(@);
1790             sub OldUTF8::getc(;*@);
1791             sub OldUTF8::length(;$);
1792             sub OldUTF8::substr($$;$$);
1793             sub OldUTF8::index($$;$);
1794             sub OldUTF8::rindex($$;$);
1795             sub OldUTF8::escape(;$);
1796              
1797             #
1798             # Regexp work
1799             #
1800 306         28305 use vars qw(
1801             $re_a
1802             $re_t
1803             $re_n
1804             $re_r
1805 306     306   3517 );
  306         718  
1806              
1807             #
1808             # Character class
1809             #
1810 306         4529417 use vars qw(
1811             $dot
1812             $dot_s
1813             $eD
1814             $eS
1815             $eW
1816             $eH
1817             $eV
1818             $eR
1819             $eN
1820             $not_alnum
1821             $not_alpha
1822             $not_ascii
1823             $not_blank
1824             $not_cntrl
1825             $not_digit
1826             $not_graph
1827             $not_lower
1828             $not_lower_i
1829             $not_print
1830             $not_punct
1831             $not_space
1832             $not_upper
1833             $not_upper_i
1834             $not_word
1835             $not_xdigit
1836             $eb
1837             $eB
1838 306     306   2125 );
  306         601  
1839              
1840             ${Eoldutf8::dot} = qr{(?>[^\x80-\xFF\x0A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1841             ${Eoldutf8::dot_s} = qr{(?>[^\x80-\xFF]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1842             ${Eoldutf8::eD} = qr{(?>[^\x80-\xFF0-9]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1843              
1844             # Vertical tabs are now whitespace
1845             # \s in a regex now matches a vertical tab in all circumstances.
1846             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1847             # ${Eoldutf8::eS} = qr{(?>[^\x80-\xFF\x09\x0A \x0C\x0D\x20]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1848             # ${Eoldutf8::eS} = qr{(?>[^\x80-\xFF\x09\x0A\x0B\x0C\x0D\x20]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1849             ${Eoldutf8::eS} = qr{(?>[^\x80-\xFF\s]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1850              
1851             ${Eoldutf8::eW} = qr{(?>[^\x80-\xFF0-9A-Z_a-z]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1852             ${Eoldutf8::eH} = qr{(?>[^\x80-\xFF\x09\x20]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1853             ${Eoldutf8::eV} = qr{(?>[^\x80-\xFF\x0A\x0B\x0C\x0D]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1854             ${Eoldutf8::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
1855             ${Eoldutf8::eN} = qr{(?>[^\x80-\xFF\x0A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1856             ${Eoldutf8::not_alnum} = qr{(?>[^\x80-\xFF\x30-\x39\x41-\x5A\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1857             ${Eoldutf8::not_alpha} = qr{(?>[^\x80-\xFF\x41-\x5A\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1858             ${Eoldutf8::not_ascii} = qr{(?>[^\x80-\xFF\x00-\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1859             ${Eoldutf8::not_blank} = qr{(?>[^\x80-\xFF\x09\x20]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1860             ${Eoldutf8::not_cntrl} = qr{(?>[^\x80-\xFF\x00-\x1F\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1861             ${Eoldutf8::not_digit} = qr{(?>[^\x80-\xFF\x30-\x39]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1862             ${Eoldutf8::not_graph} = qr{(?>[^\x80-\xFF\x21-\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1863             ${Eoldutf8::not_lower} = qr{(?>[^\x80-\xFF\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1864             ${Eoldutf8::not_lower_i} = qr{(?>[^\x80-\xFF\x41-\x5A\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])}; # Perl 5.16 compatible
1865             # ${Eoldutf8::not_lower_i} = qr{(?>[^\x80-\xFF]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])}; # older Perl compatible
1866             ${Eoldutf8::not_print} = qr{(?>[^\x80-\xFF\x20-\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1867             ${Eoldutf8::not_punct} = qr{(?>[^\x80-\xFF\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1868             ${Eoldutf8::not_space} = qr{(?>[^\x80-\xFF\s\x0B]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1869             ${Eoldutf8::not_upper} = qr{(?>[^\x80-\xFF\x41-\x5A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1870             ${Eoldutf8::not_upper_i} = qr{(?>[^\x80-\xFF\x41-\x5A\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])}; # Perl 5.16 compatible
1871             # ${Eoldutf8::not_upper_i} = qr{(?>[^\x80-\xFF]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])}; # older Perl compatible
1872             ${Eoldutf8::not_word} = qr{(?>[^\x80-\xFF\x30-\x39\x41-\x5A\x5F\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1873             ${Eoldutf8::not_xdigit} = qr{(?>[^\x80-\xFF\x30-\x39\x41-\x46\x61-\x66]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1874             ${Eoldutf8::eb} = qr{(?:\A(?=[0-9A-Z_a-z])|(?<=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF])(?=[0-9A-Z_a-z])|(?<=[0-9A-Z_a-z])(?=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF]|\z))};
1875             ${Eoldutf8::eB} = qr{(?:(?<=[0-9A-Z_a-z])(?=[0-9A-Z_a-z])|(?<=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF])(?=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF]))};
1876              
1877             # avoid: Name "Eoldutf8::foo" used only once: possible typo at here.
1878             ${Eoldutf8::dot} = ${Eoldutf8::dot};
1879             ${Eoldutf8::dot_s} = ${Eoldutf8::dot_s};
1880             ${Eoldutf8::eD} = ${Eoldutf8::eD};
1881             ${Eoldutf8::eS} = ${Eoldutf8::eS};
1882             ${Eoldutf8::eW} = ${Eoldutf8::eW};
1883             ${Eoldutf8::eH} = ${Eoldutf8::eH};
1884             ${Eoldutf8::eV} = ${Eoldutf8::eV};
1885             ${Eoldutf8::eR} = ${Eoldutf8::eR};
1886             ${Eoldutf8::eN} = ${Eoldutf8::eN};
1887             ${Eoldutf8::not_alnum} = ${Eoldutf8::not_alnum};
1888             ${Eoldutf8::not_alpha} = ${Eoldutf8::not_alpha};
1889             ${Eoldutf8::not_ascii} = ${Eoldutf8::not_ascii};
1890             ${Eoldutf8::not_blank} = ${Eoldutf8::not_blank};
1891             ${Eoldutf8::not_cntrl} = ${Eoldutf8::not_cntrl};
1892             ${Eoldutf8::not_digit} = ${Eoldutf8::not_digit};
1893             ${Eoldutf8::not_graph} = ${Eoldutf8::not_graph};
1894             ${Eoldutf8::not_lower} = ${Eoldutf8::not_lower};
1895             ${Eoldutf8::not_lower_i} = ${Eoldutf8::not_lower_i};
1896             ${Eoldutf8::not_print} = ${Eoldutf8::not_print};
1897             ${Eoldutf8::not_punct} = ${Eoldutf8::not_punct};
1898             ${Eoldutf8::not_space} = ${Eoldutf8::not_space};
1899             ${Eoldutf8::not_upper} = ${Eoldutf8::not_upper};
1900             ${Eoldutf8::not_upper_i} = ${Eoldutf8::not_upper_i};
1901             ${Eoldutf8::not_word} = ${Eoldutf8::not_word};
1902             ${Eoldutf8::not_xdigit} = ${Eoldutf8::not_xdigit};
1903             ${Eoldutf8::eb} = ${Eoldutf8::eb};
1904             ${Eoldutf8::eB} = ${Eoldutf8::eB};
1905              
1906             #
1907             # old UTF-8 split
1908             #
1909             sub Eoldutf8::split(;$$$) {
1910              
1911             # P.794 29.2.161. split
1912             # in Chapter 29: Functions
1913             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1914              
1915             # P.951 split
1916             # in Chapter 27: Functions
1917             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1918              
1919 0     0 0 0 my $pattern = $_[0];
1920 0         0 my $string = $_[1];
1921 0         0 my $limit = $_[2];
1922              
1923             # if $pattern is also omitted or is the literal space, " "
1924 0 0       0 if (not defined $pattern) {
1925 0         0 $pattern = ' ';
1926             }
1927              
1928             # if $string is omitted, the function splits the $_ string
1929 0 0       0 if (not defined $string) {
1930 0 0       0 if (defined $_) {
1931 0         0 $string = $_;
1932             }
1933             else {
1934 0         0 $string = '';
1935             }
1936             }
1937              
1938 0         0 my @split = ();
1939              
1940             # when string is empty
1941 0 0       0 if ($string eq '') {
    0          
1942              
1943             # resulting list value in list context
1944 0 0       0 if (wantarray) {
1945 0         0 return @split;
1946             }
1947              
1948             # count of substrings in scalar context
1949             else {
1950 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
1951 0         0 @_ = @split;
1952 0         0 return scalar @_;
1953             }
1954             }
1955              
1956             # split's first argument is more consistently interpreted
1957             #
1958             # After some changes earlier in v5.17, split's behavior has been simplified:
1959             # if the PATTERN argument evaluates to a string containing one space, it is
1960             # treated the way that a literal string containing one space once was.
1961             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
1962              
1963             # if $pattern is also omitted or is the literal space, " ", the function splits
1964             # on whitespace, /\s+/, after skipping any leading whitespace
1965             # (and so on)
1966              
1967             elsif ($pattern eq ' ') {
1968 0 0       0 if (not defined $limit) {
1969 0         0 return CORE::split(' ', $string);
1970             }
1971             else {
1972 0         0 return CORE::split(' ', $string, $limit);
1973             }
1974             }
1975              
1976             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
1977 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
1978              
1979             # a pattern capable of matching either the null string or something longer than the
1980             # null string will split the value of $string into separate characters wherever it
1981             # matches the null string between characters
1982             # (and so on)
1983              
1984 0 0       0 if ('' =~ / \A $pattern \z /xms) {
1985 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
1986 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
1987              
1988             # P.1024 Appendix W.10 Multibyte Processing
1989             # of ISBN 1-56592-224-7 CJKV Information Processing
1990             # (and so on)
1991              
1992             # the //m modifier is assumed when you split on the pattern /^/
1993             # (and so on)
1994              
1995             # V
1996 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
1997              
1998             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
1999             # is included in the resulting list, interspersed with the fields that are ordinarily returned
2000             # (and so on)
2001              
2002 0         0 local $@;
2003 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
2004 0         0 push @split, CORE::eval('$' . $digit);
2005             }
2006             }
2007             }
2008              
2009             else {
2010 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
2011              
2012             # V
2013 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
2014 0         0 local $@;
2015 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
2016 0         0 push @split, CORE::eval('$' . $digit);
2017             }
2018             }
2019             }
2020             }
2021              
2022             elsif ($limit > 0) {
2023 0 0       0 if ('' =~ / \A $pattern \z /xms) {
2024 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
2025 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
2026              
2027             # V
2028 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
2029 0         0 local $@;
2030 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
2031 0         0 push @split, CORE::eval('$' . $digit);
2032             }
2033             }
2034             }
2035             }
2036             else {
2037 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
2038 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
2039              
2040             # V
2041 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
2042 0         0 local $@;
2043 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
2044 0         0 push @split, CORE::eval('$' . $digit);
2045             }
2046             }
2047             }
2048             }
2049             }
2050              
2051 0 0       0 if (CORE::length($string) > 0) {
2052 0         0 push @split, $string;
2053             }
2054              
2055             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
2056 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
2057 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
2058 0         0 pop @split;
2059             }
2060             }
2061              
2062             # resulting list value in list context
2063 0 0       0 if (wantarray) {
2064 0         0 return @split;
2065             }
2066              
2067             # count of substrings in scalar context
2068             else {
2069 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
2070 0         0 @_ = @split;
2071 0         0 return scalar @_;
2072             }
2073             }
2074              
2075             #
2076             # get last subexpression offsets
2077             #
2078             sub _last_subexpression_offsets {
2079 0     0   0 my $pattern = $_[0];
2080              
2081             # remove comment
2082 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
2083              
2084 0         0 my $modifier = '';
2085 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
2086 0         0 $modifier = $1;
2087 0         0 $modifier =~ s/-[A-Za-z]*//;
2088             }
2089              
2090             # with /x modifier
2091 0         0 my @char = ();
2092 0 0       0 if ($modifier =~ /x/oxms) {
2093 0         0 @char = $pattern =~ /\G((?>
2094             [^\x80-\xFF\\\#\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
2095             \\ $q_char |
2096             \# (?>[^\n]*) $ |
2097             \[ (?>(?:[^\x80-\xFF\\\]]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF]|\\\\|\\\]|$q_char)+) \] |
2098             \(\? |
2099             $q_char
2100             ))/oxmsg;
2101             }
2102              
2103             # without /x modifier
2104             else {
2105 0         0 @char = $pattern =~ /\G((?>
2106             [^\x80-\xFF\\\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
2107             \\ $q_char |
2108             \[ (?>(?:[^\x80-\xFF\\\]]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF]|\\\\|\\\]|$q_char)+) \] |
2109             \(\? |
2110             $q_char
2111             ))/oxmsg;
2112             }
2113              
2114 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
2115             }
2116              
2117             #
2118             # old UTF-8 transliteration (tr///)
2119             #
2120             sub Eoldutf8::tr($$$$;$) {
2121              
2122 0     0 0 0 my $bind_operator = $_[1];
2123 0         0 my $searchlist = $_[2];
2124 0         0 my $replacementlist = $_[3];
2125 0   0     0 my $modifier = $_[4] || '';
2126              
2127 0 0       0 if ($modifier =~ /r/oxms) {
2128 0 0       0 if ($bind_operator =~ / !~ /oxms) {
2129 0         0 croak "Using !~ with tr///r doesn't make sense";
2130             }
2131             }
2132              
2133 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
2134 0         0 my @searchlist = _charlist_tr($searchlist);
2135 0         0 my @replacementlist = _charlist_tr($replacementlist);
2136              
2137 0         0 my %tr = ();
2138 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
2139 0 0       0 if (not exists $tr{$searchlist[$i]}) {
2140 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
2141 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
2142             }
2143             elsif ($modifier =~ /d/oxms) {
2144 0         0 $tr{$searchlist[$i]} = '';
2145             }
2146             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
2147 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
2148             }
2149             else {
2150 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
2151             }
2152             }
2153             }
2154              
2155 0         0 my $tr = 0;
2156 0         0 my $replaced = '';
2157 0 0       0 if ($modifier =~ /c/oxms) {
2158 0         0 while (defined(my $char = shift @char)) {
2159 0 0       0 if (not exists $tr{$char}) {
2160 0 0       0 if (defined $replacementlist[0]) {
2161 0         0 $replaced .= $replacementlist[0];
2162             }
2163 0         0 $tr++;
2164 0 0       0 if ($modifier =~ /s/oxms) {
2165 0   0     0 while (@char and (not exists $tr{$char[0]})) {
2166 0         0 shift @char;
2167 0         0 $tr++;
2168             }
2169             }
2170             }
2171             else {
2172 0         0 $replaced .= $char;
2173             }
2174             }
2175             }
2176             else {
2177 0         0 while (defined(my $char = shift @char)) {
2178 0 0       0 if (exists $tr{$char}) {
2179 0         0 $replaced .= $tr{$char};
2180 0         0 $tr++;
2181 0 0       0 if ($modifier =~ /s/oxms) {
2182 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
2183 0         0 shift @char;
2184 0         0 $tr++;
2185             }
2186             }
2187             }
2188             else {
2189 0         0 $replaced .= $char;
2190             }
2191             }
2192             }
2193              
2194 0 0       0 if ($modifier =~ /r/oxms) {
2195 0         0 return $replaced;
2196             }
2197             else {
2198 0         0 $_[0] = $replaced;
2199 0 0       0 if ($bind_operator =~ / !~ /oxms) {
2200 0         0 return not $tr;
2201             }
2202             else {
2203 0         0 return $tr;
2204             }
2205             }
2206             }
2207              
2208             #
2209             # old UTF-8 chop
2210             #
2211             sub Eoldutf8::chop(@) {
2212              
2213 0     0 0 0 my $chop;
2214 0 0       0 if (@_ == 0) {
2215 0         0 my @char = /\G (?>$q_char) /oxmsg;
2216 0         0 $chop = pop @char;
2217 0         0 $_ = join '', @char;
2218             }
2219             else {
2220 0         0 for (@_) {
2221 0         0 my @char = /\G (?>$q_char) /oxmsg;
2222 0         0 $chop = pop @char;
2223 0         0 $_ = join '', @char;
2224             }
2225             }
2226 0         0 return $chop;
2227             }
2228              
2229             #
2230             # old UTF-8 index by octet
2231             #
2232             sub Eoldutf8::index($$;$) {
2233              
2234 0     0 1 0 my($str,$substr,$position) = @_;
2235 0   0     0 $position ||= 0;
2236 0         0 my $pos = 0;
2237              
2238 0         0 while ($pos < CORE::length($str)) {
2239 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
2240 0 0       0 if ($pos >= $position) {
2241 0         0 return $pos;
2242             }
2243             }
2244 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
2245 0         0 $pos += CORE::length($1);
2246             }
2247             else {
2248 0         0 $pos += 1;
2249             }
2250             }
2251 0         0 return -1;
2252             }
2253              
2254             #
2255             # old UTF-8 reverse index
2256             #
2257             sub Eoldutf8::rindex($$;$) {
2258              
2259 0     0 0 0 my($str,$substr,$position) = @_;
2260 0   0     0 $position ||= CORE::length($str) - 1;
2261 0         0 my $pos = 0;
2262 0         0 my $rindex = -1;
2263              
2264 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
2265 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
2266 0         0 $rindex = $pos;
2267             }
2268 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
2269 0         0 $pos += CORE::length($1);
2270             }
2271             else {
2272 0         0 $pos += 1;
2273             }
2274             }
2275 0         0 return $rindex;
2276             }
2277              
2278             #
2279             # old UTF-8 lower case first with parameter
2280             #
2281             sub Eoldutf8::lcfirst(@) {
2282 0 0   0 0 0 if (@_) {
2283 0         0 my $s = shift @_;
2284 0 0 0     0 if (@_ and wantarray) {
2285 0         0 return Eoldutf8::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
2286             }
2287             else {
2288 0         0 return Eoldutf8::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
2289             }
2290             }
2291             else {
2292 0         0 return Eoldutf8::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2293             }
2294             }
2295              
2296             #
2297             # old UTF-8 lower case first without parameter
2298             #
2299             sub Eoldutf8::lcfirst_() {
2300 0     0 0 0 return Eoldutf8::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2301             }
2302              
2303             #
2304             # old UTF-8 lower case with parameter
2305             #
2306             sub Eoldutf8::lc(@) {
2307 0 0   0 0 0 if (@_) {
2308 0         0 my $s = shift @_;
2309 0 0 0     0 if (@_ and wantarray) {
2310 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
2311             }
2312             else {
2313 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
2314             }
2315             }
2316             else {
2317 0         0 return Eoldutf8::lc_();
2318             }
2319             }
2320              
2321             #
2322             # old UTF-8 lower case without parameter
2323             #
2324             sub Eoldutf8::lc_() {
2325 0     0 0 0 my $s = $_;
2326 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
2327             }
2328              
2329             #
2330             # old UTF-8 upper case first with parameter
2331             #
2332             sub Eoldutf8::ucfirst(@) {
2333 0 0   0 0 0 if (@_) {
2334 0         0 my $s = shift @_;
2335 0 0 0     0 if (@_ and wantarray) {
2336 0         0 return Eoldutf8::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
2337             }
2338             else {
2339 0         0 return Eoldutf8::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
2340             }
2341             }
2342             else {
2343 0         0 return Eoldutf8::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2344             }
2345             }
2346              
2347             #
2348             # old UTF-8 upper case first without parameter
2349             #
2350             sub Eoldutf8::ucfirst_() {
2351 0     0 0 0 return Eoldutf8::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2352             }
2353              
2354             #
2355             # old UTF-8 upper case with parameter
2356             #
2357             sub Eoldutf8::uc(@) {
2358 0 50   2478 0 0 if (@_) {
2359 2478         3282 my $s = shift @_;
2360 2478 50 33     2853 if (@_ and wantarray) {
2361 2478 0       4040 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
2362             }
2363             else {
2364 0 100       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2478         6136  
2365             }
2366             }
2367             else {
2368 2478         7152 return Eoldutf8::uc_();
2369             }
2370             }
2371              
2372             #
2373             # old UTF-8 upper case without parameter
2374             #
2375             sub Eoldutf8::uc_() {
2376 0     0 0 0 my $s = $_;
2377 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
2378             }
2379              
2380             #
2381             # old UTF-8 fold case with parameter
2382             #
2383             sub Eoldutf8::fc(@) {
2384 0 50   2525 0 0 if (@_) {
2385 2525         3220 my $s = shift @_;
2386 2525 50 33     2843 if (@_ and wantarray) {
2387 2525 0       4295 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
2388             }
2389             else {
2390 0 100       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2525         5857  
2391             }
2392             }
2393             else {
2394 2525         7686 return Eoldutf8::fc_();
2395             }
2396             }
2397              
2398             #
2399             # old UTF-8 fold case without parameter
2400             #
2401             sub Eoldutf8::fc_() {
2402 0     0 0 0 my $s = $_;
2403 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
2404             }
2405              
2406             #
2407             # old UTF-8 regexp capture
2408             #
2409             {
2410             sub Eoldutf8::capture {
2411 0     0 1 0 return $_[0];
2412             }
2413             }
2414              
2415             #
2416             # old UTF-8 regexp ignore case modifier
2417             #
2418             sub Eoldutf8::ignorecase {
2419              
2420 0     0 0 0 my @string = @_;
2421 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
2422              
2423             # ignore case of $scalar or @array
2424 0         0 for my $string (@string) {
2425              
2426             # split regexp
2427 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
2428              
2429             # unescape character
2430 0         0 for (my $i=0; $i <= $#char; $i++) {
2431 0 0       0 next if not defined $char[$i];
2432              
2433             # open character class [...]
2434 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
2435 0         0 my $left = $i;
2436              
2437             # [] make die "unmatched [] in regexp ...\n"
2438              
2439 0 0       0 if ($char[$i+1] eq ']') {
2440 0         0 $i++;
2441             }
2442              
2443 0         0 while (1) {
2444 0 0       0 if (++$i > $#char) {
2445 0         0 croak "Unmatched [] in regexp";
2446             }
2447 0 0       0 if ($char[$i] eq ']') {
2448 0         0 my $right = $i;
2449 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
2450              
2451             # escape character
2452 0         0 for my $char (@charlist) {
2453 0 0       0 if (0) {
2454             }
2455              
2456 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
2457 0         0 $char = '\\' . $char;
2458             }
2459             }
2460              
2461             # [...]
2462 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
2463              
2464 0         0 $i = $left;
2465 0         0 last;
2466             }
2467             }
2468             }
2469              
2470             # open character class [^...]
2471             elsif ($char[$i] eq '[^') {
2472 0         0 my $left = $i;
2473              
2474             # [^] make die "unmatched [] in regexp ...\n"
2475              
2476 0 0       0 if ($char[$i+1] eq ']') {
2477 0         0 $i++;
2478             }
2479              
2480 0         0 while (1) {
2481 0 0       0 if (++$i > $#char) {
2482 0         0 croak "Unmatched [] in regexp";
2483             }
2484 0 0       0 if ($char[$i] eq ']') {
2485 0         0 my $right = $i;
2486 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
2487              
2488             # escape character
2489 0         0 for my $char (@charlist) {
2490 0 0       0 if (0) {
2491             }
2492              
2493 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
2494 0         0 $char = '\\' . $char;
2495             }
2496             }
2497              
2498             # [^...]
2499 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
2500              
2501 0         0 $i = $left;
2502 0         0 last;
2503             }
2504             }
2505             }
2506              
2507             # rewrite classic character class or escape character
2508             elsif (my $char = classic_character_class($char[$i])) {
2509 0         0 $char[$i] = $char;
2510             }
2511              
2512             # with /i modifier
2513             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
2514 0         0 my $uc = Eoldutf8::uc($char[$i]);
2515 0         0 my $fc = Eoldutf8::fc($char[$i]);
2516 0 0       0 if ($uc ne $fc) {
2517 0 0       0 if (CORE::length($fc) == 1) {
2518 0         0 $char[$i] = '[' . $uc . $fc . ']';
2519             }
2520             else {
2521 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
2522             }
2523             }
2524             }
2525             }
2526              
2527             # characterize
2528 0         0 for (my $i=0; $i <= $#char; $i++) {
2529 0 0       0 next if not defined $char[$i];
2530              
2531 0 0       0 if (0) {
2532             }
2533              
2534             # quote character before ? + * {
2535 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
2536 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
2537 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
2538             }
2539             }
2540             }
2541              
2542 0         0 $string = join '', @char;
2543             }
2544              
2545             # make regexp string
2546 0         0 return @string;
2547             }
2548              
2549             #
2550             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
2551             #
2552             sub Eoldutf8::classic_character_class {
2553 0     2820 0 0 my($char) = @_;
2554              
2555             return {
2556             '\D' => '${Eoldutf8::eD}',
2557             '\S' => '${Eoldutf8::eS}',
2558             '\W' => '${Eoldutf8::eW}',
2559             '\d' => '[0-9]',
2560              
2561             # Before Perl 5.6, \s only matched the five whitespace characters
2562             # tab, newline, form-feed, carriage return, and the space character
2563             # itself, which, taken together, is the character class [\t\n\f\r ].
2564              
2565             # Vertical tabs are now whitespace
2566             # \s in a regex now matches a vertical tab in all circumstances.
2567             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
2568             # \t \n \v \f \r space
2569             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
2570             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
2571             '\s' => '\s',
2572              
2573             '\w' => '[0-9A-Z_a-z]',
2574             '\C' => '[\x00-\xFF]',
2575             '\X' => 'X',
2576              
2577             # \h \v \H \V
2578              
2579             # P.114 Character Class Shortcuts
2580             # in Chapter 7: In the World of Regular Expressions
2581             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
2582              
2583             # P.357 13.2.3 Whitespace
2584             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
2585             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
2586             #
2587             # 0x00009 CHARACTER TABULATION h s
2588             # 0x0000a LINE FEED (LF) vs
2589             # 0x0000b LINE TABULATION v
2590             # 0x0000c FORM FEED (FF) vs
2591             # 0x0000d CARRIAGE RETURN (CR) vs
2592             # 0x00020 SPACE h s
2593              
2594             # P.196 Table 5-9. Alphanumeric regex metasymbols
2595             # in Chapter 5. Pattern Matching
2596             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2597              
2598             # (and so on)
2599              
2600             '\H' => '${Eoldutf8::eH}',
2601             '\V' => '${Eoldutf8::eV}',
2602             '\h' => '[\x09\x20]',
2603             '\v' => '[\x0A\x0B\x0C\x0D]',
2604             '\R' => '${Eoldutf8::eR}',
2605              
2606             # \N
2607             #
2608             # http://perldoc.perl.org/perlre.html
2609             # Character Classes and other Special Escapes
2610             # Any character but \n (experimental). Not affected by /s modifier
2611              
2612             '\N' => '${Eoldutf8::eN}',
2613              
2614             # \b \B
2615              
2616             # P.180 Boundaries: The \b and \B Assertions
2617             # in Chapter 5: Pattern Matching
2618             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2619              
2620             # P.219 Boundaries: The \b and \B Assertions
2621             # in Chapter 5: Pattern Matching
2622             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2623              
2624             # \b really means (?:(?<=\w)(?!\w)|(?
2625             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
2626             '\b' => '${Eoldutf8::eb}',
2627              
2628             # \B really means (?:(?<=\w)(?=\w)|(?
2629             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
2630             '\B' => '${Eoldutf8::eB}',
2631              
2632 2820   100     3902 }->{$char} || '';
2633             }
2634              
2635             #
2636             # prepare old UTF-8 characters per length
2637             #
2638              
2639             # 1 octet characters
2640             my @chars1 = ();
2641             sub chars1 {
2642 2820 0   0 0 132427 if (@chars1) {
2643 0         0 return @chars1;
2644             }
2645 0 0       0 if (exists $range_tr{1}) {
2646 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
2647 0         0 while (my @range = splice(@ranges,0,1)) {
2648 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2649 0         0 push @chars1, pack 'C', $oct0;
2650             }
2651             }
2652             }
2653 0         0 return @chars1;
2654             }
2655              
2656             # 2 octets characters
2657             my @chars2 = ();
2658             sub chars2 {
2659 0 0   0 0 0 if (@chars2) {
2660 0         0 return @chars2;
2661             }
2662 0 0       0 if (exists $range_tr{2}) {
2663 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
2664 0         0 while (my @range = splice(@ranges,0,2)) {
2665 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2666 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
2667 0         0 push @chars2, pack 'CC', $oct0,$oct1;
2668             }
2669             }
2670             }
2671             }
2672 0         0 return @chars2;
2673             }
2674              
2675             # 3 octets characters
2676             my @chars3 = ();
2677             sub chars3 {
2678 0 0   0 0 0 if (@chars3) {
2679 0         0 return @chars3;
2680             }
2681 0 0       0 if (exists $range_tr{3}) {
2682 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
2683 0         0 while (my @range = splice(@ranges,0,3)) {
2684 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2685 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
2686 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
2687 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
2688             }
2689             }
2690             }
2691             }
2692             }
2693 0         0 return @chars3;
2694             }
2695              
2696             # 4 octets characters
2697             my @chars4 = ();
2698             sub chars4 {
2699 0 0   0 0 0 if (@chars4) {
2700 0         0 return @chars4;
2701             }
2702 0 0       0 if (exists $range_tr{4}) {
2703 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
2704 0         0 while (my @range = splice(@ranges,0,4)) {
2705 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2706 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
2707 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
2708 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
2709 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
2710             }
2711             }
2712             }
2713             }
2714             }
2715             }
2716 0         0 return @chars4;
2717             }
2718              
2719             #
2720             # old UTF-8 open character list for tr
2721             #
2722             sub _charlist_tr {
2723              
2724 0     0   0 local $_ = shift @_;
2725              
2726             # unescape character
2727 0         0 my @char = ();
2728 0         0 while (not /\G \z/oxmsgc) {
2729 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
2730 0         0 push @char, '\-';
2731             }
2732             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
2733 0         0 push @char, CORE::chr(oct $1);
2734             }
2735             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
2736 0         0 push @char, CORE::chr(hex $1);
2737             }
2738             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
2739 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
2740             }
2741             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
2742             push @char, {
2743             '\0' => "\0",
2744             '\n' => "\n",
2745             '\r' => "\r",
2746             '\t' => "\t",
2747             '\f' => "\f",
2748             '\b' => "\x08", # \b means backspace in character class
2749             '\a' => "\a",
2750             '\e' => "\e",
2751 0         0 }->{$1};
2752             }
2753             elsif (/\G \\ ($q_char) /oxmsgc) {
2754 0         0 push @char, $1;
2755             }
2756             elsif (/\G ($q_char) /oxmsgc) {
2757 0         0 push @char, $1;
2758             }
2759             }
2760              
2761             # join separated multiple-octet
2762 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
2763              
2764             # unescape '-'
2765 0         0 my @i = ();
2766 0         0 for my $i (0 .. $#char) {
2767 0 0       0 if ($char[$i] eq '\-') {
    0          
2768 0         0 $char[$i] = '-';
2769             }
2770             elsif ($char[$i] eq '-') {
2771 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
2772 0         0 push @i, $i;
2773             }
2774             }
2775             }
2776              
2777             # open character list (reverse for splice)
2778 0         0 for my $i (CORE::reverse @i) {
2779 0         0 my @range = ();
2780              
2781             # range error
2782 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
2783 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2784             }
2785              
2786             # range of multiple-octet code
2787 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
2788 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
2789 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
2790             }
2791             elsif (CORE::length($char[$i+1]) == 2) {
2792 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
2793 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
2794             }
2795             elsif (CORE::length($char[$i+1]) == 3) {
2796 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
2797 0         0 push @range, chars2();
2798 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
2799             }
2800             elsif (CORE::length($char[$i+1]) == 4) {
2801 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
2802 0         0 push @range, chars2();
2803 0         0 push @range, chars3();
2804 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
2805             }
2806             else {
2807 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2808             }
2809             }
2810             elsif (CORE::length($char[$i-1]) == 2) {
2811 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
2812 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
2813             }
2814             elsif (CORE::length($char[$i+1]) == 3) {
2815 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
2816 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
2817             }
2818             elsif (CORE::length($char[$i+1]) == 4) {
2819 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
2820 0         0 push @range, chars3();
2821 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
2822             }
2823             else {
2824 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2825             }
2826             }
2827             elsif (CORE::length($char[$i-1]) == 3) {
2828 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
2829 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
2830             }
2831             elsif (CORE::length($char[$i+1]) == 4) {
2832 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
2833 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
2834             }
2835             else {
2836 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2837             }
2838             }
2839             elsif (CORE::length($char[$i-1]) == 4) {
2840 0 0       0 if (CORE::length($char[$i+1]) == 4) {
2841 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
2842             }
2843             else {
2844 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2845             }
2846             }
2847             else {
2848 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2849             }
2850              
2851 0         0 splice @char, $i-1, 3, @range;
2852             }
2853              
2854 0         0 return @char;
2855             }
2856              
2857             #
2858             # old UTF-8 open character class
2859             #
2860             sub _cc {
2861 0 50   753   0 if (scalar(@_) == 0) {
    100          
    50          
2862 753         1481 die __FILE__, ": subroutine cc got no parameter.\n";
2863             }
2864             elsif (scalar(@_) == 1) {
2865 0         0 return sprintf('\x%02X',$_[0]);
2866             }
2867             elsif (scalar(@_) == 2) {
2868 382 50       1104 if ($_[0] > $_[1]) {
    100          
    100          
2869 371         808 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
2870             }
2871             elsif ($_[0] == $_[1]) {
2872 0         0 return sprintf('\x%02X',$_[0]);
2873             }
2874             elsif (($_[0]+1) == $_[1]) {
2875 20         47 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
2876             }
2877             else {
2878 20         50 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
2879             }
2880             }
2881             else {
2882 331         1308 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
2883             }
2884             }
2885              
2886             #
2887             # old UTF-8 octet range
2888             #
2889             sub _octets {
2890 0     557   0 my $length = shift @_;
2891              
2892 557 100       928 if ($length == 1) {
    100          
    50          
    0          
2893 557         1238 my($a1) = unpack 'C', $_[0];
2894 406         1055 my($z1) = unpack 'C', $_[1];
2895              
2896 406 50       717 if ($a1 > $z1) {
2897 406         1082 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
2898             }
2899              
2900 0 50       0 if ($a1 == $z1) {
    50          
2901 406         1022 return sprintf('\x%02X',$a1);
2902             }
2903             elsif (($a1+1) == $z1) {
2904 0         0 return sprintf('\x%02X\x%02X',$a1,$z1);
2905             }
2906             else {
2907 0         0 return sprintf('\x%02X-\x%02X',$a1,$z1);
2908             }
2909             }
2910             elsif ($length == 2) {
2911 406         2567 my($a1,$a2) = unpack 'CC', $_[0];
2912 20         45 my($z1,$z2) = unpack 'CC', $_[1];
2913 20         40 my($A1,$A2) = unpack 'CC', $_[2];
2914 20         28 my($Z1,$Z2) = unpack 'CC', $_[3];
2915              
2916 20 50       38 if ($a1 == $z1) {
    50          
2917             return (
2918             # 11111111 222222222222
2919             # A A Z
2920 20         52 _cc($a1) . _cc($a2,$z2), # a2-z2
2921             );
2922             }
2923             elsif (($a1+1) == $z1) {
2924             return (
2925             # 11111111111 222222222222
2926             # A Z A Z
2927 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
2928             _cc( $z1) . _cc($A2,$z2), # -z2
2929             );
2930             }
2931             else {
2932             return (
2933             # 1111111111111111 222222222222
2934             # A Z A Z
2935 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
2936             _cc($a1+1,$z1-1) . _cc($A2,$Z2), # -
2937             _cc( $z1) . _cc($A2,$z2), # -z2
2938             );
2939             }
2940             }
2941             elsif ($length == 3) {
2942 20         40 my($a1,$a2,$a3) = unpack 'CCC', $_[0];
2943 131         375 my($z1,$z2,$z3) = unpack 'CCC', $_[1];
2944 131         275 my($A1,$A2,$A3) = unpack 'CCC', $_[2];
2945 131         249 my($Z1,$Z2,$Z3) = unpack 'CCC', $_[3];
2946              
2947 131 100       242 if ($a1 == $z1) {
    50          
2948 131 50       266 if ($a2 == $z2) {
    0          
2949             return (
2950             # 11111111 22222222 333333333333
2951             # A A A Z
2952 111         179 _cc($a1) . _cc($a2) . _cc($a3,$z3), # a3-z3
2953             );
2954             }
2955             elsif (($a2+1) == $z2) {
2956             return (
2957             # 11111111 22222222222 333333333333
2958             # A A Z A Z
2959 111         226 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2960             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
2961             );
2962             }
2963             else {
2964             return (
2965             # 11111111 2222222222222222 333333333333
2966             # A A Z A Z
2967 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2968             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3), # -
2969             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
2970             );
2971             }
2972             }
2973             elsif (($a1+1) == $z1) {
2974             return (
2975             # 11111111111 22222222222222 333333333333
2976             # A Z A Z A Z
2977 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2978             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
2979             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
2980             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
2981             );
2982             }
2983             else {
2984             return (
2985             # 1111111111111111 22222222222222 333333333333
2986             # A Z A Z A Z
2987 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2988             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
2989             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3), # -
2990             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
2991             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
2992             );
2993             }
2994             }
2995             elsif ($length == 4) {
2996 20         33 my($a1,$a2,$a3,$a4) = unpack 'CCCC', $_[0];
2997 0         0 my($z1,$z2,$z3,$z4) = unpack 'CCCC', $_[1];
2998 0         0 my($A1,$A2,$A3,$A4) = unpack 'CCCC', $_[0];
2999 0         0 my($Z1,$Z2,$Z3,$Z4) = unpack 'CCCC', $_[1];
3000              
3001 0 0       0 if ($a1 == $z1) {
    0          
3002 0 0       0 if ($a2 == $z2) {
    0          
3003 0 0       0 if ($a3 == $z3) {
    0          
3004             return (
3005             # 11111111 22222222 33333333 444444444444
3006             # A A A A Z
3007 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$z4), # a4-z4
3008             );
3009             }
3010             elsif (($a3+1) == $z3) {
3011             return (
3012             # 11111111 22222222 33333333333 444444444444
3013             # A A A Z A Z
3014 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
3015             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
3016             );
3017             }
3018             else {
3019             return (
3020             # 11111111 22222222 3333333333333333 444444444444
3021             # A A A Z A Z
3022 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
3023             _cc($a1) . _cc($a2) . _cc($a3+1,$z3-1) . _cc($A4,$Z4), # -
3024             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
3025             );
3026             }
3027             }
3028             elsif (($a2+1) == $z2) {
3029             return (
3030             # 11111111 22222222222 33333333333333 444444444444
3031             # A A Z A Z A Z
3032 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
3033             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
3034             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
3035             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
3036             );
3037             }
3038             else {
3039             return (
3040             # 11111111 2222222222222222 33333333333333 444444444444
3041             # A A Z A Z A Z
3042 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
3043             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
3044             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
3045             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
3046             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
3047             );
3048             }
3049             }
3050             elsif (($a1+1) == $z1) {
3051             return (
3052             # 11111111111 22222222222222 33333333333333 444444444444
3053             # A Z A Z A Z A Z
3054 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
3055             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
3056             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
3057             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
3058             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
3059             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
3060             );
3061             }
3062             else {
3063             return (
3064             # 1111111111111111 22222222222222 33333333333333 444444444444
3065             # A Z A Z A Z A Z
3066 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
3067             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
3068             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
3069             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
3070             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
3071             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
3072             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
3073             );
3074             }
3075             }
3076             else {
3077 0         0 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
3078             }
3079             }
3080              
3081             #
3082             # old UTF-8 range regexp
3083             #
3084             sub _range_regexp {
3085 0     537   0 my($length,$first,$last) = @_;
3086              
3087 537         1057 my @range_regexp = ();
3088 537 50       721 if (not exists $range_tr{$length}) {
3089 537         1253 return @range_regexp;
3090             }
3091              
3092 0         0 my @ranges = @{ $range_tr{$length} };
  537         720  
3093 537         1140 while (my @range = splice(@ranges,0,$length)) {
3094 537         1488 my $min = '';
3095 923         1280 my $max = '';
3096 923         1034 for (my $i=0; $i < $length; $i++) {
3097 923         1797 $min .= pack 'C', $range[$i][0];
3098 1205         2636 $max .= pack 'C', $range[$i][-1];
3099             }
3100              
3101             # min___max
3102             # FIRST_____________LAST
3103             # (nothing)
3104              
3105 1205 50 66     2353 if ($max lt $first) {
    100 100        
    50 33        
    100 100        
    100 66        
    100 66        
    50 66        
3106             }
3107              
3108             # **********
3109             # min_________max
3110             # FIRST_____________LAST
3111             # **********
3112              
3113             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
3114 923         7771 push @range_regexp, _octets($length,$first,$max,$min,$max);
3115             }
3116              
3117             # **********************
3118             # min________________max
3119             # FIRST_____________LAST
3120             # **********************
3121              
3122             elsif (($min eq $first) and ($max eq $last)) {
3123 28         73 push @range_regexp, _octets($length,$first,$last,$min,$max);
3124             }
3125              
3126             # *********
3127             # min___max
3128             # FIRST_____________LAST
3129             # *********
3130              
3131             elsif (($first le $min) and ($max le $last)) {
3132 0         0 push @range_regexp, _octets($length,$min,$max,$min,$max);
3133             }
3134              
3135             # **********************
3136             # min__________________________max
3137             # FIRST_____________LAST
3138             # **********************
3139              
3140             elsif (($min le $first) and ($last le $max)) {
3141 40         73 push @range_regexp, _octets($length,$first,$last,$min,$max);
3142             }
3143              
3144             # *********
3145             # min________max
3146             # FIRST_____________LAST
3147             # *********
3148              
3149             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
3150 469         1044 push @range_regexp, _octets($length,$min,$last,$min,$max);
3151             }
3152              
3153             # min___max
3154             # FIRST_____________LAST
3155             # (nothing)
3156              
3157             elsif ($last lt $min) {
3158             }
3159              
3160             else {
3161 20         41 die __FILE__, ": subroutine _range_regexp panic.\n";
3162             }
3163             }
3164              
3165 0         0 return @range_regexp;
3166             }
3167              
3168             #
3169             # old UTF-8 open character list for qr and not qr
3170             #
3171             sub _charlist {
3172              
3173 537     770   1184 my $modifier = pop @_;
3174 770         1198 my @char = @_;
3175              
3176 770 100       1586 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
3177              
3178             # unescape character
3179 770         2043 for (my $i=0; $i <= $#char; $i++) {
3180              
3181             # escape - to ...
3182 770 100 100     2457 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
3183 2660 100 100     18098 if ((0 < $i) and ($i < $#char)) {
3184 522         1867 $char[$i] = '...';
3185             }
3186             }
3187              
3188             # octal escape sequence
3189             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
3190 497         1147 $char[$i] = octchr($1);
3191             }
3192              
3193             # hexadecimal escape sequence
3194             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
3195 0         0 $char[$i] = hexchr($1);
3196             }
3197              
3198             # \b{...} --> b\{...}
3199             # \B{...} --> B\{...}
3200             # \N{CHARNAME} --> N\{CHARNAME}
3201             # \p{PROPERTY} --> p\{PROPERTY}
3202             # \P{PROPERTY} --> P\{PROPERTY}
3203             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
3204 0         0 $char[$i] = $1 . '\\' . $2;
3205             }
3206              
3207             # \p, \P, \X --> p, P, X
3208             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
3209 0         0 $char[$i] = $1;
3210             }
3211              
3212             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
3213 0         0 $char[$i] = CORE::chr oct $1;
3214             }
3215             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
3216 0         0 $char[$i] = CORE::chr hex $1;
3217             }
3218             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
3219 206         745 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
3220             }
3221             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
3222             $char[$i] = {
3223             '\0' => "\0",
3224             '\n' => "\n",
3225             '\r' => "\r",
3226             '\t' => "\t",
3227             '\f' => "\f",
3228             '\b' => "\x08", # \b means backspace in character class
3229             '\a' => "\a",
3230             '\e' => "\e",
3231             '\d' => '[0-9]',
3232              
3233             # Vertical tabs are now whitespace
3234             # \s in a regex now matches a vertical tab in all circumstances.
3235             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
3236             # \t \n \v \f \r space
3237             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
3238             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
3239             '\s' => '\s',
3240              
3241             '\w' => '[0-9A-Z_a-z]',
3242             '\D' => '${Eoldutf8::eD}',
3243             '\S' => '${Eoldutf8::eS}',
3244             '\W' => '${Eoldutf8::eW}',
3245              
3246             '\H' => '${Eoldutf8::eH}',
3247             '\V' => '${Eoldutf8::eV}',
3248             '\h' => '[\x09\x20]',
3249             '\v' => '[\x0A\x0B\x0C\x0D]',
3250             '\R' => '${Eoldutf8::eR}',
3251              
3252 0         0 }->{$1};
3253             }
3254              
3255             # POSIX-style character classes
3256             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
3257             $char[$i] = {
3258              
3259             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
3260             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
3261             '[:^lower:]' => '${Eoldutf8::not_lower_i}',
3262             '[:^upper:]' => '${Eoldutf8::not_upper_i}',
3263              
3264 33         516 }->{$1};
3265             }
3266             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
3267             $char[$i] = {
3268              
3269             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
3270             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
3271             '[:ascii:]' => '[\x00-\x7F]',
3272             '[:blank:]' => '[\x09\x20]',
3273             '[:cntrl:]' => '[\x00-\x1F\x7F]',
3274             '[:digit:]' => '[\x30-\x39]',
3275             '[:graph:]' => '[\x21-\x7F]',
3276             '[:lower:]' => '[\x61-\x7A]',
3277             '[:print:]' => '[\x20-\x7F]',
3278             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
3279              
3280             # P.174 POSIX-Style Character Classes
3281             # in Chapter 5: Pattern Matching
3282             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3283              
3284             # P.311 11.2.4 Character Classes and other Special Escapes
3285             # in Chapter 11: perlre: Perl regular expressions
3286             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
3287              
3288             # P.210 POSIX-Style Character Classes
3289             # in Chapter 5: Pattern Matching
3290             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3291              
3292             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
3293              
3294             '[:upper:]' => '[\x41-\x5A]',
3295             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
3296             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
3297             '[:^alnum:]' => '${Eoldutf8::not_alnum}',
3298             '[:^alpha:]' => '${Eoldutf8::not_alpha}',
3299             '[:^ascii:]' => '${Eoldutf8::not_ascii}',
3300             '[:^blank:]' => '${Eoldutf8::not_blank}',
3301             '[:^cntrl:]' => '${Eoldutf8::not_cntrl}',
3302             '[:^digit:]' => '${Eoldutf8::not_digit}',
3303             '[:^graph:]' => '${Eoldutf8::not_graph}',
3304             '[:^lower:]' => '${Eoldutf8::not_lower}',
3305             '[:^print:]' => '${Eoldutf8::not_print}',
3306             '[:^punct:]' => '${Eoldutf8::not_punct}',
3307             '[:^space:]' => '${Eoldutf8::not_space}',
3308             '[:^upper:]' => '${Eoldutf8::not_upper}',
3309             '[:^word:]' => '${Eoldutf8::not_word}',
3310             '[:^xdigit:]' => '${Eoldutf8::not_xdigit}',
3311              
3312 8         54 }->{$1};
3313             }
3314             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
3315 70         1448 $char[$i] = $1;
3316             }
3317             }
3318              
3319             # open character list
3320 7         34 my @singleoctet = ();
3321 770         1387 my @multipleoctet = ();
3322 770         1025 for (my $i=0; $i <= $#char; ) {
3323              
3324             # escaped -
3325 770 100 100     1828 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
3326 2163         8898 $i += 1;
3327 497         616 next;
3328             }
3329              
3330             # make range regexp
3331             elsif ($char[$i] eq '...') {
3332              
3333             # range error
3334 497 50       882 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    100          
3335 497         1740 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
3336             }
3337             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
3338 0 50       0 if ($char[$i-1] gt $char[$i+1]) {
3339 477         1069 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
3340             }
3341             }
3342              
3343             # make range regexp per length
3344 0         0 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
3345 497         1371 my @regexp = ();
3346              
3347             # is first and last
3348 537 100 100     733 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    100 66        
    100          
    50          
3349 537         1977 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
3350             }
3351              
3352             # is first
3353             elsif ($length == CORE::length($char[$i-1])) {
3354 477         1260 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
3355             }
3356              
3357             # is inside in first and last
3358             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
3359 20         89 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
3360             }
3361              
3362             # is last
3363             elsif ($length == CORE::length($char[$i+1])) {
3364 20         58 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
3365             }
3366              
3367             else {
3368 20         49 die __FILE__, ": subroutine make_regexp panic.\n";
3369             }
3370              
3371 0 100       0 if ($length == 1) {
3372 537         1009 push @singleoctet, @regexp;
3373             }
3374             else {
3375 386         855 push @multipleoctet, @regexp;
3376             }
3377             }
3378              
3379 151         325 $i += 2;
3380             }
3381              
3382             # with /i modifier
3383             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
3384 497 100       1003 if ($modifier =~ /i/oxms) {
3385 764         1200 my $uc = Eoldutf8::uc($char[$i]);
3386 192         354 my $fc = Eoldutf8::fc($char[$i]);
3387 192 50       368 if ($uc ne $fc) {
3388 192 50       344 if (CORE::length($fc) == 1) {
3389 192         277 push @singleoctet, $uc, $fc;
3390             }
3391             else {
3392 192         355 push @singleoctet, $uc;
3393 0         0 push @multipleoctet, $fc;
3394             }
3395             }
3396             else {
3397 0         0 push @singleoctet, $char[$i];
3398             }
3399             }
3400             else {
3401 0         0 push @singleoctet, $char[$i];
3402             }
3403 572         1343 $i += 1;
3404             }
3405              
3406             # single character of single octet code
3407             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
3408 764         1235 push @singleoctet, "\t", "\x20";
3409 0         0 $i += 1;
3410             }
3411             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
3412 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
3413 0         0 $i += 1;
3414             }
3415             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
3416 0         0 push @singleoctet, $char[$i];
3417 2         7 $i += 1;
3418             }
3419              
3420             # single character of multiple-octet code
3421             else {
3422 2         6 push @multipleoctet, $char[$i];
3423 403         736 $i += 1;
3424             }
3425             }
3426              
3427             # quote metachar
3428 403         639 for (@singleoctet) {
3429 770 50       1476 if ($_ eq '...') {
    100          
    100          
    100          
    100          
3430 1364         5818 $_ = '-';
3431             }
3432             elsif (/\A \n \z/oxms) {
3433 0         0 $_ = '\n';
3434             }
3435             elsif (/\A \r \z/oxms) {
3436 8         31 $_ = '\r';
3437             }
3438             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
3439 8         19 $_ = sprintf('\x%02X', CORE::ord $1);
3440             }
3441             elsif (/\A [\x00-\xFF] \z/oxms) {
3442 1         6 $_ = quotemeta $_;
3443             }
3444             }
3445              
3446             # return character list
3447 939         1438 return \@singleoctet, \@multipleoctet;
3448             }
3449              
3450             #
3451             # old UTF-8 octal escape sequence
3452             #
3453             sub octchr {
3454 770     5 0 2494 my($octdigit) = @_;
3455              
3456 5         14 my @binary = ();
3457 5         7 for my $octal (split(//,$octdigit)) {
3458             push @binary, {
3459             '0' => '000',
3460             '1' => '001',
3461             '2' => '010',
3462             '3' => '011',
3463             '4' => '100',
3464             '5' => '101',
3465             '6' => '110',
3466             '7' => '111',
3467 5         25 }->{$octal};
3468             }
3469 50         192 my $binary = join '', @binary;
3470              
3471             my $octchr = {
3472             # 1234567
3473             1 => pack('B*', "0000000$binary"),
3474             2 => pack('B*', "000000$binary"),
3475             3 => pack('B*', "00000$binary"),
3476             4 => pack('B*', "0000$binary"),
3477             5 => pack('B*', "000$binary"),
3478             6 => pack('B*', "00$binary"),
3479             7 => pack('B*', "0$binary"),
3480             0 => pack('B*', "$binary"),
3481              
3482 5         12 }->{CORE::length($binary) % 8};
3483              
3484 5         61 return $octchr;
3485             }
3486              
3487             #
3488             # old UTF-8 hexadecimal escape sequence
3489             #
3490             sub hexchr {
3491 5     5 0 19 my($hexdigit) = @_;
3492              
3493             my $hexchr = {
3494             1 => pack('H*', "0$hexdigit"),
3495             0 => pack('H*', "$hexdigit"),
3496              
3497 5         15 }->{CORE::length($_[0]) % 2};
3498              
3499 5         39 return $hexchr;
3500             }
3501              
3502             #
3503             # old UTF-8 open character list for qr
3504             #
3505             sub charlist_qr {
3506              
3507 5     531 0 17 my $modifier = pop @_;
3508 531         1049 my @char = @_;
3509              
3510 531         1286 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
3511 531         1551 my @singleoctet = @$singleoctet;
3512 531         1109 my @multipleoctet = @$multipleoctet;
3513              
3514             # return character list
3515 531 100       873 if (scalar(@singleoctet) >= 1) {
3516              
3517             # with /i modifier
3518 531 100       1362 if ($modifier =~ m/i/oxms) {
3519 384         908 my %singleoctet_ignorecase = ();
3520 107         155 for (@singleoctet) {
3521 107   66     185 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
3522 272         870 for my $ord (hex($1) .. hex($2)) {
3523 80         293 my $char = CORE::chr($ord);
3524 1091         1441 my $uc = Eoldutf8::uc($char);
3525 1091         1455 my $fc = Eoldutf8::fc($char);
3526 1091 100       1553 if ($uc eq $fc) {
3527 1091         1604 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
3528             }
3529             else {
3530 502 50       1138 if (CORE::length($fc) == 1) {
3531 589         779 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3532 589         1419 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
3533             }
3534             else {
3535 589         1373 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3536 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
3537             }
3538             }
3539             }
3540             }
3541 0 100       0 if ($_ ne '') {
3542 272         483 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
3543             }
3544             }
3545 192         460 my $i = 0;
3546 107         145 my @singleoctet_ignorecase = ();
3547 107         146 for my $ord (0 .. 255) {
3548 107 100       174 if (exists $singleoctet_ignorecase{$ord}) {
3549 27392         31712 push @{$singleoctet_ignorecase[$i]}, $ord;
  1622         1502  
3550             }
3551             else {
3552 1622         2408 $i++;
3553             }
3554             }
3555 25770         25834 @singleoctet = ();
3556 107         151 for my $range (@singleoctet_ignorecase) {
3557 107 100       231 if (ref $range) {
3558 11367 50       17389 if (scalar(@{$range}) == 1) {
  214 50       236  
3559 214         385 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  0         0  
3560             }
3561 0         0 elsif (scalar(@{$range}) == 2) {
3562 214         304 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
3563             }
3564             else {
3565 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         251  
  214         258  
3566             }
3567             }
3568             }
3569             }
3570              
3571 214         995 my $not_anchor = '';
3572 384         599 $not_anchor = '(?!(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF]))';
3573              
3574 384         545 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
3575             }
3576 384 100       1033 if (scalar(@multipleoctet) >= 2) {
3577 531         1416 return '(?:' . join('|', @multipleoctet) . ')';
3578             }
3579             else {
3580 102         601 return $multipleoctet[0];
3581             }
3582             }
3583              
3584             #
3585             # old UTF-8 open character list for not qr
3586             #
3587             sub charlist_not_qr {
3588              
3589 429     239 0 2494 my $modifier = pop @_;
3590 239         394 my @char = @_;
3591              
3592 239         519 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
3593 239         544 my @singleoctet = @$singleoctet;
3594 239         469 my @multipleoctet = @$multipleoctet;
3595              
3596             # with /i modifier
3597 239 100       357 if ($modifier =~ m/i/oxms) {
3598 239         535 my %singleoctet_ignorecase = ();
3599 128         170 for (@singleoctet) {
3600 128   66     225 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
3601 272         850 for my $ord (hex($1) .. hex($2)) {
3602 80         269 my $char = CORE::chr($ord);
3603 1091         1521 my $uc = Eoldutf8::uc($char);
3604 1091         1599 my $fc = Eoldutf8::fc($char);
3605 1091 100       1532 if ($uc eq $fc) {
3606 1091         1662 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
3607             }
3608             else {
3609 502 50       1134 if (CORE::length($fc) == 1) {
3610 589         737 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3611 589         1133 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
3612             }
3613             else {
3614 589         1319 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3615 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
3616             }
3617             }
3618             }
3619             }
3620 0 100       0 if ($_ ne '') {
3621 272         447 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
3622             }
3623             }
3624 192         414 my $i = 0;
3625 128         152 my @singleoctet_ignorecase = ();
3626 128         163 for my $ord (0 .. 255) {
3627 128 100       184 if (exists $singleoctet_ignorecase{$ord}) {
3628 32768         37833 push @{$singleoctet_ignorecase[$i]}, $ord;
  1622         1517  
3629             }
3630             else {
3631 1622         2431 $i++;
3632             }
3633             }
3634 31146         31298 @singleoctet = ();
3635 128         185 for my $range (@singleoctet_ignorecase) {
3636 128 100       252 if (ref $range) {
3637 11367 50       17147 if (scalar(@{$range}) == 1) {
  214 50       226  
3638 214         334 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  0         0  
3639             }
3640 0         0 elsif (scalar(@{$range}) == 2) {
3641 214         281 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
3642             }
3643             else {
3644 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         229  
  214         261  
3645             }
3646             }
3647             }
3648             }
3649              
3650             # return character list
3651 214 100       924 if (scalar(@multipleoctet) >= 1) {
3652 239 100       513 if (scalar(@singleoctet) >= 1) {
3653              
3654             # any character other than multiple-octet and single octet character class
3655 114         185 return '(?!' . join('|', @multipleoctet) . ')(?:[^\x80-\xFF' . join('', @singleoctet) . ']|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])';
3656             }
3657             else {
3658              
3659             # any character other than multiple-octet character class
3660 70         495 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
3661             }
3662             }
3663             else {
3664 44 50       270 if (scalar(@singleoctet) >= 1) {
3665              
3666             # any character other than single octet character class
3667 125         207 return '(?:[^\x80-\xFF' . join('', @singleoctet) . ']|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])';
3668             }
3669             else {
3670              
3671             # any character
3672 125         665 return "(?:$your_char)";
3673             }
3674             }
3675             }
3676              
3677             #
3678             # open file in read mode
3679             #
3680             sub _open_r {
3681 0     612   0 my(undef,$file) = @_;
3682 306     306   7316 use Fcntl qw(O_RDONLY);
  306         2155  
  306         58459  
3683 612         1830 return CORE::sysopen($_[0], $file, &O_RDONLY);
3684             }
3685              
3686             #
3687             # open file in append mode
3688             #
3689             sub _open_a {
3690 612     306   28008 my(undef,$file) = @_;
3691 306     306   3893 use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
  306         685  
  306         1295308  
3692 306         951 return CORE::sysopen($_[0], $file, &O_WRONLY|&O_APPEND|&O_CREAT);
3693             }
3694              
3695             #
3696             # safe system
3697             #
3698             sub _systemx {
3699              
3700             # P.707 29.2.33. exec
3701             # in Chapter 29: Functions
3702             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3703             #
3704             # Be aware that in older releases of Perl, exec (and system) did not flush
3705             # your output buffer, so you needed to enable command buffering by setting $|
3706             # on one or more filehandles to avoid lost output in the case of exec, or
3707             # misordererd output in the case of system. This situation was largely remedied
3708             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
3709              
3710             # P.855 exec
3711             # in Chapter 27: Functions
3712             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3713             #
3714             # In very old release of Perl (before v5.6), exec (and system) did not flush
3715             # your output buffer, so you needed to enable command buffering by setting $|
3716             # on one or more filehandles to avoid lost output with exec or misordered
3717             # output with system.
3718              
3719 306     306   87361 $| = 1;
3720              
3721             # P.565 23.1.2. Cleaning Up Your Environment
3722             # in Chapter 23: Security
3723             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3724              
3725             # P.656 Cleaning Up Your Environment
3726             # in Chapter 20: Security
3727             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3728              
3729             # local $ENV{'PATH'} = '.';
3730 306         1131 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
3731              
3732             # P.707 29.2.33. exec
3733             # in Chapter 29: Functions
3734             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3735             #
3736             # As we mentioned earlier, exec treats a discrete list of arguments as an
3737             # indication that it should bypass shell processing. However, there is one
3738             # place where you might still get tripped up. The exec call (and system, too)
3739             # will not distinguish between a single scalar argument and an array containing
3740             # only one element.
3741             #
3742             # @args = ("echo surprise"); # just one element in list
3743             # exec @args # still subject to shell escapes
3744             # or die "exec: $!"; # because @args == 1
3745             #
3746             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
3747             # first argument as the pathname, which forces the rest of the arguments to be
3748             # interpreted as a list, even if there is only one of them:
3749             #
3750             # exec { $args[0] } @args # safe even with one-argument list
3751             # or die "can't exec @args: $!";
3752              
3753             # P.855 exec
3754             # in Chapter 27: Functions
3755             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3756             #
3757             # As we mentioned earlier, exec treats a discrete list of arguments as a
3758             # directive to bypass shell processing. However, there is one place where
3759             # you might still get tripped up. The exec call (and system, too) cannot
3760             # distinguish between a single scalar argument and an array containing
3761             # only one element.
3762             #
3763             # @args = ("echo surprise"); # just one element in list
3764             # exec @args # still subject to shell escapes
3765             # || die "exec: $!"; # because @args == 1
3766             #
3767             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
3768             # argument as the pathname, which forces the rest of the arguments to be
3769             # interpreted as a list, even if there is only one of them:
3770             #
3771             # exec { $args[0] } @args # safe even with one-argument list
3772             # || die "can't exec @args: $!";
3773              
3774 306         2853 return CORE::system { $_[0] } @_; # safe even with one-argument list
  306         634  
3775             }
3776              
3777             #
3778             # old UTF-8 order to character (with parameter)
3779             #
3780             sub Eoldutf8::chr(;$) {
3781              
3782 306 0   0 0 39556448 my $c = @_ ? $_[0] : $_;
3783              
3784 0 0       0 if ($c == 0x00) {
3785 0         0 return "\x00";
3786             }
3787             else {
3788 0         0 my @chr = ();
3789 0         0 while ($c > 0) {
3790 0         0 unshift @chr, ($c % 0x100);
3791 0         0 $c = int($c / 0x100);
3792             }
3793 0         0 return pack 'C*', @chr;
3794             }
3795             }
3796              
3797             #
3798             # old UTF-8 order to character (without parameter)
3799             #
3800             sub Eoldutf8::chr_() {
3801              
3802 0     0 0 0 my $c = $_;
3803              
3804 0 0       0 if ($c == 0x00) {
3805 0         0 return "\x00";
3806             }
3807             else {
3808 0         0 my @chr = ();
3809 0         0 while ($c > 0) {
3810 0         0 unshift @chr, ($c % 0x100);
3811 0         0 $c = int($c / 0x100);
3812             }
3813 0         0 return pack 'C*', @chr;
3814             }
3815             }
3816              
3817             #
3818             # old UTF-8 path globbing (with parameter)
3819             #
3820             sub Eoldutf8::glob($) {
3821              
3822 0 0   0 0 0 if (wantarray) {
3823 0         0 my @glob = _DOS_like_glob(@_);
3824 0         0 for my $glob (@glob) {
3825 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3826             }
3827 0         0 return @glob;
3828             }
3829             else {
3830 0         0 my $glob = _DOS_like_glob(@_);
3831 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3832 0         0 return $glob;
3833             }
3834             }
3835              
3836             #
3837             # old UTF-8 path globbing (without parameter)
3838             #
3839             sub Eoldutf8::glob_() {
3840              
3841 0 0   0 0 0 if (wantarray) {
3842 0         0 my @glob = _DOS_like_glob();
3843 0         0 for my $glob (@glob) {
3844 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3845             }
3846 0         0 return @glob;
3847             }
3848             else {
3849 0         0 my $glob = _DOS_like_glob();
3850 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3851 0         0 return $glob;
3852             }
3853             }
3854              
3855             #
3856             # old UTF-8 path globbing via File::DosGlob 1.10
3857             #
3858             # Often I confuse "_dosglob" and "_doglob".
3859             # So, I renamed "_dosglob" to "_DOS_like_glob".
3860             #
3861             my %iter;
3862             my %entries;
3863             sub _DOS_like_glob {
3864              
3865             # context (keyed by second cxix argument provided by core)
3866 0     0   0 my($expr,$cxix) = @_;
3867              
3868             # glob without args defaults to $_
3869 0 0       0 $expr = $_ if not defined $expr;
3870              
3871             # represents the current user's home directory
3872             #
3873             # 7.3. Expanding Tildes in Filenames
3874             # in Chapter 7. File Access
3875             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
3876             #
3877             # and File::HomeDir, File::HomeDir::Windows module
3878              
3879             # DOS-like system
3880 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
3881 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
  0         0  
3882             { my_home_MSWin32() }oxmse;
3883             }
3884              
3885             # UNIX-like system
3886 0 0 0     0 else {
  0         0  
3887             $expr =~ s{ \A ~ ( (?:[^\x80-\xFF/]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])* ) }
3888             { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
3889             }
3890 0 0       0  
3891 0 0       0 # assume global context if not provided one
3892             $cxix = '_G_' if not defined $cxix;
3893             $iter{$cxix} = 0 if not exists $iter{$cxix};
3894 0 0       0  
3895 0         0 # if we're just beginning, do it all first
3896             if ($iter{$cxix} == 0) {
3897             $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
3898             }
3899 0 0       0  
3900 0         0 # chuck it all out, quick or slow
3901 0         0 if (wantarray) {
  0         0  
3902             delete $iter{$cxix};
3903             return @{delete $entries{$cxix}};
3904 0 0       0 }
  0         0  
3905 0         0 else {
  0         0  
3906             if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
3907             return shift @{$entries{$cxix}};
3908             }
3909 0         0 else {
3910 0         0 # return undef for EOL
3911 0         0 delete $iter{$cxix};
3912             delete $entries{$cxix};
3913             return undef;
3914             }
3915             }
3916             }
3917              
3918             #
3919             # old UTF-8 path globbing subroutine
3920             #
3921 0     0   0 sub _do_glob {
3922 0         0  
3923 0         0 my($cond,@expr) = @_;
3924             my @glob = ();
3925             my $fix_drive_relative_paths = 0;
3926 0         0  
3927 0 0       0 OUTER:
3928 0 0       0 for my $expr (@expr) {
3929             next OUTER if not defined $expr;
3930 0         0 next OUTER if $expr eq '';
3931 0         0  
3932 0         0 my @matched = ();
3933 0         0 my @globdir = ();
3934 0         0 my $head = '.';
3935             my $pathsep = '/';
3936             my $tail;
3937 0 0       0  
3938 0         0 # if argument is within quotes strip em and do no globbing
3939 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
3940 0 0       0 $expr = $1;
3941 0         0 if ($cond eq 'd') {
3942             if (-d $expr) {
3943             push @glob, $expr;
3944             }
3945 0 0       0 }
3946 0         0 else {
3947             if (-e $expr) {
3948             push @glob, $expr;
3949 0         0 }
3950             }
3951             next OUTER;
3952             }
3953              
3954 0 0       0 # wildcards with a drive prefix such as h:*.pm must be changed
3955 0 0       0 # to h:./*.pm to expand correctly
3956 0         0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
3957             if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^\x80-\xFF/\\]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF]) #$1./$2#oxms) {
3958             $fix_drive_relative_paths = 1;
3959             }
3960 0 0       0 }
3961 0 0       0  
3962 0         0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
3963 0         0 if ($tail eq '') {
3964             push @glob, $expr;
3965 0 0       0 next OUTER;
3966 0 0       0 }
3967 0         0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
  0         0  
3968 0         0 if (@globdir = _do_glob('d', $head)) {
3969             push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
3970             next OUTER;
3971 0 0 0     0 }
3972 0         0 }
3973             if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
3974 0         0 $head .= $pathsep;
3975             }
3976             $expr = $tail;
3977             }
3978 0 0       0  
3979 0 0       0 # If file component has no wildcards, we can avoid opendir
3980 0         0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
3981             if ($head eq '.') {
3982 0 0 0     0 $head = '';
3983 0         0 }
3984             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
3985 0         0 $head .= $pathsep;
3986 0 0       0 }
3987 0 0       0 $head .= $expr;
3988 0         0 if ($cond eq 'd') {
3989             if (-d $head) {
3990             push @glob, $head;
3991             }
3992 0 0       0 }
3993 0         0 else {
3994             if (-e $head) {
3995             push @glob, $head;
3996 0         0 }
3997             }
3998 0 0       0 next OUTER;
3999 0         0 }
4000 0         0 opendir(*DIR, $head) or next OUTER;
4001             my @leaf = readdir DIR;
4002 0 0       0 closedir DIR;
4003 0         0  
4004             if ($head eq '.') {
4005 0 0 0     0 $head = '';
4006 0         0 }
4007             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
4008             $head .= $pathsep;
4009 0         0 }
4010 0         0  
4011 0         0 my $pattern = '';
4012             while ($expr =~ / \G ($q_char) /oxgc) {
4013             my $char = $1;
4014              
4015             # 6.9. Matching Shell Globs as Regular Expressions
4016             # in Chapter 6. Pattern Matching
4017             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
4018 0 0       0 # (and so on)
    0          
    0          
4019 0         0  
4020             if ($char eq '*') {
4021             $pattern .= "(?:$your_char)*",
4022 0         0 }
4023             elsif ($char eq '?') {
4024             $pattern .= "(?:$your_char)?", # DOS style
4025             # $pattern .= "(?:$your_char)", # UNIX style
4026 0         0 }
4027             elsif ((my $fc = Eoldutf8::fc($char)) ne $char) {
4028             $pattern .= $fc;
4029 0         0 }
4030             else {
4031             $pattern .= quotemeta $char;
4032 0     0   0 }
  0         0  
4033             }
4034             my $matchsub = sub { Eoldutf8::fc($_[0]) =~ /\A $pattern \z/xms };
4035              
4036             # if ($@) {
4037             # print STDERR "$0: $@\n";
4038             # next OUTER;
4039             # }
4040 0         0  
4041 0 0 0     0 INNER:
4042 0         0 for my $leaf (@leaf) {
4043             if ($leaf eq '.' or $leaf eq '..') {
4044 0 0 0     0 next INNER;
4045 0         0 }
4046             if ($cond eq 'd' and not -d "$head$leaf") {
4047             next INNER;
4048 0 0       0 }
4049 0         0  
4050 0         0 if (&$matchsub($leaf)) {
4051             push @matched, "$head$leaf";
4052             next INNER;
4053             }
4054              
4055             # [DOS compatibility special case]
4056 0 0 0     0 # Failed, add a trailing dot and try again, but only...
      0        
4057              
4058             if (Eoldutf8::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
4059             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
4060 0 0       0 Eoldutf8::index($pattern,'\\.') != -1 # pattern has a dot.
4061 0         0 ) {
4062 0         0 if (&$matchsub("$leaf.")) {
4063             push @matched, "$head$leaf";
4064             next INNER;
4065             }
4066 0 0       0 }
4067 0         0 }
4068             if (@matched) {
4069             push @glob, @matched;
4070 0 0       0 }
4071 0         0 }
4072 0         0 if ($fix_drive_relative_paths) {
4073             for my $glob (@glob) {
4074             $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
4075 0         0 }
4076             }
4077             return @glob;
4078             }
4079              
4080             #
4081             # old UTF-8 parse line
4082             #
4083 0     0   0 sub _parse_line {
4084              
4085 0         0 my($line) = @_;
4086 0         0  
4087 0         0 $line .= ' ';
4088             my @piece = ();
4089             while ($line =~ /
4090             " ( (?>(?: [^\x80-\xFF"] |(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] )* ) ) " (?>\s+) |
4091             ( (?>(?: [^\x80-\xFF"\s]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] )* ) ) (?>\s+)
4092 0 0       0 /oxmsg
4093             ) {
4094 0         0 push @piece, defined($1) ? $1 : $2;
4095             }
4096             return @piece;
4097             }
4098              
4099             #
4100             # old UTF-8 parse path
4101             #
4102 0     0   0 sub _parse_path {
4103              
4104 0         0 my($path,$pathsep) = @_;
4105 0         0  
4106 0         0 $path .= '/';
4107             my @subpath = ();
4108             while ($path =~ /
4109             ((?: [^\x80-\xFF\/\\]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] )+?) [\/\\]
4110 0         0 /oxmsg
4111             ) {
4112             push @subpath, $1;
4113 0         0 }
4114 0         0  
4115 0         0 my $tail = pop @subpath;
4116             my $head = join $pathsep, @subpath;
4117             return $head, $tail;
4118             }
4119              
4120             #
4121             # via File::HomeDir::Windows 1.00
4122             #
4123             sub my_home_MSWin32 {
4124              
4125             # A lot of unix people and unix-derived tools rely on
4126 0 0 0 0 0 0 # the ability to overload HOME. We will support it too
    0 0        
    0 0        
      0        
      0        
4127 0         0 # so that they can replace raw HOME calls with File::HomeDir.
4128             if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
4129             return $ENV{'HOME'};
4130             }
4131              
4132 0         0 # Do we have a user profile?
4133             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
4134             return $ENV{'USERPROFILE'};
4135             }
4136              
4137 0         0 # Some Windows use something like $ENV{'HOME'}
4138             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
4139             return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
4140 0         0 }
4141              
4142             return undef;
4143             }
4144              
4145             #
4146             # via File::HomeDir::Unix 1.00
4147 0     0 0 0 #
4148             sub my_home {
4149 0 0 0     0 my $home;
    0 0        
4150 0         0  
4151             if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
4152             $home = $ENV{'HOME'};
4153             }
4154              
4155             # This is from the original code, but I'm guessing
4156 0         0 # it means "login directory" and exists on some Unixes.
4157             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
4158             $home = $ENV{'LOGDIR'};
4159             }
4160              
4161             ### More-desperate methods
4162              
4163 0         0 # Light desperation on any (Unixish) platform
4164             else {
4165             $home = CORE::eval q{ (getpwuid($<))[7] };
4166             }
4167              
4168 0 0 0     0 # On Unix in general, a non-existant home means "no home"
4169 0         0 # For example, "nobody"-like users might use /nonexistant
4170             if (defined $home and ! -d($home)) {
4171 0         0 $home = undef;
4172             }
4173             return $home;
4174             }
4175              
4176             #
4177             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
4178 0     0 0 0 #
4179             sub Eoldutf8::PREMATCH {
4180             return $`;
4181             }
4182              
4183             #
4184             # ${^MATCH}, $MATCH, $& the string that matched
4185 0     0 0 0 #
4186             sub Eoldutf8::MATCH {
4187             return $&;
4188             }
4189              
4190             #
4191             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
4192 0     0 0 0 #
4193             sub Eoldutf8::POSTMATCH {
4194             return $';
4195             }
4196              
4197             #
4198             # old UTF-8 character to order (with parameter)
4199             #
4200 0 0   0 1 0 sub OldUTF8::ord(;$) {
4201              
4202 0 0       0 local $_ = shift if @_;
4203 0         0  
4204 0         0 if (/\A ($q_char) /oxms) {
4205 0         0 my @ord = unpack 'C*', $1;
4206 0         0 my $ord = 0;
4207             while (my $o = shift @ord) {
4208 0         0 $ord = $ord * 0x100 + $o;
4209             }
4210             return $ord;
4211 0         0 }
4212             else {
4213             return CORE::ord $_;
4214             }
4215             }
4216              
4217             #
4218             # old UTF-8 character to order (without parameter)
4219             #
4220 0 0   0 0 0 sub OldUTF8::ord_() {
4221 0         0  
4222 0         0 if (/\A ($q_char) /oxms) {
4223 0         0 my @ord = unpack 'C*', $1;
4224 0         0 my $ord = 0;
4225             while (my $o = shift @ord) {
4226 0         0 $ord = $ord * 0x100 + $o;
4227             }
4228             return $ord;
4229 0         0 }
4230             else {
4231             return CORE::ord $_;
4232             }
4233             }
4234              
4235             #
4236             # old UTF-8 reverse
4237             #
4238 0 0   0 0 0 sub OldUTF8::reverse(@) {
4239 0         0  
4240             if (wantarray) {
4241             return CORE::reverse @_;
4242             }
4243             else {
4244              
4245             # One of us once cornered Larry in an elevator and asked him what
4246             # problem he was solving with this, but he looked as far off into
4247             # the distance as he could in an elevator and said, "It seemed like
4248 0         0 # a good idea at the time."
4249              
4250             return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
4251             }
4252             }
4253              
4254             #
4255             # old UTF-8 getc (with parameter, without parameter)
4256             #
4257 0     0 0 0 sub OldUTF8::getc(;*@) {
4258 0 0       0  
4259 0 0 0     0 my($package) = caller;
4260             my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
4261 0         0 croak 'Too many arguments for OldUTF8::getc' if @_ and not wantarray;
  0         0  
4262 0         0  
4263 0         0 my @length = sort { $a <=> $b } keys %range_tr;
4264 0         0 my $getc = '';
4265 0 0       0 for my $length ($length[0] .. $length[-1]) {
4266 0 0       0 $getc .= CORE::getc($fh);
4267 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
4268             if ($getc =~ /\A ${Eoldutf8::dot_s} \z/oxms) {
4269             return wantarray ? ($getc,@_) : $getc;
4270             }
4271 0 0       0 }
4272             }
4273             return wantarray ? ($getc,@_) : $getc;
4274             }
4275              
4276             #
4277             # old UTF-8 length by character
4278             #
4279 0 0   0 1 0 sub OldUTF8::length(;$) {
4280              
4281 0         0 local $_ = shift if @_;
4282 0         0  
4283             local @_ = /\G ($q_char) /oxmsg;
4284             return scalar @_;
4285             }
4286              
4287             #
4288             # old UTF-8 substr by character
4289             #
4290             BEGIN {
4291              
4292             # P.232 The lvalue Attribute
4293             # in Chapter 6: Subroutines
4294             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4295              
4296             # P.336 The lvalue Attribute
4297             # in Chapter 7: Subroutines
4298             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4299              
4300             # P.144 8.4 Lvalue subroutines
4301             # in Chapter 8: perlsub: Perl subroutines
4302 306 50 0 306 1 248716 # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
  0 0   0   0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
4303              
4304             CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
4305             # vv----------------------*******
4306             sub OldUTF8::substr($$;$$) %s {
4307              
4308             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
4309              
4310             # If the substring is beyond either end of the string, substr() returns the undefined
4311             # value and produces a warning. When used as an lvalue, specifying a substring that
4312             # is entirely outside the string raises an exception.
4313             # http://perldoc.perl.org/functions/substr.html
4314              
4315             # A return with no argument returns the scalar value undef in scalar context,
4316             # an empty list () in list context, and (naturally) nothing at all in void
4317             # context.
4318              
4319             my $offset = $_[1];
4320             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
4321             return;
4322             }
4323              
4324             # substr($string,$offset,$length,$replacement)
4325             if (@_ == 4) {
4326             my(undef,undef,$length,$replacement) = @_;
4327             my $substr = join '', splice(@char, $offset, $length, $replacement);
4328             $_[0] = join '', @char;
4329              
4330             # return $substr; this doesn't work, don't say "return"
4331             $substr;
4332             }
4333              
4334             # substr($string,$offset,$length)
4335             elsif (@_ == 3) {
4336             my(undef,undef,$length) = @_;
4337             my $octet_offset = 0;
4338             my $octet_length = 0;
4339             if ($offset == 0) {
4340             $octet_offset = 0;
4341             }
4342             elsif ($offset > 0) {
4343             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
4344             }
4345             else {
4346             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
4347             }
4348             if ($length == 0) {
4349             $octet_length = 0;
4350             }
4351             elsif ($length > 0) {
4352             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
4353             }
4354             else {
4355             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
4356             }
4357             CORE::substr($_[0], $octet_offset, $octet_length);
4358             }
4359              
4360             # substr($string,$offset)
4361             else {
4362             my $octet_offset = 0;
4363             if ($offset == 0) {
4364             $octet_offset = 0;
4365             }
4366             elsif ($offset > 0) {
4367             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
4368             }
4369             else {
4370             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
4371             }
4372             CORE::substr($_[0], $octet_offset);
4373             }
4374             }
4375             END
4376             }
4377              
4378             #
4379             # old UTF-8 index by character
4380             #
4381 0     0 1 0 sub OldUTF8::index($$;$) {
4382 0 0       0  
4383 0         0 my $index;
4384             if (@_ == 3) {
4385             $index = Eoldutf8::index($_[0], $_[1], CORE::length(OldUTF8::substr($_[0], 0, $_[2])));
4386 0         0 }
4387             else {
4388             $index = Eoldutf8::index($_[0], $_[1]);
4389 0 0       0 }
4390 0         0  
4391             if ($index == -1) {
4392             return -1;
4393 0         0 }
4394             else {
4395             return OldUTF8::length(CORE::substr $_[0], 0, $index);
4396             }
4397             }
4398              
4399             #
4400             # old UTF-8 rindex by character
4401             #
4402 0     0 1 0 sub OldUTF8::rindex($$;$) {
4403 0 0       0  
4404 0         0 my $rindex;
4405             if (@_ == 3) {
4406             $rindex = Eoldutf8::rindex($_[0], $_[1], CORE::length(OldUTF8::substr($_[0], 0, $_[2])));
4407 0         0 }
4408             else {
4409             $rindex = Eoldutf8::rindex($_[0], $_[1]);
4410 0 0       0 }
4411 0         0  
4412             if ($rindex == -1) {
4413             return -1;
4414 0         0 }
4415             else {
4416             return OldUTF8::length(CORE::substr $_[0], 0, $rindex);
4417             }
4418             }
4419              
4420 306     306   5883 # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
  306         662  
  306         51621  
4421             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
4422             use vars qw($slash); $slash = 'm//';
4423              
4424             # ord() to ord() or OldUTF8::ord()
4425             my $function_ord = 'ord';
4426              
4427             # ord to ord or OldUTF8::ord_
4428             my $function_ord_ = 'ord';
4429              
4430             # reverse to reverse or OldUTF8::reverse
4431             my $function_reverse = 'reverse';
4432              
4433             # getc to getc or OldUTF8::getc
4434             my $function_getc = 'getc';
4435              
4436             # P.1023 Appendix W.9 Multibyte Anchoring
4437             # of ISBN 1-56592-224-7 CJKV Information Processing
4438              
4439 306     306   2626 my $anchor = '';
  306     0   2365  
  306         18409209  
4440              
4441             use vars qw($nest);
4442              
4443             # regexp of nested parens in qqXX
4444              
4445             # P.340 Matching Nested Constructs with Embedded Code
4446             # in Chapter 7: Perl
4447             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
4448              
4449             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
4450             [^\x80-\xFF\\()] |
4451             \( (?{$nest++}) |
4452             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4453             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4454             \\ [^\x80-\xFFc] |
4455             \\c[\x40-\x5F] |
4456             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4457             [\x00-\xFF]
4458             }xms;
4459              
4460             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
4461             [^\x80-\xFF\\{}] |
4462             \{ (?{$nest++}) |
4463             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4464             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4465             \\ [^\x80-\xFFc] |
4466             \\c[\x40-\x5F] |
4467             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4468             [\x00-\xFF]
4469             }xms;
4470              
4471             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
4472             [^\x80-\xFF\\\[\]] |
4473             \[ (?{$nest++}) |
4474             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4475             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4476             \\ [^\x80-\xFFc] |
4477             \\c[\x40-\x5F] |
4478             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4479             [\x00-\xFF]
4480             }xms;
4481              
4482             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
4483             [^\x80-\xFF\\<>] |
4484             \< (?{$nest++}) |
4485             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4486             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4487             \\ [^\x80-\xFFc] |
4488             \\c[\x40-\x5F] |
4489             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4490             [\x00-\xFF]
4491             }xms;
4492              
4493             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
4494             (?: ::)? (?:
4495             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
4496             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
4497             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
4498             ))
4499             }xms;
4500              
4501             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
4502             (?: ::)? (?:
4503             (?>[0-9]+) |
4504             [^\x80-\xFFa-zA-Z_0-9\[\]] |
4505             ^[A-Z] |
4506             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
4507             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
4508             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
4509             ))
4510             }xms;
4511              
4512             my $qq_substr = qr{(?> Char::substr | OldUTF8::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
4513             }xms;
4514              
4515             # regexp of nested parens in qXX
4516             my $q_paren = qr{(?{local $nest=0}) (?>(?:
4517             [^\x80-\xFF()] |
4518             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4519             \( (?{$nest++}) |
4520             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4521             [\x00-\xFF]
4522             }xms;
4523              
4524             my $q_brace = qr{(?{local $nest=0}) (?>(?:
4525             [^\x80-\xFF\{\}] |
4526             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4527             \{ (?{$nest++}) |
4528             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4529             [\x00-\xFF]
4530             }xms;
4531              
4532             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
4533             [^\x80-\xFF\[\]] |
4534             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4535             \[ (?{$nest++}) |
4536             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4537             [\x00-\xFF]
4538             }xms;
4539              
4540             my $q_angle = qr{(?{local $nest=0}) (?>(?:
4541             [^\x80-\xFF<>] |
4542             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4543             \< (?{$nest++}) |
4544             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4545             [\x00-\xFF]
4546             }xms;
4547              
4548             my $matched = '';
4549             my $s_matched = '';
4550              
4551             my $tr_variable = ''; # variable of tr///
4552             my $sub_variable = ''; # variable of s///
4553             my $bind_operator = ''; # =~ or !~
4554              
4555             my @heredoc = (); # here document
4556             my @heredoc_delimiter = ();
4557             my $here_script = ''; # here script
4558              
4559             #
4560             # escape old UTF-8 script
4561 0 50   306 0 0 #
4562             sub OldUTF8::escape(;$) {
4563             local($_) = $_[0] if @_;
4564              
4565             # P.359 The Study Function
4566             # in Chapter 7: Perl
4567 306         1929 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
4568              
4569             study $_; # Yes, I studied study yesterday.
4570              
4571             # while all script
4572              
4573             # 6.14. Matching from Where the Last Pattern Left Off
4574             # in Chapter 6. Pattern Matching
4575             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
4576             # (and so on)
4577              
4578             # one member of Tag-team
4579             #
4580             # P.128 Start of match (or end of previous match): \G
4581             # P.130 Advanced Use of \G with Perl
4582             # in Chapter 3: Overview of Regular Expression Features and Flavors
4583             # P.255 Use leading anchors
4584             # P.256 Expose ^ and \G at the front expressions
4585             # in Chapter 6: Crafting an Efficient Expression
4586             # P.315 "Tag-team" matching with /gc
4587             # in Chapter 7: Perl
4588 306         611 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
4589 306         568  
4590 306         1404 my $e_script = '';
4591             while (not /\G \z/oxgc) { # member
4592             $e_script .= OldUTF8::escape_token();
4593 135644         222772 }
4594              
4595             return $e_script;
4596             }
4597              
4598             #
4599             # escape old UTF-8 token of script
4600             #
4601             sub OldUTF8::escape_token {
4602              
4603 306     135644 0 4621 # \n output here document
4604              
4605             my $ignore_modules = join('|', qw(
4606             utf8
4607             bytes
4608             charnames
4609             I18N::Japanese
4610             I18N::Collate
4611             I18N::JExt
4612             File::DosGlob
4613             Wild
4614             Wildcard
4615             Japanese
4616             ));
4617              
4618             # another member of Tag-team
4619             #
4620             # P.315 "Tag-team" matching with /gc
4621             # in Chapter 7: Perl
4622 135644 100 100     157914 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
    100 100        
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    100          
    100          
    50          
4623 135644         6426496  
4624 22128 100       27004 if (/\G ( \n ) /oxgc) { # another member (and so on)
4625 22128         36842 my $heredoc = '';
4626             if (scalar(@heredoc_delimiter) >= 1) {
4627 191         300 $slash = 'm//';
4628 191         368  
4629             $heredoc = join '', @heredoc;
4630             @heredoc = ();
4631 191         343  
4632 191         344 # skip here document
4633             for my $heredoc_delimiter (@heredoc_delimiter) {
4634 199         1243 /\G .*? \n $heredoc_delimiter \n/xmsgc;
4635             }
4636 191         331 @heredoc_delimiter = ();
4637              
4638 191         273 $here_script = '';
4639             }
4640             return "\n" . $heredoc;
4641             }
4642 22128         77628  
4643             # ignore space, comment
4644             elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
4645              
4646             # if (, elsif (, unless (, while (, until (, given (, and when (
4647              
4648             # given, when
4649              
4650             # P.225 The given Statement
4651             # in Chapter 15: Smart Matching and given-when
4652             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4653              
4654             # P.133 The given Statement
4655             # in Chapter 4: Statements and Declarations
4656             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4657 36018         112275  
4658 2398         3881 elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
4659             $slash = 'm//';
4660             return $1;
4661             }
4662              
4663             # scalar variable ($scalar = ...) =~ tr///;
4664             # scalar variable ($scalar = ...) =~ s///;
4665              
4666             # state
4667              
4668             # P.68 Persistent, Private Variables
4669             # in Chapter 4: Subroutines
4670             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4671              
4672             # P.160 Persistent Lexically Scoped Variables: state
4673             # in Chapter 4: Statements and Declarations
4674             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4675              
4676             # (and so on)
4677 2398         7364  
4678             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
4679 139 50       507 my $e_string = e_string($1);
    50          
4680 139         5520  
4681 0         0 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
4682 0         0 $tr_variable = $e_string . e_string($1);
4683 0         0 $bind_operator = $2;
4684             $slash = 'm//';
4685             return '';
4686 0         0 }
4687 0         0 elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
4688 0         0 $sub_variable = $e_string . e_string($1);
4689 0         0 $bind_operator = $2;
4690             $slash = 'm//';
4691             return '';
4692 0         0 }
4693 139         276 else {
4694             $slash = 'div';
4695             return $e_string;
4696             }
4697             }
4698              
4699 139         519 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
4700 4         9 elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4701             $slash = 'div';
4702             return q{Eoldutf8::PREMATCH()};
4703             }
4704              
4705 4         11 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
4706 28         109 elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4707             $slash = 'div';
4708             return q{Eoldutf8::MATCH()};
4709             }
4710              
4711 28         98 # $', ${'} --> $', ${'}
4712 1         3 elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
4713             $slash = 'div';
4714             return $1;
4715             }
4716              
4717 1         4 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
4718 3         6 elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4719             $slash = 'div';
4720             return q{Eoldutf8::POSTMATCH()};
4721             }
4722              
4723             # scalar variable $scalar =~ tr///;
4724             # scalar variable $scalar =~ s///;
4725             # substr() =~ tr///;
4726 3         10 # substr() =~ s///;
4727             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
4728 2318 100       5322 my $scalar = e_string($1);
    100          
4729 2318         9247  
4730 9         17 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
4731 9         18 $tr_variable = $scalar;
4732 9         13 $bind_operator = $1;
4733             $slash = 'm//';
4734             return '';
4735 9         23 }
4736 95         190 elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
4737 95         298 $sub_variable = $scalar;
4738 95         173 $bind_operator = $1;
4739             $slash = 'm//';
4740             return '';
4741 95         297 }
4742 2214         3153 else {
4743             $slash = 'div';
4744             return $scalar;
4745             }
4746             }
4747              
4748 2214         5953 # end of statement
4749             elsif (/\G ( [,;] ) /oxgc) {
4750             $slash = 'm//';
4751 9208         14164  
4752             # clear tr/// variable
4753             $tr_variable = '';
4754 9208         10784  
4755             # clear s/// variable
4756 9208         11099 $sub_variable = '';
4757              
4758 9208         9928 $bind_operator = '';
4759              
4760             return $1;
4761             }
4762              
4763 9208         30313 # bareword
4764             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
4765             return $1;
4766             }
4767              
4768 0         0 # $0 --> $0
4769 2         5 elsif (/\G ( \$ 0 ) /oxmsgc) {
4770             $slash = 'div';
4771             return $1;
4772 2         7 }
4773 0         0 elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
4774             $slash = 'div';
4775             return $1;
4776             }
4777              
4778 0         0 # $$ --> $$
4779 1         3 elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
4780             $slash = 'div';
4781             return $1;
4782             }
4783              
4784             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
4785 1         4 # $1, $2, $3 --> $1, $2, $3 otherwise
4786 57         114 elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
4787             $slash = 'div';
4788             return e_capture($1);
4789 57         172 }
4790 0         0 elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
4791             $slash = 'div';
4792             return e_capture($1);
4793             }
4794              
4795 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
4796 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
4797             $slash = 'div';
4798             return e_capture($1.'->'.$2);
4799             }
4800              
4801 0         0 # $$foo{ ... } --> $ $foo->{ ... }
4802 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
4803             $slash = 'div';
4804             return e_capture($1.'->'.$2);
4805             }
4806              
4807 0         0 # $$foo
4808 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
4809             $slash = 'div';
4810             return e_capture($1);
4811             }
4812              
4813 0         0 # ${ foo }
4814 0         0 elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
4815             $slash = 'div';
4816             return '${' . $1 . '}';
4817             }
4818              
4819 0         0 # ${ ... }
4820 0         0 elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
4821             $slash = 'div';
4822             return e_capture($1);
4823             }
4824              
4825             # variable or function
4826 0         0 # $ @ % & * $ #
4827 27         51 elsif (/\G ( (?: [\$\@\%\&\*] | \$\# | -> | \b sub \b) (?>\s*) (?: split | chop | index | rindex | lc | uc | fc | chr | ord | reverse | getc | tr | y | q | qq | qx | qw | m | s | qr | glob | lstat | opendir | stat | unlink | chdir ) ) \b /oxmsgc) {
4828             $slash = 'div';
4829             return $1;
4830             }
4831             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
4832 27         88 # $ @ # \ ' " / ? ( ) [ ] < >
4833 90         172 elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
4834             $slash = 'div';
4835             return $1;
4836             }
4837              
4838 90         294 # while ()
4839             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
4840             return $1;
4841             }
4842              
4843             # while () --- glob
4844              
4845             # avoid "Error: Runtime exception" of perl version 5.005_03
4846 0         0  
4847             elsif (/\G \b while (?>\s*) \( (?>\s*) < ((?:[^\x80-\xFF>\0\a\e\f\n\r\t]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])+?) > (?>\s*) \) \b /oxgc) {
4848             return 'while ($_ = Eoldutf8::glob("' . $1 . '"))';
4849             }
4850              
4851 0         0 # while (glob)
4852             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
4853             return 'while ($_ = Eoldutf8::glob_)';
4854             }
4855              
4856 0         0 # while (glob(WILDCARD))
4857             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
4858             return 'while ($_ = Eoldutf8::glob';
4859             }
4860 0         0  
  401         925  
4861             # doit if, doit unless, doit while, doit until, doit for, doit when
4862             elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
4863 401         1457  
  19         35  
4864 19         69 # subroutines of package Eoldutf8
  0         0  
4865 0         0 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  13         18  
4866 13         37 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
4867 0         0 elsif (/\G \b OldUTF8::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  114         172  
4868 114         392 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  2         4  
4869 2         6 elsif (/\G \b OldUTF8::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval OldUTF8::escape'; }
  2         4  
4870 2         6 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         4  
4871 2         5 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::chop'; }
  0         0  
4872 0         0 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  2         4  
4873 2         7 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  2         14  
4874 2         9 elsif (/\G \b OldUTF8::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'OldUTF8::index'; }
  2         4  
4875 2         6 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::index'; }
  0         0  
4876 0         0 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  2         4  
4877 2         5 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  2         4  
4878 2         5 elsif (/\G \b OldUTF8::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'OldUTF8::rindex'; }
  1         2  
4879 1         3 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::rindex'; }
  0         0  
4880 0         0 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lc'; }
  0         0  
4881 0         0 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lcfirst'; }
  0         0  
4882 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::uc'; }
  7         11  
4883             elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::ucfirst'; }
4884             elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::fc'; }
4885 7         21  
  0         0  
4886 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
4887 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
4888 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4889 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4890 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4891 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4892             elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
4893 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\S) ((?:$qq_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4894 0         0  
  0         0  
4895 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
4896 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4897 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4898 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4899 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4900             elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
4901             elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
4902 0         0  
  0         0  
4903 0         0 elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
4904 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
4905 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
4906             elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
4907 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  2         4  
4908 2         6  
  2         4  
4909 2         6 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  36         79  
4910 36         119 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         5  
4911 2         6 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::chr'; }
  2         5  
4912 2         7 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
4913 0         0 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  0         0  
4914 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::glob'; }
  0         0  
4915 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lc_'; }
  0         0  
4916 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lcfirst_'; }
  0         0  
4917 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::uc_'; }
  0         0  
4918 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::ucfirst_'; }
  0         0  
4919             elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::fc_'; }
4920 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
4921 0         0  
  0         0  
4922 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
4923 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
4924 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::chr_'; }
  2         7  
4925 2         9 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
4926 0         0 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  4         11  
4927 4         17 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::glob_'; }
  8         18  
4928             elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
4929             elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
4930 8         31 # split
4931             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
4932 120         261 $slash = 'm//';
4933 120         188  
4934 120         445 my $e = '';
4935             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
4936             $e .= $1;
4937             }
4938 117 100       420  
  120 100       10491  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
4939             # end of split
4940             if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Eoldutf8::split' . $e; }
4941 3         14  
4942             # split scalar value
4943             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Eoldutf8::split' . $e . e_string($1); }
4944 1         6  
4945 0         0 # split literal space
4946 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Eoldutf8::split' . $e . qq {qq$1 $2}; }
4947 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4948 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4949 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4950 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4951 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4952 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Eoldutf8::split' . $e . qq {q$1 $2}; }
4953 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4954 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4955 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4956 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4957 13         206 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4958             elsif (/\G ' [ ] ' /oxgc) { return 'Eoldutf8::split' . $e . qq {' '}; }
4959             elsif (/\G " [ ] " /oxgc) { return 'Eoldutf8::split' . $e . qq {" "}; }
4960              
4961 2 0       9 # split qq//
  0         0  
4962             elsif (/\G \b (qq) \b /oxgc) {
4963 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
4964 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4965 0         0 while (not /\G \z/oxgc) {
4966 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4967 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
4968 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
4969 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
4970 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
4971             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
4972 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
4973             }
4974             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4975             }
4976             }
4977              
4978 0 50       0 # split qr//
  12         588  
4979             elsif (/\G \b (qr) \b /oxgc) {
4980 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
4981 12 50       62 else {
  12 50       5043  
    50          
    50          
    50          
    50          
    50          
    50          
4982 0         0 while (not /\G \z/oxgc) {
4983 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4984 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
4985 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
4986 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
4987 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
4988 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
4989             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
4990 12         84 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
4991             }
4992             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4993             }
4994             }
4995              
4996 0 0       0 # split q//
  0         0  
4997             elsif (/\G \b (q) \b /oxgc) {
4998 0         0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
4999 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
5000 0         0 while (not /\G \z/oxgc) {
5001 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5002 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
5003 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
5004 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
5005 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
5006             elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
5007 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
5008             }
5009             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5010             }
5011             }
5012              
5013 0 50       0 # split m//
  24         742  
5014             elsif (/\G \b (m) \b /oxgc) {
5015 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
5016 24 50       98 else {
  24 50       6020  
    50          
    50          
    50          
    50          
    50          
    50          
5017 0         0 while (not /\G \z/oxgc) {
5018 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5019 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
5020 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
5021 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
5022 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
5023 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
5024             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
5025 24         136 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
5026             }
5027             die __FILE__, ": Search pattern not terminated\n";
5028             }
5029             }
5030              
5031 0         0 # split ''
5032 0         0 elsif (/\G (\') /oxgc) {
5033 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
5034 0         0 while (not /\G \z/oxgc) {
5035 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5036 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
5037             elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
5038 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5039             }
5040             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5041             }
5042              
5043 0         0 # split ""
5044 0         0 elsif (/\G (\") /oxgc) {
5045 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
5046 0         0 while (not /\G \z/oxgc) {
5047 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
5048 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
5049             elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
5050 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
5051             }
5052             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5053             }
5054              
5055 0         0 # split //
5056 65         189 elsif (/\G (\/) /oxgc) {
5057 65 50       248 my $regexp = '';
  434 50       2399  
    100          
    50          
5058 0         0 while (not /\G \z/oxgc) {
5059 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
5060 65         273 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
5061             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
5062 369         835 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
5063             }
5064             die __FILE__, ": Search pattern not terminated\n";
5065             }
5066             }
5067              
5068             # tr/// or y///
5069              
5070             # about [cdsrbB]* (/B modifier)
5071             #
5072             # P.559 appendix C
5073             # of ISBN 4-89052-384-7 Programming perl
5074             # (Japanese title is: Perl puroguramingu)
5075 0         0  
5076             elsif (/\G \b ( tr | y ) \b /oxgc) {
5077             my $ope = $1;
5078 11 50       25  
5079 11         204 # $1 $2 $3 $4 $5 $6
5080 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
5081             my @tr = ($tr_variable,$2);
5082             return e_tr(@tr,'',$4,$6);
5083 0         0 }
5084 11         24 else {
5085 11 50       31 my $e = '';
  11 50       1099  
    50          
    50          
    50          
    50          
5086             while (not /\G \z/oxgc) {
5087 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5088 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
5089 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
5090 0         0 while (not /\G \z/oxgc) {
5091 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5092 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
5093 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
5094 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
5095             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
5096 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
5097             }
5098             die __FILE__, ": Transliteration replacement not terminated\n";
5099 0         0 }
5100 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
5101 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
5102 0         0 while (not /\G \z/oxgc) {
5103 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5104 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
5105 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
5106 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
5107             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
5108 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
5109             }
5110             die __FILE__, ": Transliteration replacement not terminated\n";
5111 0         0 }
5112 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
5113 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
5114 0         0 while (not /\G \z/oxgc) {
5115 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5116 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
5117 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
5118 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
5119             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
5120 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
5121             }
5122             die __FILE__, ": Transliteration replacement not terminated\n";
5123 0         0 }
5124 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
5125 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
5126 0         0 while (not /\G \z/oxgc) {
5127 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5128 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
5129 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
5130 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
5131             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
5132 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
5133             }
5134             die __FILE__, ": Transliteration replacement not terminated\n";
5135             }
5136 0         0 # $1 $2 $3 $4 $5 $6
5137 11         44 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
5138             my @tr = ($tr_variable,$2);
5139             return e_tr(@tr,'',$4,$6);
5140 11         48 }
5141             }
5142             die __FILE__, ": Transliteration pattern not terminated\n";
5143             }
5144             }
5145              
5146 0         0 # qq//
5147             elsif (/\G \b (qq) \b /oxgc) {
5148             my $ope = $1;
5149 3822 100       8425  
5150 3822         7122 # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
5151 40         54 if (/\G (\#) /oxgc) { # qq# #
5152 40 100       94 my $qq_string = '';
  1948 50       5449  
    100          
    50          
5153 80         150 while (not /\G \z/oxgc) {
5154 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
5155 40         78 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
5156             elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
5157 1828         3312 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5158             }
5159             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5160             }
5161 0         0  
5162 3782         4927 else {
5163 3782 50       8869 my $e = '';
  3782 50       14488  
    100          
    50          
    100          
    50          
5164             while (not /\G \z/oxgc) {
5165             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5166              
5167 0         0 # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
5168 0         0 elsif (/\G (\() /oxgc) { # qq ( )
5169 0         0 my $qq_string = '';
5170 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
5171 0         0 while (not /\G \z/oxgc) {
5172 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
5173             elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
5174 0 0       0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
5175 0         0 elsif (/\G (\)) /oxgc) {
5176             if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
5177 0         0 else { $qq_string .= $1; }
5178             }
5179 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5180             }
5181             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5182             }
5183              
5184 0         0 # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
5185 3724         4865 elsif (/\G (\{) /oxgc) { # qq { }
5186 3724         4994 my $qq_string = '';
5187 3724 100       7536 local $nest = 1;
  155912 50       498945  
    100          
    100          
    50          
5188 792         1654 while (not /\G \z/oxgc) {
5189 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  1384         2045  
5190             elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
5191 1384 100       2344 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  5108         7797  
5192 3724         7456 elsif (/\G (\}) /oxgc) {
5193             if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
5194 1384         2723 else { $qq_string .= $1; }
5195             }
5196 148628         293356 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5197             }
5198             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5199             }
5200              
5201 0         0 # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
5202 0         0 elsif (/\G (\[) /oxgc) { # qq [ ]
5203 0         0 my $qq_string = '';
5204 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
5205 0         0 while (not /\G \z/oxgc) {
5206 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
5207             elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
5208 0 0       0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
5209 0         0 elsif (/\G (\]) /oxgc) {
5210             if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
5211 0         0 else { $qq_string .= $1; }
5212             }
5213 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5214             }
5215             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5216             }
5217              
5218 0         0 # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
5219 38         66 elsif (/\G (\<) /oxgc) { # qq < >
5220 38         67 my $qq_string = '';
5221 38 100       128 local $nest = 1;
  1418 50       6445  
    50          
    100          
    50          
5222 22         53 while (not /\G \z/oxgc) {
5223 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
5224             elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
5225 0 50       0 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  38         87  
5226 38         97 elsif (/\G (\>) /oxgc) {
5227             if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
5228 0         0 else { $qq_string .= $1; }
5229             }
5230 1358         2664 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5231             }
5232             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5233             }
5234              
5235 0         0 # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
5236 20         28 elsif (/\G (\S) /oxgc) { # qq * *
5237 20         21 my $delimiter = $1;
5238 20 50       35 my $qq_string = '';
  840 50       2437  
    100          
    50          
5239 0         0 while (not /\G \z/oxgc) {
5240 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
5241 20         38 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
5242             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
5243 820         1805 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5244             }
5245             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5246 0         0 }
5247             }
5248             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5249             }
5250             }
5251              
5252 0         0 # qr//
5253 36 50       91 elsif (/\G \b (qr) \b /oxgc) {
5254 36         326 my $ope = $1;
5255             if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
5256             return e_qr($ope,$1,$3,$2,$4);
5257 0         0 }
5258 36         56 else {
5259 36 50       102 my $e = '';
  36 50       2684  
    100          
    50          
    50          
    100          
    50          
    50          
5260 0         0 while (not /\G \z/oxgc) {
5261 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5262 1         6 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
5263 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
5264 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
5265 2         18 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
5266 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
5267             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
5268 33         109 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
5269             }
5270             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5271             }
5272             }
5273              
5274 0         0 # qw//
5275 34 50       84 elsif (/\G \b (qw) \b /oxgc) {
5276 34         92 my $ope = $1;
5277             if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
5278             return e_qw($ope,$1,$3,$2);
5279 0         0 }
5280 34         61 else {
5281 34 50       96 my $e = '';
  34 50       222  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5282             while (not /\G \z/oxgc) {
5283 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5284 34         101  
5285             elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
5286 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
5287 0         0  
5288             elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
5289 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
5290 0         0  
5291             elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
5292 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
5293 0         0  
5294             elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
5295 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
5296 0         0  
5297             elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
5298 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
5299             }
5300             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5301             }
5302             }
5303              
5304 0         0 # qx//
5305 2 50       6 elsif (/\G \b (qx) \b /oxgc) {
5306 2         52 my $ope = $1;
5307             if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
5308             return e_qq($ope,$1,$3,$2);
5309 0         0 }
5310 2         6 else {
5311 2 50       5 my $e = '';
  2 50       144  
    50          
    0          
    0          
    0          
    0          
5312 0         0 while (not /\G \z/oxgc) {
5313 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5314 2         8 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
5315 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
5316 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
5317 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
5318             elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
5319 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
5320             }
5321             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5322             }
5323             }
5324              
5325 0         0 # q//
5326             elsif (/\G \b (q) \b /oxgc) {
5327             my $ope = $1;
5328              
5329             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
5330              
5331             # avoid "Error: Runtime exception" of perl version 5.005_03
5332 527 50       1447 # (and so on)
5333 527         2521  
5334 0         0 if (/\G (\#) /oxgc) { # q# #
5335 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
5336 0         0 while (not /\G \z/oxgc) {
5337 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5338 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
5339             elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
5340 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5341             }
5342             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5343             }
5344 0         0  
5345 527         1016 else {
5346 527 50       1607 my $e = '';
  527 50       3861  
    100          
    50          
    100          
    50          
5347             while (not /\G \z/oxgc) {
5348             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5349              
5350 0         0 # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
5351 0         0 elsif (/\G (\() /oxgc) { # q ( )
5352 0         0 my $q_string = '';
5353 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
5354 0         0 while (not /\G \z/oxgc) {
5355 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5356 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
  0         0  
5357             elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
5358 0 0       0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  0         0  
5359 0         0 elsif (/\G (\)) /oxgc) {
5360             if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
5361 0         0 else { $q_string .= $1; }
5362             }
5363 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5364             }
5365             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5366             }
5367              
5368 0         0 # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
5369 521         888 elsif (/\G (\{) /oxgc) { # q { }
5370 521         1009 my $q_string = '';
5371 521 50       1555 local $nest = 1;
  8167 50       36432  
    50          
    100          
    100          
    50          
5372 0         0 while (not /\G \z/oxgc) {
5373 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5374 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
  114         242  
5375             elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
5376 114 100       255 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  635         1408  
5377 521         1508 elsif (/\G (\}) /oxgc) {
5378             if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
5379 114         227 else { $q_string .= $1; }
5380             }
5381 7418         15196 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5382             }
5383             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5384             }
5385              
5386 0         0 # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
5387 0         0 elsif (/\G (\[) /oxgc) { # q [ ]
5388 0         0 my $q_string = '';
5389 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
5390 0         0 while (not /\G \z/oxgc) {
5391 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5392 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
  0         0  
5393             elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
5394 0 0       0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
5395 0         0 elsif (/\G (\]) /oxgc) {
5396             if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
5397 0         0 else { $q_string .= $1; }
5398             }
5399 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5400             }
5401             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5402             }
5403              
5404 0         0 # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
5405 5         11 elsif (/\G (\<) /oxgc) { # q < >
5406 5         10 my $q_string = '';
5407 5 50       18 local $nest = 1;
  82 50       715  
    50          
    50          
    100          
    50          
5408 0         0 while (not /\G \z/oxgc) {
5409 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5410 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
  0         0  
5411             elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
5412 0 50       0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  5         16  
5413 5         17 elsif (/\G (\>) /oxgc) {
5414             if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
5415 0         0 else { $q_string .= $1; }
5416             }
5417 77         190 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5418             }
5419             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5420             }
5421              
5422 0         0 # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
5423 1         2 elsif (/\G (\S) /oxgc) { # q * *
5424 1         3 my $delimiter = $1;
5425 1 50       5 my $q_string = '';
  14 50       82  
    100          
    50          
5426 0         0 while (not /\G \z/oxgc) {
5427 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5428 1         3 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
5429             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
5430 13         28 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5431             }
5432             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5433 0         0 }
5434             }
5435             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5436             }
5437             }
5438              
5439 0         0 # m//
5440 269 50       656 elsif (/\G \b (m) \b /oxgc) {
5441 269         4021 my $ope = $1;
5442             if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
5443             return e_qr($ope,$1,$3,$2,$4);
5444 0         0 }
5445 269         493 else {
5446 269 50       714 my $e = '';
  269 50       21320  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
5447 0         0 while (not /\G \z/oxgc) {
5448 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5449 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
5450 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
5451 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
5452 18         61 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
5453 13         47 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
5454 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
5455             elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
5456 238         818 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
5457             }
5458             die __FILE__, ": Search pattern not terminated\n";
5459             }
5460             }
5461              
5462             # s///
5463              
5464             # about [cegimosxpradlunbB]* (/cg modifier)
5465             #
5466             # P.67 Pattern-Matching Operators
5467             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
5468 0         0  
5469             elsif (/\G \b (s) \b /oxgc) {
5470             my $ope = $1;
5471 132 100       361  
5472 132         4344 # $1 $2 $3 $4 $5 $6
5473             if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
5474             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5475 1         7 }
5476 131         279 else {
5477 131 50       433 my $e = '';
  131 50       33099  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
5478             while (not /\G \z/oxgc) {
5479 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5480 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
5481 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5482             while (not /\G \z/oxgc) {
5483 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5484 0         0 # $1 $2 $3 $4
5485 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5486 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5487 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5488 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5489 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5490 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5491 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5492             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5493 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5494             }
5495             die __FILE__, ": Substitution replacement not terminated\n";
5496 0         0 }
5497 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
5498 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5499             while (not /\G \z/oxgc) {
5500 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5501 0         0 # $1 $2 $3 $4
5502 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5503 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5504 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5505 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5506 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5507 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5508 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5509             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5510 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5511             }
5512             die __FILE__, ": Substitution replacement not terminated\n";
5513 0         0 }
5514 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
5515 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
5516             while (not /\G \z/oxgc) {
5517 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5518 0         0 # $1 $2 $3 $4
5519 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5520 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5521 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5522 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5523 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5524             elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5525 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5526             }
5527             die __FILE__, ": Substitution replacement not terminated\n";
5528 0         0 }
5529 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
5530 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5531             while (not /\G \z/oxgc) {
5532 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
5533 0         0 # $1 $2 $3 $4
5534 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5535 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5536 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5537 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5538 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5539 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5540 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5541             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5542 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5543             }
5544             die __FILE__, ": Substitution replacement not terminated\n";
5545             }
5546 0         0 # $1 $2 $3 $4 $5 $6
5547             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
5548             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5549             }
5550 22         62 # $1 $2 $3 $4 $5 $6
5551             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
5552             return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
5553             }
5554 2         15 # $1 $2 $3 $4 $5 $6
5555             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
5556             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5557             }
5558 0         0 # $1 $2 $3 $4 $5 $6
5559             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
5560             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5561 107         572 }
5562             }
5563             die __FILE__, ": Substitution pattern not terminated\n";
5564             }
5565             }
5566 0         0  
5567 0         0 # require ignore module
5568 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
5569             elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "# require$1\n$2"; }
5570             elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
5571 0         0  
5572 43         342 # use strict; --> use strict; no strict qw(refs);
5573 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
5574             elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
5575             elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
5576              
5577 0 50 33     0 # use 5.12.0; --> use 5.12.0; no strict qw(refs);
      33        
5578 3         51 elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
5579             if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
5580             return "use $1; no strict qw(refs);";
5581 0         0 }
5582             else {
5583             return "use $1;";
5584             }
5585 3 0 0     22 }
      0        
5586 0         0 elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
5587             if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
5588             return "use $1; no strict qw(refs);";
5589 0         0 }
5590             else {
5591             return "use $1;";
5592             }
5593             }
5594 0         0  
5595 2         15 # ignore use module
5596 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
5597             elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "# use$1\n$2"; }
5598             elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
5599 0         0  
5600 0         0 # ignore no module
5601 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
5602             elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "# no$1\n$2"; }
5603             elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
5604 0         0  
5605             # use else
5606             elsif (/\G \b use \b /oxmsgc) { return "use"; }
5607 0         0  
5608             # use else
5609             elsif (/\G \b no \b /oxmsgc) { return "no"; }
5610              
5611 2         11 # ''
5612 1589         3401 elsif (/\G (?
5613 1589 100       4160 my $q_string = '';
  10597 100       38273  
    100          
    50          
5614 4         10 while (not /\G \z/oxgc) {
5615 48         86 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
5616 1589         3775 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
5617             elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
5618 8956         18447 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5619             }
5620             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5621             }
5622              
5623 0         0 # ""
5624 5587         11036 elsif (/\G (\") /oxgc) {
5625 5587 100       13204 my $qq_string = '';
  88088 100       261343  
    100          
    50          
5626 109         308 while (not /\G \z/oxgc) {
5627 12         25 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
5628 5587         11568 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
5629             elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
5630 82380         167304 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
5631             }
5632             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5633             }
5634              
5635 0         0 # ``
5636 1         5 elsif (/\G (\`) /oxgc) {
5637 1 50       30 my $qx_string = '';
  19 50       88  
    100          
    50          
5638 0         0 while (not /\G \z/oxgc) {
5639 0         0 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
5640 1         3 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
5641             elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
5642 18         35 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
5643             }
5644             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5645             }
5646              
5647 0         0 # // --- not divide operator (num / num), not defined-or
5648 1069         2306 elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
5649 1069 100       3399 my $regexp = '';
  10235 50       36371  
    100          
    50          
5650 1         4 while (not /\G \z/oxgc) {
5651 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
5652 1069         2785 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
5653             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
5654 9165         18291 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
5655             }
5656             die __FILE__, ": Search pattern not terminated\n";
5657             }
5658              
5659 0         0 # ?? --- not conditional operator (condition ? then : else)
5660 18         40 elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
5661 18 50       49 my $regexp = '';
  82 50       392  
    100          
    50          
5662 0         0 while (not /\G \z/oxgc) {
5663 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
5664 18         50 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
5665             elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
5666 64         144 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
5667             }
5668             die __FILE__, ": Search pattern not terminated\n";
5669             }
5670 0         0  
  0         0  
5671             # <<>> (a safer ARGV)
5672             elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
5673 0         0  
  0         0  
5674             # << (bit shift) --- not here document
5675             elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
5676              
5677 0         0 # <<~'HEREDOC'
5678 6         41 elsif (/\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
5679 6         14 $slash = 'm//';
5680             my $here_quote = $1;
5681             my $delimiter = $2;
5682 6 50       12  
5683 6         11 # get here document
5684 6         42 if ($here_script eq '') {
5685             $here_script = CORE::substr $_, pos $_;
5686 6 50       31 $here_script =~ s/.*?\n//oxm;
5687 6         65 }
5688 6         16 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5689 6         8 my $heredoc = $1;
5690 6         47 my $indent = $2;
5691 6         20 $heredoc =~ s{^$indent}{}msg; # no /ox
5692             push @heredoc, $heredoc . qq{\n$delimiter\n};
5693             push @heredoc_delimiter, qq{\\s*$delimiter};
5694 6         12 }
5695             else {
5696 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5697             }
5698             return qq{<<'$delimiter'};
5699             }
5700              
5701             # <<~\HEREDOC
5702              
5703             # P.66 2.6.6. "Here" Documents
5704             # in Chapter 2: Bits and Pieces
5705             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5706              
5707             # P.73 "Here" Documents
5708             # in Chapter 2: Bits and Pieces
5709             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5710 6         25  
5711 3         5 elsif (/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
5712 3         7 $slash = 'm//';
5713             my $here_quote = $1;
5714             my $delimiter = $2;
5715 3 50       6  
5716 3         8 # get here document
5717 3         20 if ($here_script eq '') {
5718             $here_script = CORE::substr $_, pos $_;
5719 3 50       18 $here_script =~ s/.*?\n//oxm;
5720 3         42 }
5721 3         9 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5722 3         7 my $heredoc = $1;
5723 3         34 my $indent = $2;
5724 3         11 $heredoc =~ s{^$indent}{}msg; # no /ox
5725             push @heredoc, $heredoc . qq{\n$delimiter\n};
5726             push @heredoc_delimiter, qq{\\s*$delimiter};
5727 3         8 }
5728             else {
5729 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5730             }
5731             return qq{<<\\$delimiter};
5732             }
5733              
5734 3         13 # <<~"HEREDOC"
5735 6         12 elsif (/\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
5736 6         8 $slash = 'm//';
5737             my $here_quote = $1;
5738             my $delimiter = $2;
5739 6 50       10  
5740 6         10 # get here document
5741 6         26 if ($here_script eq '') {
5742             $here_script = CORE::substr $_, pos $_;
5743 6 50       29 $here_script =~ s/.*?\n//oxm;
5744 6         49 }
5745 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5746 6         14 my $heredoc = $1;
5747 6         43 my $indent = $2;
5748 6         18 $heredoc =~ s{^$indent}{}msg; # no /ox
5749             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5750             push @heredoc_delimiter, qq{\\s*$delimiter};
5751 6         13 }
5752             else {
5753 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5754             }
5755             return qq{<<"$delimiter"};
5756             }
5757              
5758 6         21 # <<~HEREDOC
5759 3         6 elsif (/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
5760 3         7 $slash = 'm//';
5761             my $here_quote = $1;
5762             my $delimiter = $2;
5763 3 50       4  
5764 3         7 # get here document
5765 3         26 if ($here_script eq '') {
5766             $here_script = CORE::substr $_, pos $_;
5767 3 50       18 $here_script =~ s/.*?\n//oxm;
5768 3         44 }
5769 3         7 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5770 3         6 my $heredoc = $1;
5771 3         33 my $indent = $2;
5772 3         10 $heredoc =~ s{^$indent}{}msg; # no /ox
5773             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5774             push @heredoc_delimiter, qq{\\s*$delimiter};
5775 3         9 }
5776             else {
5777 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5778             }
5779             return qq{<<$delimiter};
5780             }
5781              
5782 3         11 # <<~`HEREDOC`
5783 6         10 elsif (/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
5784 6         18 $slash = 'm//';
5785             my $here_quote = $1;
5786             my $delimiter = $2;
5787 6 50       13  
5788 6         11 # get here document
5789 6         17 if ($here_script eq '') {
5790             $here_script = CORE::substr $_, pos $_;
5791 6 50       33 $here_script =~ s/.*?\n//oxm;
5792 6         53 }
5793 6         11 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5794 6         9 my $heredoc = $1;
5795 6         42 my $indent = $2;
5796 6         16 $heredoc =~ s{^$indent}{}msg; # no /ox
5797             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5798             push @heredoc_delimiter, qq{\\s*$delimiter};
5799 6         12 }
5800             else {
5801 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5802             }
5803             return qq{<<`$delimiter`};
5804             }
5805              
5806 6         23 # <<'HEREDOC'
5807 80         281 elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
5808 80         166 $slash = 'm//';
5809             my $here_quote = $1;
5810             my $delimiter = $2;
5811 80 100       143  
5812 80         151 # get here document
5813 77         373 if ($here_script eq '') {
5814             $here_script = CORE::substr $_, pos $_;
5815 77 50       440 $here_script =~ s/.*?\n//oxm;
5816 80         625 }
5817 80         263 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5818             push @heredoc, $1 . qq{\n$delimiter\n};
5819             push @heredoc_delimiter, $delimiter;
5820 80         117 }
5821             else {
5822 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5823             }
5824             return $here_quote;
5825             }
5826              
5827             # <<\HEREDOC
5828              
5829             # P.66 2.6.6. "Here" Documents
5830             # in Chapter 2: Bits and Pieces
5831             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5832              
5833             # P.73 "Here" Documents
5834             # in Chapter 2: Bits and Pieces
5835             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5836 80         329  
5837 2         4 elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
5838 2         5 $slash = 'm//';
5839             my $here_quote = $1;
5840             my $delimiter = $2;
5841 2 100       3  
5842 2         6 # get here document
5843 1         5 if ($here_script eq '') {
5844             $here_script = CORE::substr $_, pos $_;
5845 1 50       6 $here_script =~ s/.*?\n//oxm;
5846 2         37 }
5847 2         9 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5848             push @heredoc, $1 . qq{\n$delimiter\n};
5849             push @heredoc_delimiter, $delimiter;
5850 2         4 }
5851             else {
5852 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5853             }
5854             return $here_quote;
5855             }
5856              
5857 2         8 # <<"HEREDOC"
5858 39         95 elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
5859 39         110 $slash = 'm//';
5860             my $here_quote = $1;
5861             my $delimiter = $2;
5862 39 100       77  
5863 39         105 # get here document
5864 38         193 if ($here_script eq '') {
5865             $here_script = CORE::substr $_, pos $_;
5866 38 50       214 $here_script =~ s/.*?\n//oxm;
5867 39         491 }
5868 39         125 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5869             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5870             push @heredoc_delimiter, $delimiter;
5871 39         93 }
5872             else {
5873 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5874             }
5875             return $here_quote;
5876             }
5877              
5878 39         149 # <
5879 54         118 elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
5880 54         122 $slash = 'm//';
5881             my $here_quote = $1;
5882             my $delimiter = $2;
5883 54 100       99  
5884 54         155 # get here document
5885 51         315 if ($here_script eq '') {
5886             $here_script = CORE::substr $_, pos $_;
5887 51 50       315 $here_script =~ s/.*?\n//oxm;
5888 54         802 }
5889 54         184 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5890             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5891             push @heredoc_delimiter, $delimiter;
5892 54         124 }
5893             else {
5894 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5895             }
5896             return $here_quote;
5897             }
5898              
5899 54         291 # <<`HEREDOC`
5900 0         0 elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
5901 0         0 $slash = 'm//';
5902             my $here_quote = $1;
5903             my $delimiter = $2;
5904 0 0       0  
5905 0         0 # get here document
5906 0         0 if ($here_script eq '') {
5907             $here_script = CORE::substr $_, pos $_;
5908 0 0       0 $here_script =~ s/.*?\n//oxm;
5909 0         0 }
5910 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5911             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5912             push @heredoc_delimiter, $delimiter;
5913 0         0 }
5914             else {
5915 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5916             }
5917             return $here_quote;
5918             }
5919              
5920 0         0 # <<= <=> <= < operator
5921             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
5922             return $1;
5923             }
5924              
5925 12         61 #
5926             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
5927             return $1;
5928             }
5929              
5930             # --- glob
5931              
5932             # avoid "Error: Runtime exception" of perl version 5.005_03
5933 0         0  
5934             elsif (/\G < ((?:[^\x80-\xFF>\0\a\e\f\n\r\t]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])+?) > /oxgc) {
5935             return 'Eoldutf8::glob("' . $1 . '")';
5936             }
5937 0         0  
5938             # __DATA__
5939             elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
5940 0         0  
5941             # __END__
5942             elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
5943              
5944             # \cD Control-D
5945              
5946             # P.68 2.6.8. Other Literal Tokens
5947             # in Chapter 2: Bits and Pieces
5948             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5949              
5950             # P.76 Other Literal Tokens
5951             # in Chapter 2: Bits and Pieces
5952 306         2168 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5953              
5954             elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
5955 0         0  
5956             # \cZ Control-Z
5957             elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
5958              
5959             # any operator before div
5960             elsif (/\G (
5961             -- | \+\+ |
5962 0         0 [\)\}\]]
  8556         16964  
5963              
5964             ) /oxgc) { $slash = 'div'; return $1; }
5965              
5966             # yada-yada or triple-dot operator
5967             elsif (/\G (
5968 8556         37752 \.\.\.
  7         12  
5969              
5970             ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
5971              
5972             # any operator before m//
5973              
5974             # //, //= (defined-or)
5975              
5976             # P.164 Logical Operators
5977             # in Chapter 10: More Control Structures
5978             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
5979              
5980             # P.119 C-Style Logical (Short-Circuit) Operators
5981             # in Chapter 3: Unary and Binary Operators
5982             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5983              
5984             # (and so on)
5985              
5986             # ~~
5987              
5988             # P.221 The Smart Match Operator
5989             # in Chapter 15: Smart Matching and given-when
5990             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
5991              
5992             # P.112 Smartmatch Operator
5993             # in Chapter 3: Unary and Binary Operators
5994             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5995              
5996             # (and so on)
5997              
5998             elsif (/\G ((?>
5999              
6000             !~~ | !~ | != | ! |
6001             %= | % |
6002             &&= | && | &= | &\.= | &\. | & |
6003             -= | -> | - |
6004             :(?>\s*)= |
6005             : |
6006             <<>> |
6007             <<= | <=> | <= | < |
6008             == | => | =~ | = |
6009             >>= | >> | >= | > |
6010             \*\*= | \*\* | \*= | \* |
6011             \+= | \+ |
6012             \.\. | \.= | \. |
6013             \/\/= | \/\/ |
6014             \/= | \/ |
6015             \? |
6016             \\ |
6017             \^= | \^\.= | \^\. | \^ |
6018             \b x= |
6019             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
6020             ~~ | ~\. | ~ |
6021             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
6022             \b(?: print )\b |
6023              
6024 7         25 [,;\(\{\[]
  16324         33820  
6025              
6026             )) /oxgc) { $slash = 'm//'; return $1; }
6027 16324         68632  
  23922         43924  
6028             # other any character
6029             elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
6030              
6031 23922         105977 # system error
6032             else {
6033             die __FILE__, ": Oops, this shouldn't happen!\n";
6034             }
6035             }
6036              
6037 0     2512 0 0 # escape old UTF-8 string
6038 2512         5660 sub e_string {
6039             my($string) = @_;
6040 2512         3631 my $e_string = '';
6041              
6042             local $slash = 'm//';
6043              
6044             # P.1024 Appendix W.10 Multibyte Processing
6045             # of ISBN 1-56592-224-7 CJKV Information Processing
6046 2512         3699 # (and so on)
6047              
6048             my @char = $string =~ / \G (?>[^\x80-\xFF\\]|\\$q_char|$q_char) /oxmsg;
6049 2512 100 66     26244  
6050 2512 50       10843 # without { ... }
6051 2473         5265 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
6052             if ($string !~ /<
6053             return $string;
6054             }
6055             }
6056 2473         5878  
6057 39 50       129 E_STRING_LOOP:
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    50          
6058             while ($string !~ /\G \z/oxgc) {
6059             if (0) {
6060             }
6061 293         20819  
6062 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Eoldutf8::PREMATCH()]}
6063 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
6064             $e_string .= q{Eoldutf8::PREMATCH()};
6065             $slash = 'div';
6066             }
6067              
6068 0         0 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Eoldutf8::MATCH()]}
6069 0         0 elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
6070             $e_string .= q{Eoldutf8::MATCH()};
6071             $slash = 'div';
6072             }
6073              
6074 0         0 # $', ${'} --> $', ${'}
6075 0         0 elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
6076             $e_string .= $1;
6077             $slash = 'div';
6078             }
6079              
6080 0         0 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Eoldutf8::POSTMATCH()]}
6081 0         0 elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
6082             $e_string .= q{Eoldutf8::POSTMATCH()};
6083             $slash = 'div';
6084             }
6085              
6086 0         0 # bareword
6087 0         0 elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
6088             $e_string .= $1;
6089             $slash = 'div';
6090             }
6091              
6092 0         0 # $0 --> $0
6093 0         0 elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
6094             $e_string .= $1;
6095             $slash = 'div';
6096 0         0 }
6097 0         0 elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
6098             $e_string .= $1;
6099             $slash = 'div';
6100             }
6101              
6102 0         0 # $$ --> $$
6103 0         0 elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
6104             $e_string .= $1;
6105             $slash = 'div';
6106             }
6107              
6108             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6109 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6110 0         0 elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
6111             $e_string .= e_capture($1);
6112             $slash = 'div';
6113 0         0 }
6114 0         0 elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
6115             $e_string .= e_capture($1);
6116             $slash = 'div';
6117             }
6118              
6119 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6120 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
6121             $e_string .= e_capture($1.'->'.$2);
6122             $slash = 'div';
6123             }
6124              
6125 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6126 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
6127             $e_string .= e_capture($1.'->'.$2);
6128             $slash = 'div';
6129             }
6130              
6131 0         0 # $$foo
6132 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
6133             $e_string .= e_capture($1);
6134             $slash = 'div';
6135             }
6136              
6137 0         0 # ${ foo }
6138 0         0 elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
6139             $e_string .= '${' . $1 . '}';
6140             $slash = 'div';
6141             }
6142              
6143 0         0 # ${ ... }
6144 3         8 elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
6145             $e_string .= e_capture($1);
6146             $slash = 'div';
6147             }
6148              
6149             # variable or function
6150 3         15 # $ @ % & * $ #
6151 1         5 elsif ($string =~ /\G ( (?: [\$\@\%\&\*] | \$\# | -> | \b sub \b) (?>\s*) (?: split | chop | index | rindex | lc | uc | fc | chr | ord | reverse | getc | tr | y | q | qq | qx | qw | m | s | qr | glob | lstat | opendir | stat | unlink | chdir ) ) \b /oxmsgc) {
6152             $e_string .= $1;
6153             $slash = 'div';
6154             }
6155             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
6156 1         6 # $ @ # \ ' " / ? ( ) [ ] < >
6157 0         0 elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
6158             $e_string .= $1;
6159             $slash = 'div';
6160             }
6161 0         0  
  0         0  
6162 0         0 # subroutines of package Eoldutf8
  0         0  
6163 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
6164 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
6165 0         0 elsif ($string =~ /\G \b OldUTF8::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
6166 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
6167 0         0 elsif ($string =~ /\G \b OldUTF8::eval \b /oxgc) { $e_string .= 'eval OldUTF8::escape'; $slash = 'm//'; }
  0         0  
6168 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
6169 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Eoldutf8::chop'; $slash = 'm//'; }
  0         0  
6170 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
6171 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
6172 0         0 elsif ($string =~ /\G \b OldUTF8::index \b /oxgc) { $e_string .= 'OldUTF8::index'; $slash = 'm//'; }
  0         0  
6173 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Eoldutf8::index'; $slash = 'm//'; }
  0         0  
6174 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
6175 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
6176 0         0 elsif ($string =~ /\G \b OldUTF8::rindex \b /oxgc) { $e_string .= 'OldUTF8::rindex'; $slash = 'm//'; }
  0         0  
6177 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Eoldutf8::rindex'; $slash = 'm//'; }
  0         0  
6178 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::lc'; $slash = 'm//'; }
  0         0  
6179 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::lcfirst'; $slash = 'm//'; }
  0         0  
6180 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::uc'; $slash = 'm//'; }
  0         0  
6181             elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::ucfirst'; $slash = 'm//'; }
6182             elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::fc'; $slash = 'm//'; }
6183 0         0  
  0         0  
6184 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
6185 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
6186 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
6187 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
6188 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
6189 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
6190             elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
6191 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\S) ((?:$qq_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
6192 0         0  
  0         0  
6193 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
6194 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
6195 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
6196 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
6197 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
6198             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
6199             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
6200 0         0  
  0         0  
6201 0         0 elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
  0         0  
6202 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
6203 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
6204             elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
6205 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
6206 0         0  
  0         0  
6207 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
6208 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
6209 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::chr'; $slash = 'm//'; }
  0         0  
6210 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
6211 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
6212 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::glob'; $slash = 'm//'; }
  0         0  
6213 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Eoldutf8::lc_'; $slash = 'm//'; }
  0         0  
6214 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Eoldutf8::lcfirst_'; $slash = 'm//'; }
  0         0  
6215 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Eoldutf8::uc_'; $slash = 'm//'; }
  0         0  
6216 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Eoldutf8::ucfirst_'; $slash = 'm//'; }
  0         0  
6217             elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Eoldutf8::fc_'; $slash = 'm//'; }
6218 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
6219 0         0  
  0         0  
6220 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
6221 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
6222 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Eoldutf8::chr_'; $slash = 'm//'; }
  0         0  
6223 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
6224 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
6225 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Eoldutf8::glob_'; $slash = 'm//'; }
  0         0  
6226             elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
6227             elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
6228 0         0 # split
6229             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
6230 0         0 $slash = 'm//';
6231 0         0  
6232 0         0 my $e = '';
6233             while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
6234             $e .= $1;
6235             }
6236 0 0       0  
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
6237             # end of split
6238             if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Eoldutf8::split' . $e; }
6239 0         0  
  0         0  
6240             # split scalar value
6241             elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . e_string($1); next E_STRING_LOOP; }
6242 0         0  
  0         0  
6243 0         0 # split literal space
  0         0  
6244 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
6245 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6246 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6247 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6248 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6249 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6250 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
6251 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6252 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6253 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6254 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6255 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6256             elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {' '}; next E_STRING_LOOP; }
6257             elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {" "}; next E_STRING_LOOP; }
6258              
6259 0 0       0 # split qq//
  0         0  
  0         0  
6260             elsif ($string =~ /\G \b (qq) \b /oxgc) {
6261 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
6262 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6263 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
6264 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
6265 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq ( ) --> qr ( )
  0         0  
6266 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq { } --> qr { }
  0         0  
6267 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq [ ] --> qr [ ]
  0         0  
6268 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq < > --> qr < >
  0         0  
6269             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
6270 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq * * --> qr * *
6271             }
6272             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6273             }
6274             }
6275              
6276 0 0       0 # split qr//
  0         0  
  0         0  
6277             elsif ($string =~ /\G \b (qr) \b /oxgc) {
6278 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
6279 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
6280 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
6281 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
6282 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr ( )
  0         0  
6283 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr { }
  0         0  
6284 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr [ ]
  0         0  
6285 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr < >
  0         0  
6286 0         0 elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split_q($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr ' '
  0         0  
6287             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
6288 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr * *
6289             }
6290             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6291             }
6292             }
6293              
6294 0 0       0 # split q//
  0         0  
  0         0  
6295             elsif ($string =~ /\G \b (q) \b /oxgc) {
6296 0         0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
6297 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6298 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
6299 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
6300 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q ( ) --> qr ( )
  0         0  
6301 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q { } --> qr { }
  0         0  
6302 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q [ ] --> qr [ ]
  0         0  
6303 0         0 elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q < > --> qr < >
  0         0  
6304             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
6305 0         0 elsif ($string =~ /\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q * * --> qr * *
6306             }
6307             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6308             }
6309             }
6310              
6311 0 0       0 # split m//
  0         0  
  0         0  
6312             elsif ($string =~ /\G \b (m) \b /oxgc) {
6313 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # m# # --> qr # #
6314 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
6315 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
6316 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
6317 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m ( ) --> qr ( )
  0         0  
6318 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m { } --> qr { }
  0         0  
6319 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m [ ] --> qr [ ]
  0         0  
6320 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m < > --> qr < >
  0         0  
6321 0         0 elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split_q($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m ' ' --> qr ' '
  0         0  
6322             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
6323 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m * * --> qr * *
6324             }
6325             die __FILE__, ": Search pattern not terminated\n";
6326             }
6327             }
6328              
6329 0         0 # split ''
6330 0         0 elsif ($string =~ /\G (\') /oxgc) {
6331 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
6332 0         0 while ($string !~ /\G \z/oxgc) {
6333 0         0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0         0  
6334 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
6335             elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
6336 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
6337             }
6338             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6339             }
6340              
6341 0         0 # split ""
6342 0         0 elsif ($string =~ /\G (\") /oxgc) {
6343 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
6344 0         0 while ($string !~ /\G \z/oxgc) {
6345 0         0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
6346 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
6347             elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
6348 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
6349             }
6350             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6351             }
6352              
6353 0         0 # split //
6354 0         0 elsif ($string =~ /\G (\/) /oxgc) {
6355 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
6356 0         0 while ($string !~ /\G \z/oxgc) {
6357 0         0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0         0  
6358 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
6359             elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
6360 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
6361             }
6362             die __FILE__, ": Search pattern not terminated\n";
6363             }
6364             }
6365              
6366 0         0 # qq//
6367 0 0       0 elsif ($string =~ /\G \b (qq) \b /oxgc) {
6368 0         0 my $ope = $1;
6369             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
6370             $e_string .= e_qq($ope,$1,$3,$2);
6371 0         0 }
6372 0         0 else {
6373 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
6374 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
6375 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
6376 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
6377 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
6378 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
6379             elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
6380 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
6381             }
6382             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6383             }
6384             }
6385              
6386 0         0 # qx//
6387 0 0       0 elsif ($string =~ /\G \b (qx) \b /oxgc) {
6388 0         0 my $ope = $1;
6389             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
6390             $e_string .= e_qq($ope,$1,$3,$2);
6391 0         0 }
6392 0         0 else {
6393 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6394 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
6395 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
6396 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
6397 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
6398 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
6399 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
6400             elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
6401 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
6402             }
6403             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6404             }
6405             }
6406              
6407 0         0 # q//
6408 0 0       0 elsif ($string =~ /\G \b (q) \b /oxgc) {
6409 0         0 my $ope = $1;
6410             if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
6411             $e_string .= e_q($ope,$1,$3,$2);
6412 0         0 }
6413 0         0 else {
6414 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
6415 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
6416 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
6417 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
6418 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
6419 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
6420             elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
6421 0         0 elsif ($string =~ /\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q * *
6422             }
6423             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6424             }
6425             }
6426 0         0  
6427             # ''
6428             elsif ($string =~ /\G (?
6429 12         38  
6430             # ""
6431             elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
6432 6         23  
6433             # ``
6434             elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
6435 0         0  
6436             # <<>> (a safer ARGV)
6437             elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
6438 0         0  
6439             # <<= <=> <= < operator
6440             elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
6441 0         0  
6442             #
6443             elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
6444              
6445 0         0 # --- glob
6446             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
6447             $e_string .= 'Eoldutf8::glob("' . $1 . '")';
6448             }
6449              
6450 0         0 # << (bit shift) --- not here document
6451 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) {
6452             $slash = 'm//';
6453             $e_string .= $1;
6454             }
6455              
6456 0         0 # <<~'HEREDOC'
6457 0         0 elsif ($string =~ /\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
6458 0         0 $slash = 'm//';
6459             my $here_quote = $1;
6460             my $delimiter = $2;
6461 0 0       0  
6462 0         0 # get here document
6463 0         0 if ($here_script eq '') {
6464             $here_script = CORE::substr $_, pos $_;
6465 0 0       0 $here_script =~ s/.*?\n//oxm;
6466 0         0 }
6467 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
6468 0         0 my $heredoc = $1;
6469 0         0 my $indent = $2;
6470 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
6471             push @heredoc, $heredoc . qq{\n$delimiter\n};
6472             push @heredoc_delimiter, qq{\\s*$delimiter};
6473 0         0 }
6474             else {
6475 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6476             }
6477             $e_string .= qq{<<'$delimiter'};
6478             }
6479              
6480 0         0 # <<~\HEREDOC
6481 0         0 elsif ($string =~ /\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
6482 0         0 $slash = 'm//';
6483             my $here_quote = $1;
6484             my $delimiter = $2;
6485 0 0       0  
6486 0         0 # get here document
6487 0         0 if ($here_script eq '') {
6488             $here_script = CORE::substr $_, pos $_;
6489 0 0       0 $here_script =~ s/.*?\n//oxm;
6490 0         0 }
6491 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
6492 0         0 my $heredoc = $1;
6493 0         0 my $indent = $2;
6494 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
6495             push @heredoc, $heredoc . qq{\n$delimiter\n};
6496             push @heredoc_delimiter, qq{\\s*$delimiter};
6497 0         0 }
6498             else {
6499 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6500             }
6501             $e_string .= qq{<<\\$delimiter};
6502             }
6503              
6504 0         0 # <<~"HEREDOC"
6505 0         0 elsif ($string =~ /\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
6506 0         0 $slash = 'm//';
6507             my $here_quote = $1;
6508             my $delimiter = $2;
6509 0 0       0  
6510 0         0 # get here document
6511 0         0 if ($here_script eq '') {
6512             $here_script = CORE::substr $_, pos $_;
6513 0 0       0 $here_script =~ s/.*?\n//oxm;
6514 0         0 }
6515 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
6516 0         0 my $heredoc = $1;
6517 0         0 my $indent = $2;
6518 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
6519             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
6520             push @heredoc_delimiter, qq{\\s*$delimiter};
6521 0         0 }
6522             else {
6523 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6524             }
6525             $e_string .= qq{<<"$delimiter"};
6526             }
6527              
6528 0         0 # <<~HEREDOC
6529 0         0 elsif ($string =~ /\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
6530 0         0 $slash = 'm//';
6531             my $here_quote = $1;
6532             my $delimiter = $2;
6533 0 0       0  
6534 0         0 # get here document
6535 0         0 if ($here_script eq '') {
6536             $here_script = CORE::substr $_, pos $_;
6537 0 0       0 $here_script =~ s/.*?\n//oxm;
6538 0         0 }
6539 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
6540 0         0 my $heredoc = $1;
6541 0         0 my $indent = $2;
6542 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
6543             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
6544             push @heredoc_delimiter, qq{\\s*$delimiter};
6545 0         0 }
6546             else {
6547 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6548             }
6549             $e_string .= qq{<<$delimiter};
6550             }
6551              
6552 0         0 # <<~`HEREDOC`
6553 0         0 elsif ($string =~ /\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
6554 0         0 $slash = 'm//';
6555             my $here_quote = $1;
6556             my $delimiter = $2;
6557 0 0       0  
6558 0         0 # get here document
6559 0         0 if ($here_script eq '') {
6560             $here_script = CORE::substr $_, pos $_;
6561 0 0       0 $here_script =~ s/.*?\n//oxm;
6562 0         0 }
6563 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
6564 0         0 my $heredoc = $1;
6565 0         0 my $indent = $2;
6566 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
6567             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
6568             push @heredoc_delimiter, qq{\\s*$delimiter};
6569 0         0 }
6570             else {
6571 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6572             }
6573             $e_string .= qq{<<`$delimiter`};
6574             }
6575              
6576 0         0 # <<'HEREDOC'
6577 0         0 elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
6578 0         0 $slash = 'm//';
6579             my $here_quote = $1;
6580             my $delimiter = $2;
6581 0 0       0  
6582 0         0 # get here document
6583 0         0 if ($here_script eq '') {
6584             $here_script = CORE::substr $_, pos $_;
6585 0 0       0 $here_script =~ s/.*?\n//oxm;
6586 0         0 }
6587 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6588             push @heredoc, $1 . qq{\n$delimiter\n};
6589             push @heredoc_delimiter, $delimiter;
6590 0         0 }
6591             else {
6592 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6593             }
6594             $e_string .= $here_quote;
6595             }
6596              
6597 0         0 # <<\HEREDOC
6598 0         0 elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
6599 0         0 $slash = 'm//';
6600             my $here_quote = $1;
6601             my $delimiter = $2;
6602 0 0       0  
6603 0         0 # get here document
6604 0         0 if ($here_script eq '') {
6605             $here_script = CORE::substr $_, pos $_;
6606 0 0       0 $here_script =~ s/.*?\n//oxm;
6607 0         0 }
6608 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6609             push @heredoc, $1 . qq{\n$delimiter\n};
6610             push @heredoc_delimiter, $delimiter;
6611 0         0 }
6612             else {
6613 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6614             }
6615             $e_string .= $here_quote;
6616             }
6617              
6618 0         0 # <<"HEREDOC"
6619 0         0 elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
6620 0         0 $slash = 'm//';
6621             my $here_quote = $1;
6622             my $delimiter = $2;
6623 0 0       0  
6624 0         0 # get here document
6625 0         0 if ($here_script eq '') {
6626             $here_script = CORE::substr $_, pos $_;
6627 0 0       0 $here_script =~ s/.*?\n//oxm;
6628 0         0 }
6629 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6630             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
6631             push @heredoc_delimiter, $delimiter;
6632 0         0 }
6633             else {
6634 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6635             }
6636             $e_string .= $here_quote;
6637             }
6638              
6639 0         0 # <
6640 0         0 elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
6641 0         0 $slash = 'm//';
6642             my $here_quote = $1;
6643             my $delimiter = $2;
6644 0 0       0  
6645 0         0 # get here document
6646 0         0 if ($here_script eq '') {
6647             $here_script = CORE::substr $_, pos $_;
6648 0 0       0 $here_script =~ s/.*?\n//oxm;
6649 0         0 }
6650 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6651             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
6652             push @heredoc_delimiter, $delimiter;
6653 0         0 }
6654             else {
6655 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6656             }
6657             $e_string .= $here_quote;
6658             }
6659              
6660 0         0 # <<`HEREDOC`
6661 0         0 elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
6662 0         0 $slash = 'm//';
6663             my $here_quote = $1;
6664             my $delimiter = $2;
6665 0 0       0  
6666 0         0 # get here document
6667 0         0 if ($here_script eq '') {
6668             $here_script = CORE::substr $_, pos $_;
6669 0 0       0 $here_script =~ s/.*?\n//oxm;
6670 0         0 }
6671 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6672             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
6673             push @heredoc_delimiter, $delimiter;
6674 0         0 }
6675             else {
6676 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6677             }
6678             $e_string .= $here_quote;
6679             }
6680              
6681             # any operator before div
6682             elsif ($string =~ /\G (
6683             -- | \+\+ |
6684 0         0 [\)\}\]]
  40         66  
6685              
6686             ) /oxgc) { $slash = 'div'; $e_string .= $1; }
6687              
6688             # yada-yada or triple-dot operator
6689             elsif ($string =~ /\G (
6690 40         119 \.\.\.
  0         0  
6691              
6692             ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
6693              
6694             # any operator before m//
6695             elsif ($string =~ /\G ((?>
6696              
6697             !~~ | !~ | != | ! |
6698             %= | % |
6699             &&= | && | &= | &\.= | &\. | & |
6700             -= | -> | - |
6701             :(?>\s*)= |
6702             : |
6703             <<>> |
6704             <<= | <=> | <= | < |
6705             == | => | =~ | = |
6706             >>= | >> | >= | > |
6707             \*\*= | \*\* | \*= | \* |
6708             \+= | \+ |
6709             \.\. | \.= | \. |
6710             \/\/= | \/\/ |
6711             \/= | \/ |
6712             \? |
6713             \\ |
6714             \^= | \^\.= | \^\. | \^ |
6715             \b x= |
6716             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
6717             ~~ | ~\. | ~ |
6718             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
6719             \b(?: print )\b |
6720              
6721 0         0 [,;\(\{\[]
  50         97  
6722              
6723             )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
6724 50         154  
6725             # other any character
6726             elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
6727              
6728 181         618 # system error
6729             else {
6730             die __FILE__, ": Oops, this shouldn't happen!\n";
6731             }
6732 0         0 }
6733              
6734             return $e_string;
6735             }
6736              
6737             #
6738             # character class
6739 39     2935 0 131 #
6740             sub character_class {
6741 2935 100       5433 my($char,$modifier) = @_;
6742 2935 100       5644  
6743 115         259 if ($char eq '.') {
6744             if ($modifier =~ /s/) {
6745             return '${Eoldutf8::dot_s}';
6746 23         56 }
6747             else {
6748             return '${Eoldutf8::dot}';
6749             }
6750 92         196 }
6751             else {
6752             return Eoldutf8::classic_character_class($char);
6753             }
6754             }
6755              
6756             #
6757             # escape capture ($1, $2, $3, ...)
6758             #
6759 2820     469 0 5247 sub e_capture {
6760              
6761             return join '', '${', $_[0], '}';
6762             }
6763              
6764             #
6765             # escape transliteration (tr/// or y///)
6766 469     11 0 1754 #
6767 11         58 sub e_tr {
6768 11   100     27 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
6769             my $e_tr = '';
6770 11         35 $modifier ||= '';
6771              
6772             $slash = 'div';
6773 11         16  
6774             # quote character class 1
6775             $charclass = q_tr($charclass);
6776 11         25  
6777             # quote character class 2
6778             $charclass2 = q_tr($charclass2);
6779 11 50       20  
6780 11 0       37 # /b /B modifier
6781 0         0 if ($modifier =~ tr/bB//d) {
6782             if ($variable eq '') {
6783             $e_tr = qq{tr$charclass$e$charclass2$modifier};
6784 0         0 }
6785             else {
6786             $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
6787             }
6788 0 100       0 }
6789 11         23 else {
6790             if ($variable eq '') {
6791             $e_tr = qq{Eoldutf8::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
6792 2         8 }
6793             else {
6794             $e_tr = qq{Eoldutf8::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
6795             }
6796             }
6797 9         28  
6798 11         15 # clear tr/// variable
6799             $tr_variable = '';
6800 11         15 $bind_operator = '';
6801              
6802             return $e_tr;
6803             }
6804              
6805             #
6806             # quote for escape transliteration (tr/// or y///)
6807 11     22 0 70 #
6808             sub q_tr {
6809             my($charclass) = @_;
6810 22 50       35  
    0          
    0          
    0          
    0          
    0          
6811 22         45 # quote character class
6812             if ($charclass !~ /'/oxms) {
6813             return e_q('', "'", "'", $charclass); # --> q' '
6814 22         36 }
6815             elsif ($charclass !~ /\//oxms) {
6816             return e_q('q', '/', '/', $charclass); # --> q/ /
6817 0         0 }
6818             elsif ($charclass !~ /\#/oxms) {
6819             return e_q('q', '#', '#', $charclass); # --> q# #
6820 0         0 }
6821             elsif ($charclass !~ /[\<\>]/oxms) {
6822             return e_q('q', '<', '>', $charclass); # --> q< >
6823 0         0 }
6824             elsif ($charclass !~ /[\(\)]/oxms) {
6825             return e_q('q', '(', ')', $charclass); # --> q( )
6826 0         0 }
6827             elsif ($charclass !~ /[\{\}]/oxms) {
6828             return e_q('q', '{', '}', $charclass); # --> q{ }
6829 0         0 }
6830 0 0       0 else {
6831 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6832             if ($charclass !~ /\Q$char\E/xms) {
6833             return e_q('q', $char, $char, $charclass);
6834             }
6835             }
6836 0         0 }
6837              
6838             return e_q('q', '{', '}', $charclass);
6839             }
6840              
6841             #
6842             # escape q string (q//, '')
6843 0     2150 0 0 #
6844             sub e_q {
6845 2150         5168 my($ope,$delimiter,$end_delimiter,$string) = @_;
6846              
6847 2150         2883 $slash = 'div';
6848              
6849             return join '', $ope, $delimiter, $string, $end_delimiter;
6850             }
6851              
6852             #
6853             # escape qq string (qq//, "", qx//, ``)
6854 2150     9533 0 10282 #
6855             sub e_qq {
6856 9533         19778 my($ope,$delimiter,$end_delimiter,$string) = @_;
6857              
6858 9533         12353 $slash = 'div';
6859 9533         10870  
6860             my $left_e = 0;
6861             my $right_e = 0;
6862 9533         10070  
6863             # split regexp
6864             my @char = $string =~ /\G((?>
6865             [^\x80-\xFF\\\$]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
6866             \\x\{ (?>[0-9A-Fa-f]+) \} |
6867             \\o\{ (?>[0-7]+) \} |
6868             \\N\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
6869             \\ $q_char |
6870             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6871             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6872             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6873             \$ (?>\s* [0-9]+) |
6874             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6875             \$ \$ (?![\w\{]) |
6876             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6877             $q_char
6878 9533         291235 ))/oxmsg;
6879              
6880             for (my $i=0; $i <= $#char; $i++) {
6881 9533 50 66     28230  
    50 33        
    100          
    100          
    50          
6882 226917         706704 # "\L\u" --> "\u\L"
6883             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6884             @char[$i,$i+1] = @char[$i+1,$i];
6885             }
6886              
6887 0         0 # "\U\l" --> "\l\U"
6888             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6889             @char[$i,$i+1] = @char[$i+1,$i];
6890             }
6891              
6892 0         0 # octal escape sequence
6893             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6894             $char[$i] = Eoldutf8::octchr($1);
6895             }
6896              
6897 1         4 # hexadecimal escape sequence
6898             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6899             $char[$i] = Eoldutf8::hexchr($1);
6900             }
6901              
6902 1         3 # \N{CHARNAME} --> N{CHARNAME}
6903             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
6904             $char[$i] = $1;
6905 0 100       0 }
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
6906              
6907             if (0) {
6908             }
6909              
6910             # \F
6911             #
6912             # P.69 Table 2-6. Translation escapes
6913             # in Chapter 2: Bits and Pieces
6914             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6915             # (and so on)
6916 226917         1782341  
6917 0 50       0 # \u \l \U \L \F \Q \E
6918 602         1429 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
6919             if ($right_e < $left_e) {
6920             $char[$i] = '\\' . $char[$i];
6921             }
6922             }
6923             elsif ($char[$i] eq '\u') {
6924              
6925             # "STRING @{[ LIST EXPR ]} MORE STRING"
6926              
6927             # P.257 Other Tricks You Can Do with Hard References
6928             # in Chapter 8: References
6929             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
6930              
6931             # P.353 Other Tricks You Can Do with Hard References
6932             # in Chapter 8: References
6933             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6934              
6935 0         0 # (and so on)
6936 0         0  
6937             $char[$i] = '@{[Eoldutf8::ucfirst qq<';
6938             $left_e++;
6939 0         0 }
6940 0         0 elsif ($char[$i] eq '\l') {
6941             $char[$i] = '@{[Eoldutf8::lcfirst qq<';
6942             $left_e++;
6943 0         0 }
6944 0         0 elsif ($char[$i] eq '\U') {
6945             $char[$i] = '@{[Eoldutf8::uc qq<';
6946             $left_e++;
6947 0         0 }
6948 6         11 elsif ($char[$i] eq '\L') {
6949             $char[$i] = '@{[Eoldutf8::lc qq<';
6950             $left_e++;
6951 6         12 }
6952 23         37 elsif ($char[$i] eq '\F') {
6953             $char[$i] = '@{[Eoldutf8::fc qq<';
6954             $left_e++;
6955 23         43 }
6956 0         0 elsif ($char[$i] eq '\Q') {
6957             $char[$i] = '@{[CORE::quotemeta qq<';
6958             $left_e++;
6959 0 50       0 }
6960 26         39 elsif ($char[$i] eq '\E') {
6961 26         33 if ($right_e < $left_e) {
6962             $char[$i] = '>]}';
6963             $right_e++;
6964 26         49 }
6965             else {
6966             $char[$i] = '';
6967             }
6968 0         0 }
6969 0 0       0 elsif ($char[$i] eq '\Q') {
6970 0         0 while (1) {
6971             if (++$i > $#char) {
6972 0 0       0 last;
6973 0         0 }
6974             if ($char[$i] eq '\E') {
6975             last;
6976             }
6977             }
6978             }
6979             elsif ($char[$i] eq '\E') {
6980             }
6981              
6982             # $0 --> $0
6983             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6984             }
6985             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6986             }
6987              
6988             # $$ --> $$
6989             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6990             }
6991              
6992             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6993 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6994             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6995             $char[$i] = e_capture($1);
6996 409         819 }
6997             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6998             $char[$i] = e_capture($1);
6999             }
7000              
7001 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7002             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
7003             $char[$i] = e_capture($1.'->'.$2);
7004             }
7005              
7006 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7007             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
7008             $char[$i] = e_capture($1.'->'.$2);
7009             }
7010              
7011 0         0 # $$foo
7012             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7013             $char[$i] = e_capture($1);
7014             }
7015              
7016 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
7017             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7018             $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
7019             }
7020              
7021 44         129 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
7022             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7023             $char[$i] = '@{[Eoldutf8::MATCH()]}';
7024             }
7025              
7026 45         133 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
7027             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7028             $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
7029             }
7030              
7031             # ${ foo } --> ${ foo }
7032             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
7033             }
7034              
7035 33         86 # ${ ... }
7036             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7037             $char[$i] = e_capture($1);
7038             }
7039             }
7040 0 100       0  
7041 9533         17064 # return string
7042             if ($left_e > $right_e) {
7043 3         18 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
7044             }
7045             return join '', $ope, $delimiter, @char, $end_delimiter;
7046             }
7047              
7048             #
7049             # escape qw string (qw//)
7050 9530     34 0 86878 #
7051             sub e_qw {
7052 34         164 my($ope,$delimiter,$end_delimiter,$string) = @_;
7053              
7054             $slash = 'div';
7055 34         67  
  34         371  
7056 856 50       1231 # choice again delimiter
    0          
    0          
    0          
    0          
7057 34         185 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
7058             if (not $octet{$end_delimiter}) {
7059             return join '', $ope, $delimiter, $string, $end_delimiter;
7060 34         242 }
7061             elsif (not $octet{')'}) {
7062             return join '', $ope, '(', $string, ')';
7063 0         0 }
7064             elsif (not $octet{'}'}) {
7065             return join '', $ope, '{', $string, '}';
7066 0         0 }
7067             elsif (not $octet{']'}) {
7068             return join '', $ope, '[', $string, ']';
7069 0         0 }
7070             elsif (not $octet{'>'}) {
7071             return join '', $ope, '<', $string, '>';
7072 0         0 }
7073 0 0       0 else {
7074 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7075             if (not $octet{$char}) {
7076             return join '', $ope, $char, $string, $char;
7077             }
7078             }
7079             }
7080 0         0  
7081 0         0 # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
7082 0         0 my @string = CORE::split(/\s+/, $string);
7083 0         0 for my $string (@string) {
7084 0 0       0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
7085 0         0 for my $octet (@octet) {
7086             if ($octet =~ /\A (['\\]) \z/oxms) {
7087             $octet = '\\' . $1;
7088 0         0 }
7089             }
7090 0         0 $string = join '', @octet;
  0         0  
7091             }
7092             return join '', '(', (join ', ', map { "'$_'" } @string), ')';
7093             }
7094              
7095             #
7096             # escape here document (<<"HEREDOC", <
7097 0     108 0 0 #
7098             sub e_heredoc {
7099 108         276 my($string) = @_;
7100              
7101 108         188 $slash = 'm//';
7102              
7103 108         347 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
7104 108         186  
7105             my $left_e = 0;
7106             my $right_e = 0;
7107 108         151  
7108             # split regexp
7109             my @char = $string =~ /\G((?>
7110             [^\x80-\xFF\\\$]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
7111             \\x\{ (?>[0-9A-Fa-f]+) \} |
7112             \\o\{ (?>[0-7]+) \} |
7113             \\N\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
7114             \\ $q_char |
7115             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7116             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7117             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7118             \$ (?>\s* [0-9]+) |
7119             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7120             \$ \$ (?![\w\{]) |
7121             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7122             $q_char
7123 108         12467 ))/oxmsg;
7124              
7125             for (my $i=0; $i <= $#char; $i++) {
7126 108 50 66     564  
    50 33        
    100          
    100          
    50          
7127 3383         10219 # "\L\u" --> "\u\L"
7128             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
7129             @char[$i,$i+1] = @char[$i+1,$i];
7130             }
7131              
7132 0         0 # "\U\l" --> "\l\U"
7133             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7134             @char[$i,$i+1] = @char[$i+1,$i];
7135             }
7136              
7137 0         0 # octal escape sequence
7138             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7139             $char[$i] = Eoldutf8::octchr($1);
7140             }
7141              
7142 1         4 # hexadecimal escape sequence
7143             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7144             $char[$i] = Eoldutf8::hexchr($1);
7145             }
7146              
7147 1         3 # \N{CHARNAME} --> N{CHARNAME}
7148             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
7149             $char[$i] = $1;
7150 0 100       0 }
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
7151              
7152             if (0) {
7153             }
7154 3383         27580  
7155 0 50       0 # \u \l \U \L \F \Q \E
7156 72         132 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
7157             if ($right_e < $left_e) {
7158             $char[$i] = '\\' . $char[$i];
7159             }
7160 0         0 }
7161 0         0 elsif ($char[$i] eq '\u') {
7162             $char[$i] = '@{[Eoldutf8::ucfirst qq<';
7163             $left_e++;
7164 0         0 }
7165 0         0 elsif ($char[$i] eq '\l') {
7166             $char[$i] = '@{[Eoldutf8::lcfirst qq<';
7167             $left_e++;
7168 0         0 }
7169 0         0 elsif ($char[$i] eq '\U') {
7170             $char[$i] = '@{[Eoldutf8::uc qq<';
7171             $left_e++;
7172 0         0 }
7173 6         10 elsif ($char[$i] eq '\L') {
7174             $char[$i] = '@{[Eoldutf8::lc qq<';
7175             $left_e++;
7176 6         10 }
7177 0         0 elsif ($char[$i] eq '\F') {
7178             $char[$i] = '@{[Eoldutf8::fc qq<';
7179             $left_e++;
7180 0         0 }
7181 0         0 elsif ($char[$i] eq '\Q') {
7182             $char[$i] = '@{[CORE::quotemeta qq<';
7183             $left_e++;
7184 0 50       0 }
7185 3         6 elsif ($char[$i] eq '\E') {
7186 3         4 if ($right_e < $left_e) {
7187             $char[$i] = '>]}';
7188             $right_e++;
7189 3         5 }
7190             else {
7191             $char[$i] = '';
7192             }
7193 0         0 }
7194 0 0       0 elsif ($char[$i] eq '\Q') {
7195 0         0 while (1) {
7196             if (++$i > $#char) {
7197 0 0       0 last;
7198 0         0 }
7199             if ($char[$i] eq '\E') {
7200             last;
7201             }
7202             }
7203             }
7204             elsif ($char[$i] eq '\E') {
7205             }
7206              
7207             # $0 --> $0
7208             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7209             }
7210             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7211             }
7212              
7213             # $$ --> $$
7214             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7215             }
7216              
7217             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7218 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7219             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7220             $char[$i] = e_capture($1);
7221 0         0 }
7222             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7223             $char[$i] = e_capture($1);
7224             }
7225              
7226 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7227             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
7228             $char[$i] = e_capture($1.'->'.$2);
7229             }
7230              
7231 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7232             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
7233             $char[$i] = e_capture($1.'->'.$2);
7234             }
7235              
7236 0         0 # $$foo
7237             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7238             $char[$i] = e_capture($1);
7239             }
7240              
7241 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
7242             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7243             $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
7244             }
7245              
7246 8         50 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
7247             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7248             $char[$i] = '@{[Eoldutf8::MATCH()]}';
7249             }
7250              
7251 8         63 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
7252             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7253             $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
7254             }
7255              
7256             # ${ foo } --> ${ foo }
7257             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
7258             }
7259              
7260 6         62 # ${ ... }
7261             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7262             $char[$i] = e_capture($1);
7263             }
7264             }
7265 0 100       0  
7266 108         240 # return string
7267             if ($left_e > $right_e) {
7268 3         22 return join '', @char, '>]}' x ($left_e - $right_e);
7269             }
7270             return join '', @char;
7271             }
7272              
7273             #
7274             # escape regexp (m//, qr//)
7275 105     1377 0 754 #
7276 1377   100     5273 sub e_qr {
7277             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7278 1377         4672 $modifier ||= '';
7279 1377 50       2376  
7280 1377         3411 $modifier =~ tr/p//d;
7281 0         0 if ($modifier =~ /([adlu])/oxms) {
7282 0 0       0 my $line = 0;
7283 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7284 0         0 if ($filename ne __FILE__) {
7285             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7286             last;
7287 0         0 }
7288             }
7289             die qq{Unsupported modifier "$1" used at line $line.\n};
7290 0         0 }
7291              
7292             $slash = 'div';
7293 1377 100       3231  
    100          
7294 1377         3896 # literal null string pattern
7295 8         11 if ($string eq '') {
7296 8         9 $modifier =~ tr/bB//d;
7297             $modifier =~ tr/i//d;
7298             return join '', $ope, $delimiter, $end_delimiter, $modifier;
7299             }
7300              
7301             # /b /B modifier
7302             elsif ($modifier =~ tr/bB//d) {
7303 8 50       38  
7304 25         75 # choice again delimiter
7305 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
7306 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
7307 0         0 my %octet = map {$_ => 1} @char;
7308 0         0 if (not $octet{')'}) {
7309             $delimiter = '(';
7310             $end_delimiter = ')';
7311 0         0 }
7312 0         0 elsif (not $octet{'}'}) {
7313             $delimiter = '{';
7314             $end_delimiter = '}';
7315 0         0 }
7316 0         0 elsif (not $octet{']'}) {
7317             $delimiter = '[';
7318             $end_delimiter = ']';
7319 0         0 }
7320 0         0 elsif (not $octet{'>'}) {
7321             $delimiter = '<';
7322             $end_delimiter = '>';
7323 0         0 }
7324 0 0       0 else {
7325 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7326 0         0 if (not $octet{$char}) {
7327 0         0 $delimiter = $char;
7328             $end_delimiter = $char;
7329             last;
7330             }
7331             }
7332             }
7333 0 100 100     0 }
7334 25         132  
7335             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7336             return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
7337 4         32 }
7338             else {
7339             return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
7340             }
7341 21 100       144 }
7342 1344         3055  
7343             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7344             my $metachar = qr/[\@\\|[\]{^]/oxms;
7345 1344         4631  
7346             # split regexp
7347             my @char = $string =~ /\G((?>
7348             [^\x80-\xFF\\\$\@\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
7349             \\x (?>[0-9A-Fa-f]{1,2}) |
7350             \\ (?>[0-7]{2,3}) |
7351             \\c [\x40-\x5F] |
7352             \\x\{ (?>[0-9A-Fa-f]+) \} |
7353             \\o\{ (?>[0-7]+) \} |
7354             \\[bBNpP]\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
7355             \\ $q_char |
7356             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7357             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7358             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7359             [\$\@] $qq_variable |
7360             \$ (?>\s* [0-9]+) |
7361             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7362             \$ \$ (?![\w\{]) |
7363             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7364             \[\^ |
7365             \[\: (?>[a-z]+) :\] |
7366             \[\:\^ (?>[a-z]+) :\] |
7367             \(\? |
7368             $q_char
7369             ))/oxmsg;
7370 1344 50       135440  
7371 1344         6104 # choice again delimiter
  0         0  
7372 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
7373 0         0 my %octet = map {$_ => 1} @char;
7374 0         0 if (not $octet{')'}) {
7375             $delimiter = '(';
7376             $end_delimiter = ')';
7377 0         0 }
7378 0         0 elsif (not $octet{'}'}) {
7379             $delimiter = '{';
7380             $end_delimiter = '}';
7381 0         0 }
7382 0         0 elsif (not $octet{']'}) {
7383             $delimiter = '[';
7384             $end_delimiter = ']';
7385 0         0 }
7386 0         0 elsif (not $octet{'>'}) {
7387             $delimiter = '<';
7388             $end_delimiter = '>';
7389 0         0 }
7390 0 0       0 else {
7391 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7392 0         0 if (not $octet{$char}) {
7393 0         0 $delimiter = $char;
7394             $end_delimiter = $char;
7395             last;
7396             }
7397             }
7398             }
7399 0         0 }
7400 1344         2036  
7401 1344         1681 my $left_e = 0;
7402             my $right_e = 0;
7403             for (my $i=0; $i <= $#char; $i++) {
7404 1344 50 66     3298  
    50 66        
    100          
    100          
    100          
    100          
7405 3231         16648 # "\L\u" --> "\u\L"
7406             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
7407             @char[$i,$i+1] = @char[$i+1,$i];
7408             }
7409              
7410 0         0 # "\U\l" --> "\l\U"
7411             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7412             @char[$i,$i+1] = @char[$i+1,$i];
7413             }
7414              
7415 0         0 # octal escape sequence
7416             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7417             $char[$i] = Eoldutf8::octchr($1);
7418             }
7419              
7420 1         4 # hexadecimal escape sequence
7421             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7422             $char[$i] = Eoldutf8::hexchr($1);
7423             }
7424              
7425             # \b{...} --> b\{...}
7426             # \B{...} --> B\{...}
7427             # \N{CHARNAME} --> N\{CHARNAME}
7428             # \p{PROPERTY} --> p\{PROPERTY}
7429 1         4 # \P{PROPERTY} --> P\{PROPERTY}
7430             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
7431             $char[$i] = $1 . '\\' . $2;
7432             }
7433              
7434 6         23 # \p, \P, \X --> p, P, X
7435             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7436             $char[$i] = $1;
7437 4 100 100     11 }
    100 100        
    100 100        
    100          
    100          
    100          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
7438              
7439             if (0) {
7440             }
7441 3231         11570  
7442 0 50 33     0 # join separated multiple-octet
    50 33        
    50 33        
      33        
      66        
      33        
7443 6         85 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7444             if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
7445             $char[$i] .= join '', splice @char, $i+1, 3;
7446 0         0 }
7447             elsif (($i+2 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+2]) == 2) and (CORE::eval(sprintf '"%s%s%s"', @char[$i..$i+2]) =~ /\A $q_char \z/oxms)) {
7448             $char[$i] .= join '', splice @char, $i+1, 2;
7449 0         0 }
7450             elsif (($i+1 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, $char[$i+1 ]) == 1) and (CORE::eval(sprintf '"%s%s"', @char[$i..$i+1]) =~ /\A $q_char \z/oxms)) {
7451             $char[$i] .= join '', splice @char, $i+1, 1;
7452             }
7453             }
7454              
7455 0         0 # open character class [...]
7456             elsif ($char[$i] eq '[') {
7457             my $left = $i;
7458              
7459             # [] make die "Unmatched [] in regexp ...\n"
7460 598 100       1480 # (and so on)
7461 598         1392  
7462             if ($char[$i+1] eq ']') {
7463             $i++;
7464 3         5 }
7465 598 50       910  
7466 2607         3702 while (1) {
7467             if (++$i > $#char) {
7468 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7469 2607         4161 }
7470             if ($char[$i] eq ']') {
7471             my $right = $i;
7472 598 100       717  
7473 598         2981 # [...]
  90         184  
7474             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7475             splice @char, $left, $right-$left+1, sprintf(q{@{[Eoldutf8::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7476 270         424 }
7477             else {
7478             splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
7479 508         1916 }
7480 598         1114  
7481             $i = $left;
7482             last;
7483             }
7484             }
7485             }
7486              
7487 598         1773 # open character class [^...]
7488             elsif ($char[$i] eq '[^') {
7489             my $left = $i;
7490              
7491             # [^] make die "Unmatched [] in regexp ...\n"
7492 328 100       445 # (and so on)
7493 328         692  
7494             if ($char[$i+1] eq ']') {
7495             $i++;
7496 5         10 }
7497 328 50       378  
7498 1447         1915 while (1) {
7499             if (++$i > $#char) {
7500 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7501 1447         2115 }
7502             if ($char[$i] eq ']') {
7503             my $right = $i;
7504 328 100       374  
7505 328         1491 # [^...]
  90         206  
7506             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7507             splice @char, $left, $right-$left+1, sprintf(q{@{[Eoldutf8::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7508 270         438 }
7509             else {
7510             splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7511 238         727 }
7512 328         578  
7513             $i = $left;
7514             last;
7515             }
7516             }
7517             }
7518              
7519 328         813 # rewrite character class or escape character
7520             elsif (my $char = character_class($char[$i],$modifier)) {
7521             $char[$i] = $char;
7522             }
7523              
7524 215 50       526 # /i modifier
7525 44         83 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
7526             if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
7527             $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
7528 44         86 }
7529             else {
7530             $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
7531             }
7532             }
7533              
7534 0 50       0 # \u \l \U \L \F \Q \E
7535 1         5 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
7536             if ($right_e < $left_e) {
7537             $char[$i] = '\\' . $char[$i];
7538             }
7539 0         0 }
7540 0         0 elsif ($char[$i] eq '\u') {
7541             $char[$i] = '@{[Eoldutf8::ucfirst qq<';
7542             $left_e++;
7543 0         0 }
7544 0         0 elsif ($char[$i] eq '\l') {
7545             $char[$i] = '@{[Eoldutf8::lcfirst qq<';
7546             $left_e++;
7547 0         0 }
7548 1         2 elsif ($char[$i] eq '\U') {
7549             $char[$i] = '@{[Eoldutf8::uc qq<';
7550             $left_e++;
7551 1         3 }
7552 1         2 elsif ($char[$i] eq '\L') {
7553             $char[$i] = '@{[Eoldutf8::lc qq<';
7554             $left_e++;
7555 1         3 }
7556 16         28 elsif ($char[$i] eq '\F') {
7557             $char[$i] = '@{[Eoldutf8::fc qq<';
7558             $left_e++;
7559 16         36 }
7560 20         31 elsif ($char[$i] eq '\Q') {
7561             $char[$i] = '@{[CORE::quotemeta qq<';
7562             $left_e++;
7563 20 50       42 }
7564 38         78 elsif ($char[$i] eq '\E') {
7565 38         52 if ($right_e < $left_e) {
7566             $char[$i] = '>]}';
7567             $right_e++;
7568 38         81 }
7569             else {
7570             $char[$i] = '';
7571             }
7572 0         0 }
7573 0 0       0 elsif ($char[$i] eq '\Q') {
7574 0         0 while (1) {
7575             if (++$i > $#char) {
7576 0 0       0 last;
7577 0         0 }
7578             if ($char[$i] eq '\E') {
7579             last;
7580             }
7581             }
7582             }
7583             elsif ($char[$i] eq '\E') {
7584             }
7585              
7586 0 0       0 # $0 --> $0
7587 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7588             if ($ignorecase) {
7589             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7590             }
7591 0 0       0 }
7592 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7593             if ($ignorecase) {
7594             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7595             }
7596             }
7597              
7598             # $$ --> $$
7599             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7600             }
7601              
7602             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7603 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7604 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7605 0         0 $char[$i] = e_capture($1);
7606             if ($ignorecase) {
7607             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7608             }
7609 0         0 }
7610 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7611 0         0 $char[$i] = e_capture($1);
7612             if ($ignorecase) {
7613             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7614             }
7615             }
7616              
7617 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7618 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
7619 0         0 $char[$i] = e_capture($1.'->'.$2);
7620             if ($ignorecase) {
7621             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7622             }
7623             }
7624              
7625 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7626 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
7627 0         0 $char[$i] = e_capture($1.'->'.$2);
7628             if ($ignorecase) {
7629             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7630             }
7631             }
7632              
7633 0         0 # $$foo
7634 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7635 0         0 $char[$i] = e_capture($1);
7636             if ($ignorecase) {
7637             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7638             }
7639             }
7640              
7641 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
7642 8         148 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7643             if ($ignorecase) {
7644             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::PREMATCH())]}';
7645 0         0 }
7646             else {
7647             $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
7648             }
7649             }
7650              
7651 8 50       32 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
7652 8         151 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7653             if ($ignorecase) {
7654             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::MATCH())]}';
7655 0         0 }
7656             else {
7657             $char[$i] = '@{[Eoldutf8::MATCH()]}';
7658             }
7659             }
7660              
7661 8 50       29 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
7662 6         81 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7663             if ($ignorecase) {
7664             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::POSTMATCH())]}';
7665 0         0 }
7666             else {
7667             $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
7668             }
7669             }
7670              
7671 6 0       23 # ${ foo }
7672 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
7673             if ($ignorecase) {
7674             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7675             }
7676             }
7677              
7678 0         0 # ${ ... }
7679 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7680 0         0 $char[$i] = e_capture($1);
7681             if ($ignorecase) {
7682             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7683             }
7684             }
7685              
7686 0         0 # $scalar or @array
7687 42 100       104 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7688 42         123 $char[$i] = e_string($char[$i]);
7689             if ($ignorecase) {
7690             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7691             }
7692             }
7693              
7694 9 100 66     29 # quote character before ? + * {
    50          
7695             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7696             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7697 188         1405 }
7698 0 0       0 elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7699 0         0 my $char = $char[$i-1];
7700             if ($char[$i] eq '{') {
7701             die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
7702 0         0 }
7703             else {
7704             die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
7705             }
7706 0         0 }
7707             else {
7708             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7709             }
7710             }
7711             }
7712 187         732  
7713 1344 50       2518 # make regexp string
7714 1344 0 0     2688 $modifier =~ tr/i//d;
7715 0         0 if ($left_e > $right_e) {
7716             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7717             return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
7718 0         0 }
7719             else {
7720             return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
7721 0 100 100     0 }
7722 1344         6662 }
7723             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7724             return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
7725 32         249 }
7726             else {
7727             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7728             }
7729             }
7730              
7731             #
7732             # double quote stuff
7733 1312     540 0 10406 #
7734             sub qq_stuff {
7735             my($delimiter,$end_delimiter,$stuff) = @_;
7736 540 100       848  
7737 540         1054 # scalar variable or array variable
7738             if ($stuff =~ /\A [\$\@] /oxms) {
7739             return $stuff;
7740             }
7741 300         980  
  240         568  
7742 320         788 # quote by delimiter
7743 240 50       591 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
7744 240 50       411 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7745 240 50       341 next if $char eq $delimiter;
7746 240         394 next if $char eq $end_delimiter;
7747             if (not $octet{$char}) {
7748             return join '', 'qq', $char, $stuff, $char;
7749 240         916 }
7750             }
7751             return join '', 'qq', '<', $stuff, '>';
7752             }
7753              
7754             #
7755             # escape regexp (m'', qr'', and m''b, qr''b)
7756 0     15 0 0 #
7757 15   100     78 sub e_qr_q {
7758             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7759 15         65 $modifier ||= '';
7760 15 50       27  
7761 15         42 $modifier =~ tr/p//d;
7762 0         0 if ($modifier =~ /([adlu])/oxms) {
7763 0 0       0 my $line = 0;
7764 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7765 0         0 if ($filename ne __FILE__) {
7766             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7767             last;
7768 0         0 }
7769             }
7770             die qq{Unsupported modifier "$1" used at line $line.\n};
7771 0         0 }
7772              
7773             $slash = 'div';
7774 15 100       26  
    100          
7775 15         56 # literal null string pattern
7776 8         10 if ($string eq '') {
7777 8         11 $modifier =~ tr/bB//d;
7778             $modifier =~ tr/i//d;
7779             return join '', $ope, $delimiter, $end_delimiter, $modifier;
7780             }
7781              
7782 8         38 # with /b /B modifier
7783             elsif ($modifier =~ tr/bB//d) {
7784             return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
7785             }
7786              
7787 3         10 # without /b /B modifier
7788             else {
7789             return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
7790             }
7791             }
7792              
7793             #
7794             # escape regexp (m'', qr'')
7795 4     4 0 16 #
7796             sub e_qr_qt {
7797 4 50       14 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7798              
7799             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7800 4         11  
7801             # split regexp
7802             my @char = $string =~ /\G((?>
7803             [^\x80-\xFF\\\[\$\@\/] |
7804             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
7805             \[\^ |
7806             \[\: (?>[a-z]+) \:\] |
7807             \[\:\^ (?>[a-z]+) \:\] |
7808             [\$\@\/] |
7809             \\ (?:$q_char) |
7810             (?:$q_char)
7811             ))/oxmsg;
7812 4         315  
7813 4 50 33     28 # unescape character
    50 33        
    50 66        
    50          
    50          
    50          
7814             for (my $i=0; $i <= $#char; $i++) {
7815             if (0) {
7816             }
7817 5         38  
7818 0         0 # open character class [...]
7819 0 0       0 elsif ($char[$i] eq '[') {
7820 0         0 my $left = $i;
7821             if ($char[$i+1] eq ']') {
7822 0         0 $i++;
7823 0 0       0 }
7824 0         0 while (1) {
7825             if (++$i > $#char) {
7826 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7827 0         0 }
7828             if ($char[$i] eq ']') {
7829             my $right = $i;
7830 0         0  
7831             # [...]
7832 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
7833 0         0  
7834             $i = $left;
7835             last;
7836             }
7837             }
7838             }
7839              
7840 0         0 # open character class [^...]
7841 0 0       0 elsif ($char[$i] eq '[^') {
7842 0         0 my $left = $i;
7843             if ($char[$i+1] eq ']') {
7844 0         0 $i++;
7845 0 0       0 }
7846 0         0 while (1) {
7847             if (++$i > $#char) {
7848 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7849 0         0 }
7850             if ($char[$i] eq ']') {
7851             my $right = $i;
7852 0         0  
7853             # [^...]
7854 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7855 0         0  
7856             $i = $left;
7857             last;
7858             }
7859             }
7860             }
7861              
7862 0         0 # escape $ @ / and \
7863             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7864             $char[$i] = '\\' . $char[$i];
7865             }
7866              
7867 0         0 # rewrite character class or escape character
7868             elsif (my $char = character_class($char[$i],$modifier)) {
7869             $char[$i] = $char;
7870             }
7871              
7872 0 0       0 # /i modifier
7873 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
7874             if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
7875             $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
7876 0         0 }
7877             else {
7878             $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
7879             }
7880             }
7881              
7882 0 0       0 # quote character before ? + * {
7883             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7884             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7885 0         0 }
7886             else {
7887             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7888             }
7889             }
7890 0         0 }
7891 4         10  
7892             $delimiter = '/';
7893 4         7 $end_delimiter = '/';
7894 4         7  
7895             $modifier =~ tr/i//d;
7896             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7897             }
7898              
7899             #
7900             # escape regexp (m''b, qr''b)
7901 4     3 0 51 #
7902             sub e_qr_qb {
7903             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7904 3         17  
7905             # split regexp
7906             my @char = $string =~ /\G ((?>[^\\]|\\\\|[\x00-\xFF])) /oxmsg;
7907 3         15  
7908 3 50       12 # unescape character
    50          
7909             for (my $i=0; $i <= $#char; $i++) {
7910             if (0) {
7911             }
7912 9         33  
7913             # remain \\
7914             elsif ($char[$i] eq '\\\\') {
7915             }
7916              
7917 0         0 # escape $ @ / and \
7918             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7919             $char[$i] = '\\' . $char[$i];
7920             }
7921 0         0 }
7922 3         5  
7923 3         5 $delimiter = '/';
7924             $end_delimiter = '/';
7925             return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7926             }
7927              
7928             #
7929             # escape regexp (s/here//)
7930 3     110 0 20 #
7931 110   100     383 sub e_s1 {
7932             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7933 110         452 $modifier ||= '';
7934 110 50       192  
7935 110         319 $modifier =~ tr/p//d;
7936 0         0 if ($modifier =~ /([adlu])/oxms) {
7937 0 0       0 my $line = 0;
7938 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7939 0         0 if ($filename ne __FILE__) {
7940             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7941             last;
7942 0         0 }
7943             }
7944             die qq{Unsupported modifier "$1" used at line $line.\n};
7945 0         0 }
7946              
7947             $slash = 'div';
7948 110 100       329  
    100          
7949 110         429 # literal null string pattern
7950 8         9 if ($string eq '') {
7951 8         9 $modifier =~ tr/bB//d;
7952             $modifier =~ tr/i//d;
7953             return join '', $ope, $delimiter, $end_delimiter, $modifier;
7954             }
7955              
7956             # /b /B modifier
7957             elsif ($modifier =~ tr/bB//d) {
7958 8 50       51  
7959 1         10 # choice again delimiter
7960 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
7961 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
7962 0         0 my %octet = map {$_ => 1} @char;
7963 0         0 if (not $octet{')'}) {
7964             $delimiter = '(';
7965             $end_delimiter = ')';
7966 0         0 }
7967 0         0 elsif (not $octet{'}'}) {
7968             $delimiter = '{';
7969             $end_delimiter = '}';
7970 0         0 }
7971 0         0 elsif (not $octet{']'}) {
7972             $delimiter = '[';
7973             $end_delimiter = ']';
7974 0         0 }
7975 0         0 elsif (not $octet{'>'}) {
7976             $delimiter = '<';
7977             $end_delimiter = '>';
7978 0         0 }
7979 0 0       0 else {
7980 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7981 0         0 if (not $octet{$char}) {
7982 0         0 $delimiter = $char;
7983             $end_delimiter = $char;
7984             last;
7985             }
7986             }
7987             }
7988 0         0 }
7989 1         3  
7990             my $prematch = '';
7991             return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
7992 1 100       11 }
7993 101         339  
7994             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7995             my $metachar = qr/[\@\\|[\]{^]/oxms;
7996 101         428  
7997             # split regexp
7998             my @char = $string =~ /\G((?>
7999             [^\x80-\xFF\\\$\@\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
8000             \\ (?>[1-9][0-9]*) |
8001             \\g (?>\s*) (?>[1-9][0-9]*) |
8002             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
8003             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
8004             \\x (?>[0-9A-Fa-f]{1,2}) |
8005             \\ (?>[0-7]{2,3}) |
8006             \\c [\x40-\x5F] |
8007             \\x\{ (?>[0-9A-Fa-f]+) \} |
8008             \\o\{ (?>[0-7]+) \} |
8009             \\[bBNpP]\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
8010             \\ $q_char |
8011             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
8012             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
8013             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
8014             [\$\@] $qq_variable |
8015             \$ (?>\s* [0-9]+) |
8016             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
8017             \$ \$ (?![\w\{]) |
8018             \$ (?>\s*) \$ (?>\s*) $qq_variable |
8019             \[\^ |
8020             \[\: (?>[a-z]+) :\] |
8021             \[\:\^ (?>[a-z]+) :\] |
8022             \(\? |
8023             $q_char
8024             ))/oxmsg;
8025 101 50       58864  
8026 101         1267 # choice again delimiter
  0         0  
8027 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
8028 0         0 my %octet = map {$_ => 1} @char;
8029 0         0 if (not $octet{')'}) {
8030             $delimiter = '(';
8031             $end_delimiter = ')';
8032 0         0 }
8033 0         0 elsif (not $octet{'}'}) {
8034             $delimiter = '{';
8035             $end_delimiter = '}';
8036 0         0 }
8037 0         0 elsif (not $octet{']'}) {
8038             $delimiter = '[';
8039             $end_delimiter = ']';
8040 0         0 }
8041 0         0 elsif (not $octet{'>'}) {
8042             $delimiter = '<';
8043             $end_delimiter = '>';
8044 0         0 }
8045 0 0       0 else {
8046 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
8047 0         0 if (not $octet{$char}) {
8048 0         0 $delimiter = $char;
8049             $end_delimiter = $char;
8050             last;
8051             }
8052             }
8053             }
8054             }
8055 0         0  
  101         232  
8056             # count '('
8057 425         798 my $parens = grep { $_ eq '(' } @char;
8058 101         169  
8059 101         161 my $left_e = 0;
8060             my $right_e = 0;
8061             for (my $i=0; $i <= $#char; $i++) {
8062 101 50 33     321  
    50 33        
    100          
    100          
    50          
    50          
8063 346         2050 # "\L\u" --> "\u\L"
8064             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
8065             @char[$i,$i+1] = @char[$i+1,$i];
8066             }
8067              
8068 0         0 # "\U\l" --> "\l\U"
8069             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
8070             @char[$i,$i+1] = @char[$i+1,$i];
8071             }
8072              
8073 0         0 # octal escape sequence
8074             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
8075             $char[$i] = Eoldutf8::octchr($1);
8076             }
8077              
8078 1         3 # hexadecimal escape sequence
8079             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
8080             $char[$i] = Eoldutf8::hexchr($1);
8081             }
8082              
8083             # \b{...} --> b\{...}
8084             # \B{...} --> B\{...}
8085             # \N{CHARNAME} --> N\{CHARNAME}
8086             # \p{PROPERTY} --> p\{PROPERTY}
8087 1         3 # \P{PROPERTY} --> P\{PROPERTY}
8088             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
8089             $char[$i] = $1 . '\\' . $2;
8090             }
8091              
8092 0         0 # \p, \P, \X --> p, P, X
8093             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
8094             $char[$i] = $1;
8095 0 50 66     0 }
    100 66        
    50 100        
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
8096              
8097             if (0) {
8098             }
8099 346         1351  
8100 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
8101 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
8102             if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
8103             $char[$i] .= join '', splice @char, $i+1, 3;
8104 0         0 }
8105             elsif (($i+2 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+2]) == 2) and (CORE::eval(sprintf '"%s%s%s"', @char[$i..$i+2]) =~ /\A $q_char \z/oxms)) {
8106             $char[$i] .= join '', splice @char, $i+1, 2;
8107 0         0 }
8108             elsif (($i+1 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, $char[$i+1 ]) == 1) and (CORE::eval(sprintf '"%s%s"', @char[$i..$i+1]) =~ /\A $q_char \z/oxms)) {
8109             $char[$i] .= join '', splice @char, $i+1, 1;
8110             }
8111             }
8112              
8113 0         0 # open character class [...]
8114 20 50       34 elsif ($char[$i] eq '[') {
8115 20         94 my $left = $i;
8116             if ($char[$i+1] eq ']') {
8117 0         0 $i++;
8118 20 50       32 }
8119 79         134 while (1) {
8120             if (++$i > $#char) {
8121 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
8122 79         268 }
8123             if ($char[$i] eq ']') {
8124             my $right = $i;
8125 20 50       39  
8126 20         137 # [...]
  0         0  
8127             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
8128             splice @char, $left, $right-$left+1, sprintf(q{@{[Eoldutf8::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
8129 0         0 }
8130             else {
8131             splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
8132 20         114 }
8133 20         42  
8134             $i = $left;
8135             last;
8136             }
8137             }
8138             }
8139              
8140 20         56 # open character class [^...]
8141 0 0       0 elsif ($char[$i] eq '[^') {
8142 0         0 my $left = $i;
8143             if ($char[$i+1] eq ']') {
8144 0         0 $i++;
8145 0 0       0 }
8146 0         0 while (1) {
8147             if (++$i > $#char) {
8148 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
8149 0         0 }
8150             if ($char[$i] eq ']') {
8151             my $right = $i;
8152 0 0       0  
8153 0         0 # [^...]
  0         0  
8154             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
8155             splice @char, $left, $right-$left+1, sprintf(q{@{[Eoldutf8::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
8156 0         0 }
8157             else {
8158             splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
8159 0         0 }
8160 0         0  
8161             $i = $left;
8162             last;
8163             }
8164             }
8165             }
8166              
8167 0         0 # rewrite character class or escape character
8168             elsif (my $char = character_class($char[$i],$modifier)) {
8169             $char[$i] = $char;
8170             }
8171              
8172 11 50       23 # /i modifier
8173 3         5 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
8174             if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
8175             $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
8176 3         5 }
8177             else {
8178             $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
8179             }
8180             }
8181              
8182 0 50       0 # \u \l \U \L \F \Q \E
8183 8         26 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
8184             if ($right_e < $left_e) {
8185             $char[$i] = '\\' . $char[$i];
8186             }
8187 0         0 }
8188 0         0 elsif ($char[$i] eq '\u') {
8189             $char[$i] = '@{[Eoldutf8::ucfirst qq<';
8190             $left_e++;
8191 0         0 }
8192 0         0 elsif ($char[$i] eq '\l') {
8193             $char[$i] = '@{[Eoldutf8::lcfirst qq<';
8194             $left_e++;
8195 0         0 }
8196 0         0 elsif ($char[$i] eq '\U') {
8197             $char[$i] = '@{[Eoldutf8::uc qq<';
8198             $left_e++;
8199 0         0 }
8200 0         0 elsif ($char[$i] eq '\L') {
8201             $char[$i] = '@{[Eoldutf8::lc qq<';
8202             $left_e++;
8203 0         0 }
8204 0         0 elsif ($char[$i] eq '\F') {
8205             $char[$i] = '@{[Eoldutf8::fc qq<';
8206             $left_e++;
8207 0         0 }
8208 5         10 elsif ($char[$i] eq '\Q') {
8209             $char[$i] = '@{[CORE::quotemeta qq<';
8210             $left_e++;
8211 5 50       10 }
8212 5         10 elsif ($char[$i] eq '\E') {
8213 5         9 if ($right_e < $left_e) {
8214             $char[$i] = '>]}';
8215             $right_e++;
8216 5         10 }
8217             else {
8218             $char[$i] = '';
8219             }
8220 0         0 }
8221 0 0       0 elsif ($char[$i] eq '\Q') {
8222 0         0 while (1) {
8223             if (++$i > $#char) {
8224 0 0       0 last;
8225 0         0 }
8226             if ($char[$i] eq '\E') {
8227             last;
8228             }
8229             }
8230             }
8231             elsif ($char[$i] eq '\E') {
8232             }
8233              
8234             # \0 --> \0
8235             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
8236             }
8237              
8238             # \g{N}, \g{-N}
8239              
8240             # P.108 Using Simple Patterns
8241             # in Chapter 7: In the World of Regular Expressions
8242             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
8243              
8244             # P.221 Capturing
8245             # in Chapter 5: Pattern Matching
8246             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
8247              
8248             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
8249             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
8250             }
8251              
8252             # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
8253             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
8254             }
8255              
8256             # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
8257             elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
8258             }
8259              
8260             # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
8261             elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
8262             }
8263              
8264 0 0       0 # $0 --> $0
8265 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
8266             if ($ignorecase) {
8267             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8268             }
8269 0 0       0 }
8270 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
8271             if ($ignorecase) {
8272             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8273             }
8274             }
8275              
8276             # $$ --> $$
8277             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
8278             }
8279              
8280             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
8281 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
8282 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
8283 0         0 $char[$i] = e_capture($1);
8284             if ($ignorecase) {
8285             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8286             }
8287 0         0 }
8288 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
8289 0         0 $char[$i] = e_capture($1);
8290             if ($ignorecase) {
8291             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8292             }
8293             }
8294              
8295 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
8296 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
8297 0         0 $char[$i] = e_capture($1.'->'.$2);
8298             if ($ignorecase) {
8299             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8300             }
8301             }
8302              
8303 0         0 # $$foo{ ... } --> $ $foo->{ ... }
8304 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
8305 0         0 $char[$i] = e_capture($1.'->'.$2);
8306             if ($ignorecase) {
8307             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8308             }
8309             }
8310              
8311 0         0 # $$foo
8312 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
8313 0         0 $char[$i] = e_capture($1);
8314             if ($ignorecase) {
8315             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8316             }
8317             }
8318              
8319 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
8320 4         13 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
8321             if ($ignorecase) {
8322             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::PREMATCH())]}';
8323 0         0 }
8324             else {
8325             $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
8326             }
8327             }
8328              
8329 4 50       17 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
8330 4         19 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
8331             if ($ignorecase) {
8332             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::MATCH())]}';
8333 0         0 }
8334             else {
8335             $char[$i] = '@{[Eoldutf8::MATCH()]}';
8336             }
8337             }
8338              
8339 4 50       17 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
8340 3         10 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
8341             if ($ignorecase) {
8342             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::POSTMATCH())]}';
8343 0         0 }
8344             else {
8345             $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
8346             }
8347             }
8348              
8349 3 0       11 # ${ foo }
8350 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
8351             if ($ignorecase) {
8352             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8353             }
8354             }
8355              
8356 0         0 # ${ ... }
8357 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
8358 0         0 $char[$i] = e_capture($1);
8359             if ($ignorecase) {
8360             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8361             }
8362             }
8363              
8364 0         0 # $scalar or @array
8365 9 50       38 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
8366 9         38 $char[$i] = e_string($char[$i]);
8367             if ($ignorecase) {
8368             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8369             }
8370             }
8371              
8372 0 50       0 # quote character before ? + * {
8373             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8374             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
8375 23         129 }
8376             else {
8377             $char[$i-1] = '(?:' . $char[$i-1] . ')';
8378             }
8379             }
8380             }
8381 23         231  
8382 101         261 # make regexp string
8383 101 50       190 my $prematch = '';
8384 101         293 $modifier =~ tr/i//d;
8385             if ($left_e > $right_e) {
8386 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
8387             }
8388             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
8389             }
8390              
8391             #
8392             # escape regexp (s'here'' or s'here''b)
8393 101     22 0 1394 #
8394 22   100     52 sub e_s1_q {
8395             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8396 22         69 $modifier ||= '';
8397 22 50       43  
8398 22         48 $modifier =~ tr/p//d;
8399 0         0 if ($modifier =~ /([adlu])/oxms) {
8400 0 0       0 my $line = 0;
8401 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8402 0         0 if ($filename ne __FILE__) {
8403             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8404             last;
8405 0         0 }
8406             }
8407             die qq{Unsupported modifier "$1" used at line $line.\n};
8408 0         0 }
8409              
8410             $slash = 'div';
8411 22 100       28  
    100          
8412 22         85 # literal null string pattern
8413 8         9 if ($string eq '') {
8414 8         10 $modifier =~ tr/bB//d;
8415             $modifier =~ tr/i//d;
8416             return join '', $ope, $delimiter, $end_delimiter, $modifier;
8417             }
8418              
8419 8         45 # with /b /B modifier
8420             elsif ($modifier =~ tr/bB//d) {
8421             return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
8422             }
8423              
8424 1         7 # without /b /B modifier
8425             else {
8426             return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
8427             }
8428             }
8429              
8430             #
8431             # escape regexp (s'here'')
8432 13     13 0 31 #
8433             sub e_s1_qt {
8434 13 50       29 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8435              
8436             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
8437 13         27  
8438             # split regexp
8439             my @char = $string =~ /\G((?>
8440             [^\x80-\xFF\\\[\$\@\/] |
8441             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
8442             \[\^ |
8443             \[\: (?>[a-z]+) \:\] |
8444             \[\:\^ (?>[a-z]+) \:\] |
8445             [\$\@\/] |
8446             \\ (?:$q_char) |
8447             (?:$q_char)
8448             ))/oxmsg;
8449 13         317  
8450 13 50 33     47 # unescape character
    50 33        
    50 66        
    100          
    50          
    50          
8451             for (my $i=0; $i <= $#char; $i++) {
8452             if (0) {
8453             }
8454 25         113  
8455 0         0 # open character class [...]
8456 0 0       0 elsif ($char[$i] eq '[') {
8457 0         0 my $left = $i;
8458             if ($char[$i+1] eq ']') {
8459 0         0 $i++;
8460 0 0       0 }
8461 0         0 while (1) {
8462             if (++$i > $#char) {
8463 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
8464 0         0 }
8465             if ($char[$i] eq ']') {
8466             my $right = $i;
8467 0         0  
8468             # [...]
8469 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
8470 0         0  
8471             $i = $left;
8472             last;
8473             }
8474             }
8475             }
8476              
8477 0         0 # open character class [^...]
8478 0 0       0 elsif ($char[$i] eq '[^') {
8479 0         0 my $left = $i;
8480             if ($char[$i+1] eq ']') {
8481 0         0 $i++;
8482 0 0       0 }
8483 0         0 while (1) {
8484             if (++$i > $#char) {
8485 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
8486 0         0 }
8487             if ($char[$i] eq ']') {
8488             my $right = $i;
8489 0         0  
8490             # [^...]
8491 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
8492 0         0  
8493             $i = $left;
8494             last;
8495             }
8496             }
8497             }
8498              
8499 0         0 # escape $ @ / and \
8500             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
8501             $char[$i] = '\\' . $char[$i];
8502             }
8503              
8504 0         0 # rewrite character class or escape character
8505             elsif (my $char = character_class($char[$i],$modifier)) {
8506             $char[$i] = $char;
8507             }
8508              
8509 6 0       13 # /i modifier
8510 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
8511             if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
8512             $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
8513 0         0 }
8514             else {
8515             $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
8516             }
8517             }
8518              
8519 0 0       0 # quote character before ? + * {
8520             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8521             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
8522 0         0 }
8523             else {
8524             $char[$i-1] = '(?:' . $char[$i-1] . ')';
8525             }
8526             }
8527 0         0 }
8528 13         24  
8529 13         15 $modifier =~ tr/i//d;
8530 13         20 $delimiter = '/';
8531 13         19 $end_delimiter = '/';
8532             my $prematch = '';
8533             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
8534             }
8535              
8536             #
8537             # escape regexp (s'here''b)
8538 13     1 0 93 #
8539             sub e_s1_qb {
8540             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8541 1         4  
8542             # split regexp
8543             my @char = $string =~ /\G (?>[^\\]|\\\\|[\x00-\xFF]) /oxmsg;
8544 1         6  
8545 1 50       5 # unescape character
    50          
8546             for (my $i=0; $i <= $#char; $i++) {
8547             if (0) {
8548             }
8549 3         13  
8550             # remain \\
8551             elsif ($char[$i] eq '\\\\') {
8552             }
8553              
8554 0         0 # escape $ @ / and \
8555             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
8556             $char[$i] = '\\' . $char[$i];
8557             }
8558 0         0 }
8559 1         2  
8560 1         2 $delimiter = '/';
8561 1         2 $end_delimiter = '/';
8562             my $prematch = '';
8563             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
8564             }
8565              
8566             #
8567             # escape regexp (s''here')
8568 1     17 0 8 #
8569             sub e_s2_q {
8570 17         40 my($ope,$delimiter,$end_delimiter,$string) = @_;
8571              
8572 17         25 $slash = 'div';
8573 17         176  
8574 17 100       56 my @char = $string =~ / \G (?>[^\x80-\xFF\\]|\\\\|$q_char) /oxmsg;
    100          
8575             for (my $i=0; $i <= $#char; $i++) {
8576             if (0) {
8577             }
8578 9         31  
8579             # not escape \\
8580             elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
8581             }
8582              
8583 0         0 # escape $ @ / and \
8584             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
8585             $char[$i] = '\\' . $char[$i];
8586             }
8587 5         14 }
8588              
8589             return join '', $ope, $delimiter, @char, $end_delimiter;
8590             }
8591              
8592             #
8593             # escape regexp (s/here/and here/modifier)
8594 17     132 0 52 #
8595 132   100     1212 sub e_sub {
8596             my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
8597 132         602 $modifier ||= '';
8598 132 50       279  
8599 132         2526 $modifier =~ tr/p//d;
8600 0         0 if ($modifier =~ /([adlu])/oxms) {
8601 0 0       0 my $line = 0;
8602 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8603 0         0 if ($filename ne __FILE__) {
8604             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8605             last;
8606 0         0 }
8607             }
8608             die qq{Unsupported modifier "$1" used at line $line.\n};
8609 0 100       0 }
8610 132         370  
8611 37         50 if ($variable eq '') {
8612             $variable = '$_';
8613             $bind_operator = ' =~ ';
8614 37         42 }
8615              
8616             $slash = 'div';
8617              
8618             # P.128 Start of match (or end of previous match): \G
8619             # P.130 Advanced Use of \G with Perl
8620             # in Chapter 3: Overview of Regular Expression Features and Flavors
8621             # P.312 Iterative Matching: Scalar Context, with /g
8622             # in Chapter 7: Perl
8623             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
8624              
8625             # P.181 Where You Left Off: The \G Assertion
8626             # in Chapter 5: Pattern Matching
8627             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
8628              
8629             # P.220 Where You Left Off: The \G Assertion
8630             # in Chapter 5: Pattern Matching
8631 132         240 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
8632 132         252  
8633             my $e_modifier = $modifier =~ tr/e//d;
8634 132         227 my $r_modifier = $modifier =~ tr/r//d;
8635 132 50       222  
8636 132         377 my $my = '';
8637 0         0 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
8638 0         0 $my = $variable;
8639             $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
8640             $variable =~ s/ = .+ \z//oxms;
8641 0         0 }
8642 132         375  
8643             (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
8644             $variable_basename =~ s/ \s+ \z//oxms;
8645 132         264  
8646 132 100       226 # quote replacement string
8647 132         351 my $e_replacement = '';
8648 17         37 if ($e_modifier >= 1) {
8649             $e_replacement = e_qq('', '', '', $replacement);
8650             $e_modifier--;
8651 17 100       27 }
8652 115         295 else {
8653             if ($delimiter2 eq "'") {
8654             $e_replacement = e_s2_q('qq', '/', '/', $replacement);
8655 17         36 }
8656             else {
8657             $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
8658             }
8659 98         267 }
8660              
8661             my $sub = '';
8662 132 100       254  
8663 132 100       388 # with /r
8664             if ($r_modifier) {
8665             if (0) {
8666             }
8667 8         34  
8668 0 50       0 # s///gr without multibyte anchoring
8669             elsif ($modifier =~ /g/oxms) {
8670             $sub = sprintf(
8671             # 1 2 3 4 5
8672             q,
8673              
8674             $variable, # 1
8675             ($delimiter1 eq "'") ? # 2
8676             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8677             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8678             $s_matched, # 3
8679             $e_replacement, # 4
8680             '$Eoldutf8::re_r=CORE::eval $Eoldutf8::re_r; ' x $e_modifier, # 5
8681             );
8682             }
8683              
8684             # s///r
8685 4         32 else {
8686              
8687 4 50       10 my $prematch = q{$`};
8688              
8689             $sub = sprintf(
8690             # 1 2 3 4 5 6 7
8691             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Eoldutf8::re_r=%s; %s"%s$Eoldutf8::re_r$'" } : %s>,
8692              
8693             $variable, # 1
8694             ($delimiter1 eq "'") ? # 2
8695             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8696             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8697             $s_matched, # 3
8698             $e_replacement, # 4
8699             '$Eoldutf8::re_r=CORE::eval $Eoldutf8::re_r; ' x $e_modifier, # 5
8700             $prematch, # 6
8701             $variable, # 7
8702             );
8703             }
8704 4 50       21  
8705 8         31 # $var !~ s///r doesn't make sense
8706             if ($bind_operator =~ / !~ /oxms) {
8707             $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
8708             }
8709             }
8710              
8711 0 100       0 # without /r
8712             else {
8713             if (0) {
8714             }
8715 124         334  
8716 0 100       0 # s///g without multibyte anchoring
    100          
8717             elsif ($modifier =~ /g/oxms) {
8718             $sub = sprintf(
8719             # 1 2 3 4 5 6 7 8
8720             q,
8721              
8722             $variable, # 1
8723             ($delimiter1 eq "'") ? # 2
8724             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8725             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8726             $s_matched, # 3
8727             $e_replacement, # 4
8728             '$Eoldutf8::re_r=CORE::eval $Eoldutf8::re_r; ' x $e_modifier, # 5
8729             $variable, # 6
8730             $variable, # 7
8731             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
8732             );
8733             }
8734              
8735             # s///
8736 29         121 else {
8737              
8738 95 100       196 my $prematch = q{$`};
    100          
8739              
8740             $sub = sprintf(
8741              
8742             ($bind_operator =~ / =~ /oxms) ?
8743              
8744             # 1 2 3 4 5 6 7 8
8745             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Eoldutf8::re_r=%s; %s%s="%s$Eoldutf8::re_r$'"; 1 } : undef> :
8746              
8747             # 1 2 3 4 5 6 7 8
8748             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Eoldutf8::re_r=%s; %s%s="%s$Eoldutf8::re_r$'"; undef }>,
8749              
8750             $variable, # 1
8751             $bind_operator, # 2
8752             ($delimiter1 eq "'") ? # 3
8753             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8754             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8755             $s_matched, # 4
8756             $e_replacement, # 5
8757             '$Eoldutf8::re_r=CORE::eval $Eoldutf8::re_r; ' x $e_modifier, # 6
8758             $variable, # 7
8759             $prematch, # 8
8760             );
8761             }
8762             }
8763 95 50       589  
8764 132         410 # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
8765             if ($my ne '') {
8766             $sub = "($my, $sub)[1]";
8767             }
8768 0         0  
8769 132         223 # clear s/// variable
8770             $sub_variable = '';
8771 132         194 $bind_operator = '';
8772              
8773             return $sub;
8774             }
8775              
8776             #
8777             # escape regexp of split qr//
8778 132     101 0 1476 #
8779 101   100     443 sub e_split {
8780             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8781 101         433 $modifier ||= '';
8782 101 50       164  
8783 101         374 $modifier =~ tr/p//d;
8784 0         0 if ($modifier =~ /([adlu])/oxms) {
8785 0 0       0 my $line = 0;
8786 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8787 0         0 if ($filename ne __FILE__) {
8788             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8789             last;
8790 0         0 }
8791             }
8792             die qq{Unsupported modifier "$1" used at line $line.\n};
8793 0         0 }
8794              
8795             $slash = 'div';
8796 101 50       166  
8797 101         226 # /b /B modifier
8798             if ($modifier =~ tr/bB//d) {
8799             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
8800 0 50       0 }
8801 101         250  
8802             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
8803             my $metachar = qr/[\@\\|[\]{^]/oxms;
8804 101         373  
8805             # split regexp
8806             my @char = $string =~ /\G((?>
8807             [^\x80-\xFF\\\$\@\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
8808             \\x (?>[0-9A-Fa-f]{1,2}) |
8809             \\ (?>[0-7]{2,3}) |
8810             \\c [\x40-\x5F] |
8811             \\x\{ (?>[0-9A-Fa-f]+) \} |
8812             \\o\{ (?>[0-7]+) \} |
8813             \\[bBNpP]\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
8814             \\ $q_char |
8815             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
8816             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
8817             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
8818             [\$\@] $qq_variable |
8819             \$ (?>\s* [0-9]+) |
8820             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
8821             \$ \$ (?![\w\{]) |
8822             \$ (?>\s*) \$ (?>\s*) $qq_variable |
8823             \[\^ |
8824             \[\: (?>[a-z]+) :\] |
8825             \[\:\^ (?>[a-z]+) :\] |
8826             \(\? |
8827             $q_char
8828 101         17503 ))/oxmsg;
8829 101         506  
8830 101         146 my $left_e = 0;
8831             my $right_e = 0;
8832             for (my $i=0; $i <= $#char; $i++) {
8833 101 50 33     279  
    50 33        
    100          
    100          
    50          
    50          
8834 284         1510 # "\L\u" --> "\u\L"
8835             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
8836             @char[$i,$i+1] = @char[$i+1,$i];
8837             }
8838              
8839 0         0 # "\U\l" --> "\l\U"
8840             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
8841             @char[$i,$i+1] = @char[$i+1,$i];
8842             }
8843              
8844 0         0 # octal escape sequence
8845             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
8846             $char[$i] = Eoldutf8::octchr($1);
8847             }
8848              
8849 1         4 # hexadecimal escape sequence
8850             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
8851             $char[$i] = Eoldutf8::hexchr($1);
8852             }
8853              
8854             # \b{...} --> b\{...}
8855             # \B{...} --> B\{...}
8856             # \N{CHARNAME} --> N\{CHARNAME}
8857             # \p{PROPERTY} --> p\{PROPERTY}
8858 1         3 # \P{PROPERTY} --> P\{PROPERTY}
8859             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
8860             $char[$i] = $1 . '\\' . $2;
8861             }
8862              
8863 0         0 # \p, \P, \X --> p, P, X
8864             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
8865             $char[$i] = $1;
8866 0 50 100     0 }
    100 33        
    100 33        
    100 100        
    100          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
8867              
8868             if (0) {
8869             }
8870 284         1042  
8871 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
8872 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
8873             if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
8874             $char[$i] .= join '', splice @char, $i+1, 3;
8875 0         0 }
8876             elsif (($i+2 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+2]) == 2) and (CORE::eval(sprintf '"%s%s%s"', @char[$i..$i+2]) =~ /\A $q_char \z/oxms)) {
8877             $char[$i] .= join '', splice @char, $i+1, 2;
8878 0         0 }
8879             elsif (($i+1 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, $char[$i+1 ]) == 1) and (CORE::eval(sprintf '"%s%s"', @char[$i..$i+1]) =~ /\A $q_char \z/oxms)) {
8880             $char[$i] .= join '', splice @char, $i+1, 1;
8881             }
8882             }
8883              
8884 0         0 # open character class [...]
8885 3 50       6 elsif ($char[$i] eq '[') {
8886 3         9 my $left = $i;
8887             if ($char[$i+1] eq ']') {
8888 0         0 $i++;
8889 3 50       5 }
8890 7         16 while (1) {
8891             if (++$i > $#char) {
8892 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
8893 7         16 }
8894             if ($char[$i] eq ']') {
8895             my $right = $i;
8896 3 50       4  
8897 3         21 # [...]
  0         0  
8898             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
8899             splice @char, $left, $right-$left+1, sprintf(q{@{[Eoldutf8::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
8900 0         0 }
8901             else {
8902             splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
8903 3         19 }
8904 3         6  
8905             $i = $left;
8906             last;
8907             }
8908             }
8909             }
8910              
8911 3         10 # open character class [^...]
8912 1 50       2 elsif ($char[$i] eq '[^') {
8913 1         4 my $left = $i;
8914             if ($char[$i+1] eq ']') {
8915 0         0 $i++;
8916 1 50       2 }
8917 2         4 while (1) {
8918             if (++$i > $#char) {
8919 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
8920 2         8 }
8921             if ($char[$i] eq ']') {
8922             my $right = $i;
8923 1 50       3  
8924 1         7 # [^...]
  0         0  
8925             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
8926             splice @char, $left, $right-$left+1, sprintf(q{@{[Eoldutf8::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
8927 0         0 }
8928             else {
8929             splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
8930 1         8 }
8931 1         3  
8932             $i = $left;
8933             last;
8934             }
8935             }
8936             }
8937              
8938 1         2 # rewrite character class or escape character
8939             elsif (my $char = character_class($char[$i],$modifier)) {
8940             $char[$i] = $char;
8941             }
8942              
8943             # P.794 29.2.161. split
8944             # in Chapter 29: Functions
8945             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
8946              
8947             # P.951 split
8948             # in Chapter 27: Functions
8949             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
8950              
8951             # said "The //m modifier is assumed when you split on the pattern /^/",
8952             # but perl5.008 is not so. Therefore, this software adds //m.
8953             # (and so on)
8954              
8955 5         17 # split(m/^/) --> split(m/^/m)
8956             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
8957             $modifier .= 'm';
8958             }
8959              
8960 11 0       35 # /i modifier
8961 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
8962             if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
8963             $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
8964 0         0 }
8965             else {
8966             $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
8967             }
8968             }
8969              
8970 0 50       0 # \u \l \U \L \F \Q \E
8971 2         8 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
8972             if ($right_e < $left_e) {
8973             $char[$i] = '\\' . $char[$i];
8974             }
8975 0         0 }
8976 0         0 elsif ($char[$i] eq '\u') {
8977             $char[$i] = '@{[Eoldutf8::ucfirst qq<';
8978             $left_e++;
8979 0         0 }
8980 0         0 elsif ($char[$i] eq '\l') {
8981             $char[$i] = '@{[Eoldutf8::lcfirst qq<';
8982             $left_e++;
8983 0         0 }
8984 0         0 elsif ($char[$i] eq '\U') {
8985             $char[$i] = '@{[Eoldutf8::uc qq<';
8986             $left_e++;
8987 0         0 }
8988 0         0 elsif ($char[$i] eq '\L') {
8989             $char[$i] = '@{[Eoldutf8::lc qq<';
8990             $left_e++;
8991 0         0 }
8992 0         0 elsif ($char[$i] eq '\F') {
8993             $char[$i] = '@{[Eoldutf8::fc qq<';
8994             $left_e++;
8995 0         0 }
8996 0         0 elsif ($char[$i] eq '\Q') {
8997             $char[$i] = '@{[CORE::quotemeta qq<';
8998             $left_e++;
8999 0 0       0 }
9000 0         0 elsif ($char[$i] eq '\E') {
9001 0         0 if ($right_e < $left_e) {
9002             $char[$i] = '>]}';
9003             $right_e++;
9004 0         0 }
9005             else {
9006             $char[$i] = '';
9007             }
9008 0         0 }
9009 0 0       0 elsif ($char[$i] eq '\Q') {
9010 0         0 while (1) {
9011             if (++$i > $#char) {
9012 0 0       0 last;
9013 0         0 }
9014             if ($char[$i] eq '\E') {
9015             last;
9016             }
9017             }
9018             }
9019             elsif ($char[$i] eq '\E') {
9020             }
9021              
9022 0 0       0 # $0 --> $0
9023 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
9024             if ($ignorecase) {
9025             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9026             }
9027 0 0       0 }
9028 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
9029             if ($ignorecase) {
9030             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9031             }
9032             }
9033              
9034             # $$ --> $$
9035             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
9036             }
9037              
9038             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
9039 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
9040 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
9041 0         0 $char[$i] = e_capture($1);
9042             if ($ignorecase) {
9043             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9044             }
9045 0         0 }
9046 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
9047 0         0 $char[$i] = e_capture($1);
9048             if ($ignorecase) {
9049             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9050             }
9051             }
9052              
9053 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
9054 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
9055 0         0 $char[$i] = e_capture($1.'->'.$2);
9056             if ($ignorecase) {
9057             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9058             }
9059             }
9060              
9061 0         0 # $$foo{ ... } --> $ $foo->{ ... }
9062 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
9063 0         0 $char[$i] = e_capture($1.'->'.$2);
9064             if ($ignorecase) {
9065             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9066             }
9067             }
9068              
9069 0         0 # $$foo
9070 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
9071 0         0 $char[$i] = e_capture($1);
9072             if ($ignorecase) {
9073             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9074             }
9075             }
9076              
9077 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
9078 12         40 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
9079             if ($ignorecase) {
9080             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::PREMATCH())]}';
9081 0         0 }
9082             else {
9083             $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
9084             }
9085             }
9086              
9087 12 50       59 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
9088 12         34 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
9089             if ($ignorecase) {
9090             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::MATCH())]}';
9091 0         0 }
9092             else {
9093             $char[$i] = '@{[Eoldutf8::MATCH()]}';
9094             }
9095             }
9096              
9097 12 50       120 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
9098 9         32 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
9099             if ($ignorecase) {
9100             $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::POSTMATCH())]}';
9101 0         0 }
9102             else {
9103             $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
9104             }
9105             }
9106              
9107 9 0       44 # ${ foo }
9108 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
9109             if ($ignorecase) {
9110             $char[$i] = '@{[Eoldutf8::ignorecase(' . $1 . ')]}';
9111             }
9112             }
9113              
9114 0         0 # ${ ... }
9115 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
9116 0         0 $char[$i] = e_capture($1);
9117             if ($ignorecase) {
9118             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9119             }
9120             }
9121              
9122 0         0 # $scalar or @array
9123 3 50       11 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
9124 3         15 $char[$i] = e_string($char[$i]);
9125             if ($ignorecase) {
9126             $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
9127             }
9128             }
9129              
9130 0 100       0 # quote character before ? + * {
9131             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
9132             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
9133 7         38 }
9134             else {
9135             $char[$i-1] = '(?:' . $char[$i-1] . ')';
9136             }
9137             }
9138             }
9139 4         25  
9140 101 50       211 # make regexp string
9141 101         233 $modifier =~ tr/i//d;
9142             if ($left_e > $right_e) {
9143 0         0 return join '', 'Eoldutf8::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
9144             }
9145             return join '', 'Eoldutf8::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
9146             }
9147              
9148             #
9149             # escape regexp of split qr''
9150 101     0 0 1138 #
9151 0   0       sub e_split_q {
9152             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
9153 0           $modifier ||= '';
9154 0 0          
9155 0           $modifier =~ tr/p//d;
9156 0           if ($modifier =~ /([adlu])/oxms) {
9157 0 0         my $line = 0;
9158 0           for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
9159 0           if ($filename ne __FILE__) {
9160             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
9161             last;
9162 0           }
9163             }
9164             die qq{Unsupported modifier "$1" used at line $line.\n};
9165 0           }
9166              
9167             $slash = 'div';
9168 0 0          
9169 0           # /b /B modifier
9170             if ($modifier =~ tr/bB//d) {
9171             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
9172 0 0         }
9173              
9174             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
9175 0            
9176             # split regexp
9177             my @char = $string =~ /\G((?>
9178             [^\x80-\xFF\\\[] |
9179             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
9180             \[\^ |
9181             \[\: (?>[a-z]+) \:\] |
9182             \[\:\^ (?>[a-z]+) \:\] |
9183             \\ (?:$q_char) |
9184             (?:$q_char)
9185             ))/oxmsg;
9186 0            
9187 0 0 0       # unescape character
    0 0        
    0 0        
    0 0        
    0          
    0          
9188             for (my $i=0; $i <= $#char; $i++) {
9189             if (0) {
9190             }
9191 0            
9192 0           # open character class [...]
9193 0 0         elsif ($char[$i] eq '[') {
9194 0           my $left = $i;
9195             if ($char[$i+1] eq ']') {
9196 0           $i++;
9197 0 0         }
9198 0           while (1) {
9199             if (++$i > $#char) {
9200 0 0         die __FILE__, ": Unmatched [] in regexp\n";
9201 0           }
9202             if ($char[$i] eq ']') {
9203             my $right = $i;
9204 0            
9205             # [...]
9206 0           splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
9207 0            
9208             $i = $left;
9209             last;
9210             }
9211             }
9212             }
9213              
9214 0           # open character class [^...]
9215 0 0         elsif ($char[$i] eq '[^') {
9216 0           my $left = $i;
9217             if ($char[$i+1] eq ']') {
9218 0           $i++;
9219 0 0         }
9220 0           while (1) {
9221             if (++$i > $#char) {
9222 0 0         die __FILE__, ": Unmatched [] in regexp\n";
9223 0           }
9224             if ($char[$i] eq ']') {
9225             my $right = $i;
9226 0            
9227             # [^...]
9228 0           splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
9229 0            
9230             $i = $left;
9231             last;
9232             }
9233             }
9234             }
9235              
9236 0           # rewrite character class or escape character
9237             elsif (my $char = character_class($char[$i],$modifier)) {
9238             $char[$i] = $char;
9239             }
9240              
9241 0           # split(m/^/) --> split(m/^/m)
9242             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
9243             $modifier .= 'm';
9244             }
9245              
9246 0 0         # /i modifier
9247 0           elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
9248             if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
9249             $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
9250 0           }
9251             else {
9252             $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
9253             }
9254             }
9255              
9256 0 0         # quote character before ? + * {
9257             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
9258             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
9259 0           }
9260             else {
9261             $char[$i-1] = '(?:' . $char[$i-1] . ')';
9262             }
9263             }
9264 0           }
9265 0            
9266             $modifier =~ tr/i//d;
9267             return join '', 'Eoldutf8::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
9268             }
9269              
9270             #
9271             # instead of Carp::carp
9272 0     0 0   #
9273 0           sub carp {
9274             my($package,$filename,$line) = caller(1);
9275             print STDERR "@_ at $filename line $line.\n";
9276             }
9277              
9278             #
9279             # instead of Carp::croak
9280 0     0 0   #
9281 0           sub croak {
9282 0           my($package,$filename,$line) = caller(1);
9283             print STDERR "@_ at $filename line $line.\n";
9284             die "\n";
9285             }
9286              
9287             #
9288             # instead of Carp::cluck
9289 0     0 0   #
9290 0           sub cluck {
9291 0           my $i = 0;
9292 0           my @cluck = ();
9293 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
9294             push @cluck, "[$i] $filename($line) $package::$subroutine\n";
9295 0           $i++;
9296 0           }
9297 0           print STDERR CORE::reverse @cluck;
9298             print STDERR "\n";
9299             print STDERR @_;
9300             }
9301              
9302             #
9303             # instead of Carp::confess
9304 0     0 0   #
9305 0           sub confess {
9306 0           my $i = 0;
9307 0           my @confess = ();
9308 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
9309             push @confess, "[$i] $filename($line) $package::$subroutine\n";
9310 0           $i++;
9311 0           }
9312 0           print STDERR CORE::reverse @confess;
9313 0           print STDERR "\n";
9314             print STDERR @_;
9315             die "\n";
9316             }
9317              
9318             1;
9319              
9320             __END__