File Coverage

blib/lib/Eoldutf8.pm
Criterion Covered Total %
statement 1005 3114 32.2
branch 1069 2704 39.5
condition 123 373 32.9
subroutine 70 125 56.0
pod 7 74 9.4
total 2274 6390 35.5


line stmt bran cond sub pod time code
1             package Eoldutf8;
2             ######################################################################
3             #
4             # Eoldutf8 - Run-time routines for OldUTF8.pm
5             #
6             # http://search.cpan.org/dist/Char-OldUTF8/
7             #
8             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 INABA Hitoshi
9             ######################################################################
10              
11 302     302   4248 use 5.00503; # Galapagos Consensus 1998 for primetools
  302         685  
12             # use 5.008001; # Lancaster Consensus 2013 for toolchains
13              
14             # 12.3. Delaying use Until Runtime
15             # in Chapter 12. Packages, Libraries, and Modules
16             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
17             # (and so on)
18              
19             # Version numbers should be boring
20             # http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/
21             # For the impatient, the disinterested or those who just want to follow
22             # a recipe, my advice for all modules is this:
23             # our $VERSION = "0.001"; # or "0.001_001" for a dev release
24             # $VERSION = eval $VERSION;
25              
26 302     302   15806 BEGIN { CORE::eval q{ use vars qw($VERSION) } }
  302     302   1197  
  302         356  
  302         33854  
27             $VERSION = '1.08';
28             $VERSION = CORE::eval $VERSION;
29              
30             BEGIN {
31 302 50   302   1401 if ($^X =~ / jperl /oxmsi) {
32 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
33             }
34 302         326 if (CORE::ord('A') == 193) {
35             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
36             }
37 302         30130 if (CORE::ord('A') != 0x41) {
38             die __FILE__, ": is not US-ASCII script (must be US-ASCII script).\n";
39             }
40             }
41              
42             BEGIN {
43              
44             # instead of utf8.pm
45 302     302   15507 CORE::eval q{
  302     302   1217  
  302     110   380  
  302         26316  
  87         6471  
  74         5670  
  74         5340  
  67         4940  
46             no warnings qw(redefine);
47             *utf8::upgrade = sub { CORE::length $_[0] };
48             *utf8::downgrade = sub { 1 };
49             *utf8::encode = sub { };
50             *utf8::decode = sub { 1 };
51             *utf8::is_utf8 = sub { };
52             *utf8::valid = sub { 1 };
53             };
54 302 50       123027 if ($@) {
55 0         0 *utf8::upgrade = sub { CORE::length $_[0] };
  0         0  
56 0         0 *utf8::downgrade = sub { 1 };
  0         0  
57 0         0 *utf8::encode = sub { };
58 0         0 *utf8::decode = sub { 1 };
  0         0  
59 0         0 *utf8::is_utf8 = sub { };
60 0         0 *utf8::valid = sub { 1 };
  0         0  
61             }
62             }
63              
64             # instead of Symbol.pm
65 0         0 BEGIN {
66 302     302   583 my $genpkg = "Symbol::";
67 302         10186 my $genseq = 0;
68              
69             sub gensym () {
70 0     0 0 0 my $name = "GEN" . $genseq++;
71              
72             # here, no strict qw(refs); if strict.pm exists
73              
74 0         0 my $ref = \*{$genpkg . $name};
  0         0  
75 0         0 delete $$genpkg{$name};
76 0         0 return $ref;
77             }
78              
79             sub qualify ($;$) {
80 0     0 0 0 my ($name) = @_;
81 0 0 0     0 if (!ref($name) && (Eoldutf8::index($name, '::') == -1) && (Eoldutf8::index($name, "'") == -1)) {
      0        
82 0         0 my $pkg;
83 0         0 my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT DATA);
  0         0  
84              
85             # Global names: special character, "^xyz", or other.
86 0 0 0     0 if ($name =~ /^(([^\x80-\xFFa-z])|(\^[a-z_]+))\z/i || $global{$name}) {
87             # RGS 2001-11-05 : translate leading ^X to control-char
88 0         0 $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei;
  0         0  
89 0         0 $pkg = "main";
90             }
91             else {
92 0 0       0 $pkg = (@_ > 1) ? $_[1] : caller;
93             }
94 0         0 $name = $pkg . "::" . $name;
95             }
96 0         0 return $name;
97             }
98              
99             sub qualify_to_ref ($;$) {
100              
101             # here, no strict qw(refs); if strict.pm exists
102              
103 0 0   0 0 0 return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller };
  0         0  
104             }
105             }
106              
107             # Column: local $@
108             # in Chapter 9. Osaete okitai Perl no kiso
109             # of ISBN 10: 4798119172 | ISBN 13: 978-4798119175 MODAN Perl NYUMON
110             # (and so on)
111              
112             # use strict; if strict.pm exists
113             BEGIN {
114 302 50   302   442 if (CORE::eval { local $@; CORE::require strict }) {
  302         418  
  302         2319  
115 302         25339 strict::->import;
116             }
117             }
118              
119             # P.714 29.2.39. flock
120             # in Chapter 29: Functions
121             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
122              
123             # P.863 flock
124             # in Chapter 27: Functions
125             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
126              
127             sub LOCK_SH() {1}
128             sub LOCK_EX() {2}
129             sub LOCK_UN() {8}
130             sub LOCK_NB() {4}
131              
132             # instead of Carp.pm
133             sub carp;
134             sub croak;
135             sub cluck;
136             sub confess;
137              
138             # 6.18. Matching Multiple-Byte Characters
139             # in Chapter 6. Pattern Matching
140             # of ISBN 978-1-56592-243-3 Perl Perl Cookbook.
141             # (and so on)
142              
143             # regexp of character
144 302     302   16692 BEGIN { CORE::eval q{ use vars qw($your_char) } } $your_char = q{(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF]|[\x00-\x7F\xF5-\xFF]};
  302     302   1170  
  302         340  
  302         14188  
145 302     302   14529 BEGIN { CORE::eval q{ use vars qw($qq_char ) } } $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  302     302   1131  
  302         333  
  302         14243  
146 302     302   13676 BEGIN { CORE::eval q{ use vars qw($q_char ) } } $q_char = qr/$your_char/oxms;
  302     302   1117  
  302         349  
  302         15852  
147              
148             #
149             # old UTF-8 character range per length
150             #
151             my %range_tr = ();
152              
153             #
154             # alias of encoding name
155             #
156 302     302   14270 BEGIN { CORE::eval q{ use vars qw($encoding_alias) } }
  302     302   1118  
  302         629  
  302         2531472  
157              
158             #
159             # old UTF-8 case conversion
160             #
161             my %lc = ();
162             @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)} =
163             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             my %uc = ();
165             @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)} =
166             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             my %fc = ();
168             @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)} =
169             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);
170              
171             if (0) {
172             }
173              
174             elsif (__PACKAGE__ =~ / \b Eoldutf8 \z/oxms) {
175             %range_tr = (
176             1 => [ [0x00..0x7F],
177             [0xF5..0xFF], # malformed octet
178             ],
179             2 => [ [0xC0..0xDF],[0x80..0xBF],
180             ],
181             3 => [ [0xE0..0xEF],[0x80..0xBF],[0x80..0xBF],
182             ],
183             4 => [ [0xF0..0xF4],[0x80..0xBF],[0x80..0xBF],[0x80..0xBF],
184             ],
185             );
186             $encoding_alias = qr/ \b (?: utf8 | cesu-?8 | modified[ ]?utf-?8 | old[ ]?utf-?8 ) \b /oxmsi;
187              
188             # CaseFolding-9.0.0.txt
189             # Date: 2016-03-02, 18:54:54 GMT
190             # c 2016 UnicodeR, Inc.
191             # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
192             # For terms of use, see http://www.unicode.org/terms_of_use.html
193             #
194             # Unicode Character Database
195             # For documentation, see http://www.unicode.org/reports/tr44/
196              
197             # you can use "make_CaseFolding.pl" to update this hash
198              
199             %fc = (
200             "\x41" => "\x61", # LATIN CAPITAL LETTER A
201             "\x42" => "\x62", # LATIN CAPITAL LETTER B
202             "\x43" => "\x63", # LATIN CAPITAL LETTER C
203             "\x44" => "\x64", # LATIN CAPITAL LETTER D
204             "\x45" => "\x65", # LATIN CAPITAL LETTER E
205             "\x46" => "\x66", # LATIN CAPITAL LETTER F
206             "\x47" => "\x67", # LATIN CAPITAL LETTER G
207             "\x48" => "\x68", # LATIN CAPITAL LETTER H
208             "\x49" => "\x69", # LATIN CAPITAL LETTER I
209             "\x4A" => "\x6A", # LATIN CAPITAL LETTER J
210             "\x4B" => "\x6B", # LATIN CAPITAL LETTER K
211             "\x4C" => "\x6C", # LATIN CAPITAL LETTER L
212             "\x4D" => "\x6D", # LATIN CAPITAL LETTER M
213             "\x4E" => "\x6E", # LATIN CAPITAL LETTER N
214             "\x4F" => "\x6F", # LATIN CAPITAL LETTER O
215             "\x50" => "\x70", # LATIN CAPITAL LETTER P
216             "\x51" => "\x71", # LATIN CAPITAL LETTER Q
217             "\x52" => "\x72", # LATIN CAPITAL LETTER R
218             "\x53" => "\x73", # LATIN CAPITAL LETTER S
219             "\x54" => "\x74", # LATIN CAPITAL LETTER T
220             "\x55" => "\x75", # LATIN CAPITAL LETTER U
221             "\x56" => "\x76", # LATIN CAPITAL LETTER V
222             "\x57" => "\x77", # LATIN CAPITAL LETTER W
223             "\x58" => "\x78", # LATIN CAPITAL LETTER X
224             "\x59" => "\x79", # LATIN CAPITAL LETTER Y
225             "\x5A" => "\x7A", # LATIN CAPITAL LETTER Z
226             "\xC2\xB5" => "\xCE\xBC", # MICRO SIGN
227             "\xC3\x80" => "\xC3\xA0", # LATIN CAPITAL LETTER A WITH GRAVE
228             "\xC3\x81" => "\xC3\xA1", # LATIN CAPITAL LETTER A WITH ACUTE
229             "\xC3\x82" => "\xC3\xA2", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
230             "\xC3\x83" => "\xC3\xA3", # LATIN CAPITAL LETTER A WITH TILDE
231             "\xC3\x84" => "\xC3\xA4", # LATIN CAPITAL LETTER A WITH DIAERESIS
232             "\xC3\x85" => "\xC3\xA5", # LATIN CAPITAL LETTER A WITH RING ABOVE
233             "\xC3\x86" => "\xC3\xA6", # LATIN CAPITAL LETTER AE
234             "\xC3\x87" => "\xC3\xA7", # LATIN CAPITAL LETTER C WITH CEDILLA
235             "\xC3\x88" => "\xC3\xA8", # LATIN CAPITAL LETTER E WITH GRAVE
236             "\xC3\x89" => "\xC3\xA9", # LATIN CAPITAL LETTER E WITH ACUTE
237             "\xC3\x8A" => "\xC3\xAA", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
238             "\xC3\x8B" => "\xC3\xAB", # LATIN CAPITAL LETTER E WITH DIAERESIS
239             "\xC3\x8C" => "\xC3\xAC", # LATIN CAPITAL LETTER I WITH GRAVE
240             "\xC3\x8D" => "\xC3\xAD", # LATIN CAPITAL LETTER I WITH ACUTE
241             "\xC3\x8E" => "\xC3\xAE", # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
242             "\xC3\x8F" => "\xC3\xAF", # LATIN CAPITAL LETTER I WITH DIAERESIS
243             "\xC3\x90" => "\xC3\xB0", # LATIN CAPITAL LETTER ETH
244             "\xC3\x91" => "\xC3\xB1", # LATIN CAPITAL LETTER N WITH TILDE
245             "\xC3\x92" => "\xC3\xB2", # LATIN CAPITAL LETTER O WITH GRAVE
246             "\xC3\x93" => "\xC3\xB3", # LATIN CAPITAL LETTER O WITH ACUTE
247             "\xC3\x94" => "\xC3\xB4", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
248             "\xC3\x95" => "\xC3\xB5", # LATIN CAPITAL LETTER O WITH TILDE
249             "\xC3\x96" => "\xC3\xB6", # LATIN CAPITAL LETTER O WITH DIAERESIS
250             "\xC3\x98" => "\xC3\xB8", # LATIN CAPITAL LETTER O WITH STROKE
251             "\xC3\x99" => "\xC3\xB9", # LATIN CAPITAL LETTER U WITH GRAVE
252             "\xC3\x9A" => "\xC3\xBA", # LATIN CAPITAL LETTER U WITH ACUTE
253             "\xC3\x9B" => "\xC3\xBB", # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
254             "\xC3\x9C" => "\xC3\xBC", # LATIN CAPITAL LETTER U WITH DIAERESIS
255             "\xC3\x9D" => "\xC3\xBD", # LATIN CAPITAL LETTER Y WITH ACUTE
256             "\xC3\x9E" => "\xC3\xBE", # LATIN CAPITAL LETTER THORN
257             "\xC3\x9F" => "\x73\x73", # LATIN SMALL LETTER SHARP S
258             "\xC4\x80" => "\xC4\x81", # LATIN CAPITAL LETTER A WITH MACRON
259             "\xC4\x82" => "\xC4\x83", # LATIN CAPITAL LETTER A WITH BREVE
260             "\xC4\x84" => "\xC4\x85", # LATIN CAPITAL LETTER A WITH OGONEK
261             "\xC4\x86" => "\xC4\x87", # LATIN CAPITAL LETTER C WITH ACUTE
262             "\xC4\x88" => "\xC4\x89", # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
263             "\xC4\x8A" => "\xC4\x8B", # LATIN CAPITAL LETTER C WITH DOT ABOVE
264             "\xC4\x8C" => "\xC4\x8D", # LATIN CAPITAL LETTER C WITH CARON
265             "\xC4\x8E" => "\xC4\x8F", # LATIN CAPITAL LETTER D WITH CARON
266             "\xC4\x90" => "\xC4\x91", # LATIN CAPITAL LETTER D WITH STROKE
267             "\xC4\x92" => "\xC4\x93", # LATIN CAPITAL LETTER E WITH MACRON
268             "\xC4\x94" => "\xC4\x95", # LATIN CAPITAL LETTER E WITH BREVE
269             "\xC4\x96" => "\xC4\x97", # LATIN CAPITAL LETTER E WITH DOT ABOVE
270             "\xC4\x98" => "\xC4\x99", # LATIN CAPITAL LETTER E WITH OGONEK
271             "\xC4\x9A" => "\xC4\x9B", # LATIN CAPITAL LETTER E WITH CARON
272             "\xC4\x9C" => "\xC4\x9D", # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
273             "\xC4\x9E" => "\xC4\x9F", # LATIN CAPITAL LETTER G WITH BREVE
274             "\xC4\xA0" => "\xC4\xA1", # LATIN CAPITAL LETTER G WITH DOT ABOVE
275             "\xC4\xA2" => "\xC4\xA3", # LATIN CAPITAL LETTER G WITH CEDILLA
276             "\xC4\xA4" => "\xC4\xA5", # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
277             "\xC4\xA6" => "\xC4\xA7", # LATIN CAPITAL LETTER H WITH STROKE
278             "\xC4\xA8" => "\xC4\xA9", # LATIN CAPITAL LETTER I WITH TILDE
279             "\xC4\xAA" => "\xC4\xAB", # LATIN CAPITAL LETTER I WITH MACRON
280             "\xC4\xAC" => "\xC4\xAD", # LATIN CAPITAL LETTER I WITH BREVE
281             "\xC4\xAE" => "\xC4\xAF", # LATIN CAPITAL LETTER I WITH OGONEK
282             "\xC4\xB0" => "\x69\xCC\x87", # LATIN CAPITAL LETTER I WITH DOT ABOVE
283             "\xC4\xB2" => "\xC4\xB3", # LATIN CAPITAL LIGATURE IJ
284             "\xC4\xB4" => "\xC4\xB5", # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
285             "\xC4\xB6" => "\xC4\xB7", # LATIN CAPITAL LETTER K WITH CEDILLA
286             "\xC4\xB9" => "\xC4\xBA", # LATIN CAPITAL LETTER L WITH ACUTE
287             "\xC4\xBB" => "\xC4\xBC", # LATIN CAPITAL LETTER L WITH CEDILLA
288             "\xC4\xBD" => "\xC4\xBE", # LATIN CAPITAL LETTER L WITH CARON
289             "\xC4\xBF" => "\xC5\x80", # LATIN CAPITAL LETTER L WITH MIDDLE DOT
290             "\xC5\x81" => "\xC5\x82", # LATIN CAPITAL LETTER L WITH STROKE
291             "\xC5\x83" => "\xC5\x84", # LATIN CAPITAL LETTER N WITH ACUTE
292             "\xC5\x85" => "\xC5\x86", # LATIN CAPITAL LETTER N WITH CEDILLA
293             "\xC5\x87" => "\xC5\x88", # LATIN CAPITAL LETTER N WITH CARON
294             "\xC5\x89" => "\xCA\xBC\x6E", # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
295             "\xC5\x8A" => "\xC5\x8B", # LATIN CAPITAL LETTER ENG
296             "\xC5\x8C" => "\xC5\x8D", # LATIN CAPITAL LETTER O WITH MACRON
297             "\xC5\x8E" => "\xC5\x8F", # LATIN CAPITAL LETTER O WITH BREVE
298             "\xC5\x90" => "\xC5\x91", # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
299             "\xC5\x92" => "\xC5\x93", # LATIN CAPITAL LIGATURE OE
300             "\xC5\x94" => "\xC5\x95", # LATIN CAPITAL LETTER R WITH ACUTE
301             "\xC5\x96" => "\xC5\x97", # LATIN CAPITAL LETTER R WITH CEDILLA
302             "\xC5\x98" => "\xC5\x99", # LATIN CAPITAL LETTER R WITH CARON
303             "\xC5\x9A" => "\xC5\x9B", # LATIN CAPITAL LETTER S WITH ACUTE
304             "\xC5\x9C" => "\xC5\x9D", # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
305             "\xC5\x9E" => "\xC5\x9F", # LATIN CAPITAL LETTER S WITH CEDILLA
306             "\xC5\xA0" => "\xC5\xA1", # LATIN CAPITAL LETTER S WITH CARON
307             "\xC5\xA2" => "\xC5\xA3", # LATIN CAPITAL LETTER T WITH CEDILLA
308             "\xC5\xA4" => "\xC5\xA5", # LATIN CAPITAL LETTER T WITH CARON
309             "\xC5\xA6" => "\xC5\xA7", # LATIN CAPITAL LETTER T WITH STROKE
310             "\xC5\xA8" => "\xC5\xA9", # LATIN CAPITAL LETTER U WITH TILDE
311             "\xC5\xAA" => "\xC5\xAB", # LATIN CAPITAL LETTER U WITH MACRON
312             "\xC5\xAC" => "\xC5\xAD", # LATIN CAPITAL LETTER U WITH BREVE
313             "\xC5\xAE" => "\xC5\xAF", # LATIN CAPITAL LETTER U WITH RING ABOVE
314             "\xC5\xB0" => "\xC5\xB1", # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
315             "\xC5\xB2" => "\xC5\xB3", # LATIN CAPITAL LETTER U WITH OGONEK
316             "\xC5\xB4" => "\xC5\xB5", # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
317             "\xC5\xB6" => "\xC5\xB7", # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
318             "\xC5\xB8" => "\xC3\xBF", # LATIN CAPITAL LETTER Y WITH DIAERESIS
319             "\xC5\xB9" => "\xC5\xBA", # LATIN CAPITAL LETTER Z WITH ACUTE
320             "\xC5\xBB" => "\xC5\xBC", # LATIN CAPITAL LETTER Z WITH DOT ABOVE
321             "\xC5\xBD" => "\xC5\xBE", # LATIN CAPITAL LETTER Z WITH CARON
322             "\xC5\xBF" => "\x73", # LATIN SMALL LETTER LONG S
323             "\xC6\x81" => "\xC9\x93", # LATIN CAPITAL LETTER B WITH HOOK
324             "\xC6\x82" => "\xC6\x83", # LATIN CAPITAL LETTER B WITH TOPBAR
325             "\xC6\x84" => "\xC6\x85", # LATIN CAPITAL LETTER TONE SIX
326             "\xC6\x86" => "\xC9\x94", # LATIN CAPITAL LETTER OPEN O
327             "\xC6\x87" => "\xC6\x88", # LATIN CAPITAL LETTER C WITH HOOK
328             "\xC6\x89" => "\xC9\x96", # LATIN CAPITAL LETTER AFRICAN D
329             "\xC6\x8A" => "\xC9\x97", # LATIN CAPITAL LETTER D WITH HOOK
330             "\xC6\x8B" => "\xC6\x8C", # LATIN CAPITAL LETTER D WITH TOPBAR
331             "\xC6\x8E" => "\xC7\x9D", # LATIN CAPITAL LETTER REVERSED E
332             "\xC6\x8F" => "\xC9\x99", # LATIN CAPITAL LETTER SCHWA
333             "\xC6\x90" => "\xC9\x9B", # LATIN CAPITAL LETTER OPEN E
334             "\xC6\x91" => "\xC6\x92", # LATIN CAPITAL LETTER F WITH HOOK
335             "\xC6\x93" => "\xC9\xA0", # LATIN CAPITAL LETTER G WITH HOOK
336             "\xC6\x94" => "\xC9\xA3", # LATIN CAPITAL LETTER GAMMA
337             "\xC6\x96" => "\xC9\xA9", # LATIN CAPITAL LETTER IOTA
338             "\xC6\x97" => "\xC9\xA8", # LATIN CAPITAL LETTER I WITH STROKE
339             "\xC6\x98" => "\xC6\x99", # LATIN CAPITAL LETTER K WITH HOOK
340             "\xC6\x9C" => "\xC9\xAF", # LATIN CAPITAL LETTER TURNED M
341             "\xC6\x9D" => "\xC9\xB2", # LATIN CAPITAL LETTER N WITH LEFT HOOK
342             "\xC6\x9F" => "\xC9\xB5", # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
343             "\xC6\xA0" => "\xC6\xA1", # LATIN CAPITAL LETTER O WITH HORN
344             "\xC6\xA2" => "\xC6\xA3", # LATIN CAPITAL LETTER OI
345             "\xC6\xA4" => "\xC6\xA5", # LATIN CAPITAL LETTER P WITH HOOK
346             "\xC6\xA6" => "\xCA\x80", # LATIN LETTER YR
347             "\xC6\xA7" => "\xC6\xA8", # LATIN CAPITAL LETTER TONE TWO
348             "\xC6\xA9" => "\xCA\x83", # LATIN CAPITAL LETTER ESH
349             "\xC6\xAC" => "\xC6\xAD", # LATIN CAPITAL LETTER T WITH HOOK
350             "\xC6\xAE" => "\xCA\x88", # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
351             "\xC6\xAF" => "\xC6\xB0", # LATIN CAPITAL LETTER U WITH HORN
352             "\xC6\xB1" => "\xCA\x8A", # LATIN CAPITAL LETTER UPSILON
353             "\xC6\xB2" => "\xCA\x8B", # LATIN CAPITAL LETTER V WITH HOOK
354             "\xC6\xB3" => "\xC6\xB4", # LATIN CAPITAL LETTER Y WITH HOOK
355             "\xC6\xB5" => "\xC6\xB6", # LATIN CAPITAL LETTER Z WITH STROKE
356             "\xC6\xB7" => "\xCA\x92", # LATIN CAPITAL LETTER EZH
357             "\xC6\xB8" => "\xC6\xB9", # LATIN CAPITAL LETTER EZH REVERSED
358             "\xC6\xBC" => "\xC6\xBD", # LATIN CAPITAL LETTER TONE FIVE
359             "\xC7\x84" => "\xC7\x86", # LATIN CAPITAL LETTER DZ WITH CARON
360             "\xC7\x85" => "\xC7\x86", # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
361             "\xC7\x87" => "\xC7\x89", # LATIN CAPITAL LETTER LJ
362             "\xC7\x88" => "\xC7\x89", # LATIN CAPITAL LETTER L WITH SMALL LETTER J
363             "\xC7\x8A" => "\xC7\x8C", # LATIN CAPITAL LETTER NJ
364             "\xC7\x8B" => "\xC7\x8C", # LATIN CAPITAL LETTER N WITH SMALL LETTER J
365             "\xC7\x8D" => "\xC7\x8E", # LATIN CAPITAL LETTER A WITH CARON
366             "\xC7\x8F" => "\xC7\x90", # LATIN CAPITAL LETTER I WITH CARON
367             "\xC7\x91" => "\xC7\x92", # LATIN CAPITAL LETTER O WITH CARON
368             "\xC7\x93" => "\xC7\x94", # LATIN CAPITAL LETTER U WITH CARON
369             "\xC7\x95" => "\xC7\x96", # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
370             "\xC7\x97" => "\xC7\x98", # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
371             "\xC7\x99" => "\xC7\x9A", # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
372             "\xC7\x9B" => "\xC7\x9C", # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
373             "\xC7\x9E" => "\xC7\x9F", # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
374             "\xC7\xA0" => "\xC7\xA1", # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
375             "\xC7\xA2" => "\xC7\xA3", # LATIN CAPITAL LETTER AE WITH MACRON
376             "\xC7\xA4" => "\xC7\xA5", # LATIN CAPITAL LETTER G WITH STROKE
377             "\xC7\xA6" => "\xC7\xA7", # LATIN CAPITAL LETTER G WITH CARON
378             "\xC7\xA8" => "\xC7\xA9", # LATIN CAPITAL LETTER K WITH CARON
379             "\xC7\xAA" => "\xC7\xAB", # LATIN CAPITAL LETTER O WITH OGONEK
380             "\xC7\xAC" => "\xC7\xAD", # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
381             "\xC7\xAE" => "\xC7\xAF", # LATIN CAPITAL LETTER EZH WITH CARON
382             "\xC7\xB0" => "\x6A\xCC\x8C", # LATIN SMALL LETTER J WITH CARON
383             "\xC7\xB1" => "\xC7\xB3", # LATIN CAPITAL LETTER DZ
384             "\xC7\xB2" => "\xC7\xB3", # LATIN CAPITAL LETTER D WITH SMALL LETTER Z
385             "\xC7\xB4" => "\xC7\xB5", # LATIN CAPITAL LETTER G WITH ACUTE
386             "\xC7\xB6" => "\xC6\x95", # LATIN CAPITAL LETTER HWAIR
387             "\xC7\xB7" => "\xC6\xBF", # LATIN CAPITAL LETTER WYNN
388             "\xC7\xB8" => "\xC7\xB9", # LATIN CAPITAL LETTER N WITH GRAVE
389             "\xC7\xBA" => "\xC7\xBB", # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
390             "\xC7\xBC" => "\xC7\xBD", # LATIN CAPITAL LETTER AE WITH ACUTE
391             "\xC7\xBE" => "\xC7\xBF", # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
392             "\xC8\x80" => "\xC8\x81", # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
393             "\xC8\x82" => "\xC8\x83", # LATIN CAPITAL LETTER A WITH INVERTED BREVE
394             "\xC8\x84" => "\xC8\x85", # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
395             "\xC8\x86" => "\xC8\x87", # LATIN CAPITAL LETTER E WITH INVERTED BREVE
396             "\xC8\x88" => "\xC8\x89", # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
397             "\xC8\x8A" => "\xC8\x8B", # LATIN CAPITAL LETTER I WITH INVERTED BREVE
398             "\xC8\x8C" => "\xC8\x8D", # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
399             "\xC8\x8E" => "\xC8\x8F", # LATIN CAPITAL LETTER O WITH INVERTED BREVE
400             "\xC8\x90" => "\xC8\x91", # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
401             "\xC8\x92" => "\xC8\x93", # LATIN CAPITAL LETTER R WITH INVERTED BREVE
402             "\xC8\x94" => "\xC8\x95", # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
403             "\xC8\x96" => "\xC8\x97", # LATIN CAPITAL LETTER U WITH INVERTED BREVE
404             "\xC8\x98" => "\xC8\x99", # LATIN CAPITAL LETTER S WITH COMMA BELOW
405             "\xC8\x9A" => "\xC8\x9B", # LATIN CAPITAL LETTER T WITH COMMA BELOW
406             "\xC8\x9C" => "\xC8\x9D", # LATIN CAPITAL LETTER YOGH
407             "\xC8\x9E" => "\xC8\x9F", # LATIN CAPITAL LETTER H WITH CARON
408             "\xC8\xA0" => "\xC6\x9E", # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
409             "\xC8\xA2" => "\xC8\xA3", # LATIN CAPITAL LETTER OU
410             "\xC8\xA4" => "\xC8\xA5", # LATIN CAPITAL LETTER Z WITH HOOK
411             "\xC8\xA6" => "\xC8\xA7", # LATIN CAPITAL LETTER A WITH DOT ABOVE
412             "\xC8\xA8" => "\xC8\xA9", # LATIN CAPITAL LETTER E WITH CEDILLA
413             "\xC8\xAA" => "\xC8\xAB", # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
414             "\xC8\xAC" => "\xC8\xAD", # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
415             "\xC8\xAE" => "\xC8\xAF", # LATIN CAPITAL LETTER O WITH DOT ABOVE
416             "\xC8\xB0" => "\xC8\xB1", # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
417             "\xC8\xB2" => "\xC8\xB3", # LATIN CAPITAL LETTER Y WITH MACRON
418             "\xC8\xBA" => "\xE2\xB1\xA5", # LATIN CAPITAL LETTER A WITH STROKE
419             "\xC8\xBB" => "\xC8\xBC", # LATIN CAPITAL LETTER C WITH STROKE
420             "\xC8\xBD" => "\xC6\x9A", # LATIN CAPITAL LETTER L WITH BAR
421             "\xC8\xBE" => "\xE2\xB1\xA6", # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
422             "\xC9\x81" => "\xC9\x82", # LATIN CAPITAL LETTER GLOTTAL STOP
423             "\xC9\x83" => "\xC6\x80", # LATIN CAPITAL LETTER B WITH STROKE
424             "\xC9\x84" => "\xCA\x89", # LATIN CAPITAL LETTER U BAR
425             "\xC9\x85" => "\xCA\x8C", # LATIN CAPITAL LETTER TURNED V
426             "\xC9\x86" => "\xC9\x87", # LATIN CAPITAL LETTER E WITH STROKE
427             "\xC9\x88" => "\xC9\x89", # LATIN CAPITAL LETTER J WITH STROKE
428             "\xC9\x8A" => "\xC9\x8B", # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
429             "\xC9\x8C" => "\xC9\x8D", # LATIN CAPITAL LETTER R WITH STROKE
430             "\xC9\x8E" => "\xC9\x8F", # LATIN CAPITAL LETTER Y WITH STROKE
431             "\xCD\x85" => "\xCE\xB9", # COMBINING GREEK YPOGEGRAMMENI
432             "\xCD\xB0" => "\xCD\xB1", # GREEK CAPITAL LETTER HETA
433             "\xCD\xB2" => "\xCD\xB3", # GREEK CAPITAL LETTER ARCHAIC SAMPI
434             "\xCD\xB6" => "\xCD\xB7", # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
435             "\xCD\xBF" => "\xCF\xB3", # GREEK CAPITAL LETTER YOT
436             "\xCE\x86" => "\xCE\xAC", # GREEK CAPITAL LETTER ALPHA WITH TONOS
437             "\xCE\x88" => "\xCE\xAD", # GREEK CAPITAL LETTER EPSILON WITH TONOS
438             "\xCE\x89" => "\xCE\xAE", # GREEK CAPITAL LETTER ETA WITH TONOS
439             "\xCE\x8A" => "\xCE\xAF", # GREEK CAPITAL LETTER IOTA WITH TONOS
440             "\xCE\x8C" => "\xCF\x8C", # GREEK CAPITAL LETTER OMICRON WITH TONOS
441             "\xCE\x8E" => "\xCF\x8D", # GREEK CAPITAL LETTER UPSILON WITH TONOS
442             "\xCE\x8F" => "\xCF\x8E", # GREEK CAPITAL LETTER OMEGA WITH TONOS
443             "\xCE\x90" => "\xCE\xB9\xCC\x88\xCC\x81", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
444             "\xCE\x91" => "\xCE\xB1", # GREEK CAPITAL LETTER ALPHA
445             "\xCE\x92" => "\xCE\xB2", # GREEK CAPITAL LETTER BETA
446             "\xCE\x93" => "\xCE\xB3", # GREEK CAPITAL LETTER GAMMA
447             "\xCE\x94" => "\xCE\xB4", # GREEK CAPITAL LETTER DELTA
448             "\xCE\x95" => "\xCE\xB5", # GREEK CAPITAL LETTER EPSILON
449             "\xCE\x96" => "\xCE\xB6", # GREEK CAPITAL LETTER ZETA
450             "\xCE\x97" => "\xCE\xB7", # GREEK CAPITAL LETTER ETA
451             "\xCE\x98" => "\xCE\xB8", # GREEK CAPITAL LETTER THETA
452             "\xCE\x99" => "\xCE\xB9", # GREEK CAPITAL LETTER IOTA
453             "\xCE\x9A" => "\xCE\xBA", # GREEK CAPITAL LETTER KAPPA
454             "\xCE\x9B" => "\xCE\xBB", # GREEK CAPITAL LETTER LAMDA
455             "\xCE\x9C" => "\xCE\xBC", # GREEK CAPITAL LETTER MU
456             "\xCE\x9D" => "\xCE\xBD", # GREEK CAPITAL LETTER NU
457             "\xCE\x9E" => "\xCE\xBE", # GREEK CAPITAL LETTER XI
458             "\xCE\x9F" => "\xCE\xBF", # GREEK CAPITAL LETTER OMICRON
459             "\xCE\xA0" => "\xCF\x80", # GREEK CAPITAL LETTER PI
460             "\xCE\xA1" => "\xCF\x81", # GREEK CAPITAL LETTER RHO
461             "\xCE\xA3" => "\xCF\x83", # GREEK CAPITAL LETTER SIGMA
462             "\xCE\xA4" => "\xCF\x84", # GREEK CAPITAL LETTER TAU
463             "\xCE\xA5" => "\xCF\x85", # GREEK CAPITAL LETTER UPSILON
464             "\xCE\xA6" => "\xCF\x86", # GREEK CAPITAL LETTER PHI
465             "\xCE\xA7" => "\xCF\x87", # GREEK CAPITAL LETTER CHI
466             "\xCE\xA8" => "\xCF\x88", # GREEK CAPITAL LETTER PSI
467             "\xCE\xA9" => "\xCF\x89", # GREEK CAPITAL LETTER OMEGA
468             "\xCE\xAA" => "\xCF\x8A", # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
469             "\xCE\xAB" => "\xCF\x8B", # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
470             "\xCE\xB0" => "\xCF\x85\xCC\x88\xCC\x81", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
471             "\xCF\x82" => "\xCF\x83", # GREEK SMALL LETTER FINAL SIGMA
472             "\xCF\x8F" => "\xCF\x97", # GREEK CAPITAL KAI SYMBOL
473             "\xCF\x90" => "\xCE\xB2", # GREEK BETA SYMBOL
474             "\xCF\x91" => "\xCE\xB8", # GREEK THETA SYMBOL
475             "\xCF\x95" => "\xCF\x86", # GREEK PHI SYMBOL
476             "\xCF\x96" => "\xCF\x80", # GREEK PI SYMBOL
477             "\xCF\x98" => "\xCF\x99", # GREEK LETTER ARCHAIC KOPPA
478             "\xCF\x9A" => "\xCF\x9B", # GREEK LETTER STIGMA
479             "\xCF\x9C" => "\xCF\x9D", # GREEK LETTER DIGAMMA
480             "\xCF\x9E" => "\xCF\x9F", # GREEK LETTER KOPPA
481             "\xCF\xA0" => "\xCF\xA1", # GREEK LETTER SAMPI
482             "\xCF\xA2" => "\xCF\xA3", # COPTIC CAPITAL LETTER SHEI
483             "\xCF\xA4" => "\xCF\xA5", # COPTIC CAPITAL LETTER FEI
484             "\xCF\xA6" => "\xCF\xA7", # COPTIC CAPITAL LETTER KHEI
485             "\xCF\xA8" => "\xCF\xA9", # COPTIC CAPITAL LETTER HORI
486             "\xCF\xAA" => "\xCF\xAB", # COPTIC CAPITAL LETTER GANGIA
487             "\xCF\xAC" => "\xCF\xAD", # COPTIC CAPITAL LETTER SHIMA
488             "\xCF\xAE" => "\xCF\xAF", # COPTIC CAPITAL LETTER DEI
489             "\xCF\xB0" => "\xCE\xBA", # GREEK KAPPA SYMBOL
490             "\xCF\xB1" => "\xCF\x81", # GREEK RHO SYMBOL
491             "\xCF\xB4" => "\xCE\xB8", # GREEK CAPITAL THETA SYMBOL
492             "\xCF\xB5" => "\xCE\xB5", # GREEK LUNATE EPSILON SYMBOL
493             "\xCF\xB7" => "\xCF\xB8", # GREEK CAPITAL LETTER SHO
494             "\xCF\xB9" => "\xCF\xB2", # GREEK CAPITAL LUNATE SIGMA SYMBOL
495             "\xCF\xBA" => "\xCF\xBB", # GREEK CAPITAL LETTER SAN
496             "\xCF\xBD" => "\xCD\xBB", # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
497             "\xCF\xBE" => "\xCD\xBC", # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
498             "\xCF\xBF" => "\xCD\xBD", # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
499             "\xD0\x80" => "\xD1\x90", # CYRILLIC CAPITAL LETTER IE WITH GRAVE
500             "\xD0\x81" => "\xD1\x91", # CYRILLIC CAPITAL LETTER IO
501             "\xD0\x82" => "\xD1\x92", # CYRILLIC CAPITAL LETTER DJE
502             "\xD0\x83" => "\xD1\x93", # CYRILLIC CAPITAL LETTER GJE
503             "\xD0\x84" => "\xD1\x94", # CYRILLIC CAPITAL LETTER UKRAINIAN IE
504             "\xD0\x85" => "\xD1\x95", # CYRILLIC CAPITAL LETTER DZE
505             "\xD0\x86" => "\xD1\x96", # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
506             "\xD0\x87" => "\xD1\x97", # CYRILLIC CAPITAL LETTER YI
507             "\xD0\x88" => "\xD1\x98", # CYRILLIC CAPITAL LETTER JE
508             "\xD0\x89" => "\xD1\x99", # CYRILLIC CAPITAL LETTER LJE
509             "\xD0\x8A" => "\xD1\x9A", # CYRILLIC CAPITAL LETTER NJE
510             "\xD0\x8B" => "\xD1\x9B", # CYRILLIC CAPITAL LETTER TSHE
511             "\xD0\x8C" => "\xD1\x9C", # CYRILLIC CAPITAL LETTER KJE
512             "\xD0\x8D" => "\xD1\x9D", # CYRILLIC CAPITAL LETTER I WITH GRAVE
513             "\xD0\x8E" => "\xD1\x9E", # CYRILLIC CAPITAL LETTER SHORT U
514             "\xD0\x8F" => "\xD1\x9F", # CYRILLIC CAPITAL LETTER DZHE
515             "\xD0\x90" => "\xD0\xB0", # CYRILLIC CAPITAL LETTER A
516             "\xD0\x91" => "\xD0\xB1", # CYRILLIC CAPITAL LETTER BE
517             "\xD0\x92" => "\xD0\xB2", # CYRILLIC CAPITAL LETTER VE
518             "\xD0\x93" => "\xD0\xB3", # CYRILLIC CAPITAL LETTER GHE
519             "\xD0\x94" => "\xD0\xB4", # CYRILLIC CAPITAL LETTER DE
520             "\xD0\x95" => "\xD0\xB5", # CYRILLIC CAPITAL LETTER IE
521             "\xD0\x96" => "\xD0\xB6", # CYRILLIC CAPITAL LETTER ZHE
522             "\xD0\x97" => "\xD0\xB7", # CYRILLIC CAPITAL LETTER ZE
523             "\xD0\x98" => "\xD0\xB8", # CYRILLIC CAPITAL LETTER I
524             "\xD0\x99" => "\xD0\xB9", # CYRILLIC CAPITAL LETTER SHORT I
525             "\xD0\x9A" => "\xD0\xBA", # CYRILLIC CAPITAL LETTER KA
526             "\xD0\x9B" => "\xD0\xBB", # CYRILLIC CAPITAL LETTER EL
527             "\xD0\x9C" => "\xD0\xBC", # CYRILLIC CAPITAL LETTER EM
528             "\xD0\x9D" => "\xD0\xBD", # CYRILLIC CAPITAL LETTER EN
529             "\xD0\x9E" => "\xD0\xBE", # CYRILLIC CAPITAL LETTER O
530             "\xD0\x9F" => "\xD0\xBF", # CYRILLIC CAPITAL LETTER PE
531             "\xD0\xA0" => "\xD1\x80", # CYRILLIC CAPITAL LETTER ER
532             "\xD0\xA1" => "\xD1\x81", # CYRILLIC CAPITAL LETTER ES
533             "\xD0\xA2" => "\xD1\x82", # CYRILLIC CAPITAL LETTER TE
534             "\xD0\xA3" => "\xD1\x83", # CYRILLIC CAPITAL LETTER U
535             "\xD0\xA4" => "\xD1\x84", # CYRILLIC CAPITAL LETTER EF
536             "\xD0\xA5" => "\xD1\x85", # CYRILLIC CAPITAL LETTER HA
537             "\xD0\xA6" => "\xD1\x86", # CYRILLIC CAPITAL LETTER TSE
538             "\xD0\xA7" => "\xD1\x87", # CYRILLIC CAPITAL LETTER CHE
539             "\xD0\xA8" => "\xD1\x88", # CYRILLIC CAPITAL LETTER SHA
540             "\xD0\xA9" => "\xD1\x89", # CYRILLIC CAPITAL LETTER SHCHA
541             "\xD0\xAA" => "\xD1\x8A", # CYRILLIC CAPITAL LETTER HARD SIGN
542             "\xD0\xAB" => "\xD1\x8B", # CYRILLIC CAPITAL LETTER YERU
543             "\xD0\xAC" => "\xD1\x8C", # CYRILLIC CAPITAL LETTER SOFT SIGN
544             "\xD0\xAD" => "\xD1\x8D", # CYRILLIC CAPITAL LETTER E
545             "\xD0\xAE" => "\xD1\x8E", # CYRILLIC CAPITAL LETTER YU
546             "\xD0\xAF" => "\xD1\x8F", # CYRILLIC CAPITAL LETTER YA
547             "\xD1\xA0" => "\xD1\xA1", # CYRILLIC CAPITAL LETTER OMEGA
548             "\xD1\xA2" => "\xD1\xA3", # CYRILLIC CAPITAL LETTER YAT
549             "\xD1\xA4" => "\xD1\xA5", # CYRILLIC CAPITAL LETTER IOTIFIED E
550             "\xD1\xA6" => "\xD1\xA7", # CYRILLIC CAPITAL LETTER LITTLE YUS
551             "\xD1\xA8" => "\xD1\xA9", # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
552             "\xD1\xAA" => "\xD1\xAB", # CYRILLIC CAPITAL LETTER BIG YUS
553             "\xD1\xAC" => "\xD1\xAD", # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
554             "\xD1\xAE" => "\xD1\xAF", # CYRILLIC CAPITAL LETTER KSI
555             "\xD1\xB0" => "\xD1\xB1", # CYRILLIC CAPITAL LETTER PSI
556             "\xD1\xB2" => "\xD1\xB3", # CYRILLIC CAPITAL LETTER FITA
557             "\xD1\xB4" => "\xD1\xB5", # CYRILLIC CAPITAL LETTER IZHITSA
558             "\xD1\xB6" => "\xD1\xB7", # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
559             "\xD1\xB8" => "\xD1\xB9", # CYRILLIC CAPITAL LETTER UK
560             "\xD1\xBA" => "\xD1\xBB", # CYRILLIC CAPITAL LETTER ROUND OMEGA
561             "\xD1\xBC" => "\xD1\xBD", # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
562             "\xD1\xBE" => "\xD1\xBF", # CYRILLIC CAPITAL LETTER OT
563             "\xD2\x80" => "\xD2\x81", # CYRILLIC CAPITAL LETTER KOPPA
564             "\xD2\x8A" => "\xD2\x8B", # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
565             "\xD2\x8C" => "\xD2\x8D", # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
566             "\xD2\x8E" => "\xD2\x8F", # CYRILLIC CAPITAL LETTER ER WITH TICK
567             "\xD2\x90" => "\xD2\x91", # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
568             "\xD2\x92" => "\xD2\x93", # CYRILLIC CAPITAL LETTER GHE WITH STROKE
569             "\xD2\x94" => "\xD2\x95", # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
570             "\xD2\x96" => "\xD2\x97", # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
571             "\xD2\x98" => "\xD2\x99", # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
572             "\xD2\x9A" => "\xD2\x9B", # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
573             "\xD2\x9C" => "\xD2\x9D", # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
574             "\xD2\x9E" => "\xD2\x9F", # CYRILLIC CAPITAL LETTER KA WITH STROKE
575             "\xD2\xA0" => "\xD2\xA1", # CYRILLIC CAPITAL LETTER BASHKIR KA
576             "\xD2\xA2" => "\xD2\xA3", # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
577             "\xD2\xA4" => "\xD2\xA5", # CYRILLIC CAPITAL LIGATURE EN GHE
578             "\xD2\xA6" => "\xD2\xA7", # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
579             "\xD2\xA8" => "\xD2\xA9", # CYRILLIC CAPITAL LETTER ABKHASIAN HA
580             "\xD2\xAA" => "\xD2\xAB", # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
581             "\xD2\xAC" => "\xD2\xAD", # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
582             "\xD2\xAE" => "\xD2\xAF", # CYRILLIC CAPITAL LETTER STRAIGHT U
583             "\xD2\xB0" => "\xD2\xB1", # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
584             "\xD2\xB2" => "\xD2\xB3", # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
585             "\xD2\xB4" => "\xD2\xB5", # CYRILLIC CAPITAL LIGATURE TE TSE
586             "\xD2\xB6" => "\xD2\xB7", # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
587             "\xD2\xB8" => "\xD2\xB9", # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
588             "\xD2\xBA" => "\xD2\xBB", # CYRILLIC CAPITAL LETTER SHHA
589             "\xD2\xBC" => "\xD2\xBD", # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
590             "\xD2\xBE" => "\xD2\xBF", # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
591             "\xD3\x80" => "\xD3\x8F", # CYRILLIC LETTER PALOCHKA
592             "\xD3\x81" => "\xD3\x82", # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
593             "\xD3\x83" => "\xD3\x84", # CYRILLIC CAPITAL LETTER KA WITH HOOK
594             "\xD3\x85" => "\xD3\x86", # CYRILLIC CAPITAL LETTER EL WITH TAIL
595             "\xD3\x87" => "\xD3\x88", # CYRILLIC CAPITAL LETTER EN WITH HOOK
596             "\xD3\x89" => "\xD3\x8A", # CYRILLIC CAPITAL LETTER EN WITH TAIL
597             "\xD3\x8B" => "\xD3\x8C", # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
598             "\xD3\x8D" => "\xD3\x8E", # CYRILLIC CAPITAL LETTER EM WITH TAIL
599             "\xD3\x90" => "\xD3\x91", # CYRILLIC CAPITAL LETTER A WITH BREVE
600             "\xD3\x92" => "\xD3\x93", # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
601             "\xD3\x94" => "\xD3\x95", # CYRILLIC CAPITAL LIGATURE A IE
602             "\xD3\x96" => "\xD3\x97", # CYRILLIC CAPITAL LETTER IE WITH BREVE
603             "\xD3\x98" => "\xD3\x99", # CYRILLIC CAPITAL LETTER SCHWA
604             "\xD3\x9A" => "\xD3\x9B", # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
605             "\xD3\x9C" => "\xD3\x9D", # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
606             "\xD3\x9E" => "\xD3\x9F", # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
607             "\xD3\xA0" => "\xD3\xA1", # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
608             "\xD3\xA2" => "\xD3\xA3", # CYRILLIC CAPITAL LETTER I WITH MACRON
609             "\xD3\xA4" => "\xD3\xA5", # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
610             "\xD3\xA6" => "\xD3\xA7", # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
611             "\xD3\xA8" => "\xD3\xA9", # CYRILLIC CAPITAL LETTER BARRED O
612             "\xD3\xAA" => "\xD3\xAB", # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
613             "\xD3\xAC" => "\xD3\xAD", # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
614             "\xD3\xAE" => "\xD3\xAF", # CYRILLIC CAPITAL LETTER U WITH MACRON
615             "\xD3\xB0" => "\xD3\xB1", # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
616             "\xD3\xB2" => "\xD3\xB3", # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
617             "\xD3\xB4" => "\xD3\xB5", # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
618             "\xD3\xB6" => "\xD3\xB7", # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
619             "\xD3\xB8" => "\xD3\xB9", # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
620             "\xD3\xBA" => "\xD3\xBB", # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
621             "\xD3\xBC" => "\xD3\xBD", # CYRILLIC CAPITAL LETTER HA WITH HOOK
622             "\xD3\xBE" => "\xD3\xBF", # CYRILLIC CAPITAL LETTER HA WITH STROKE
623             "\xD4\x80" => "\xD4\x81", # CYRILLIC CAPITAL LETTER KOMI DE
624             "\xD4\x82" => "\xD4\x83", # CYRILLIC CAPITAL LETTER KOMI DJE
625             "\xD4\x84" => "\xD4\x85", # CYRILLIC CAPITAL LETTER KOMI ZJE
626             "\xD4\x86" => "\xD4\x87", # CYRILLIC CAPITAL LETTER KOMI DZJE
627             "\xD4\x88" => "\xD4\x89", # CYRILLIC CAPITAL LETTER KOMI LJE
628             "\xD4\x8A" => "\xD4\x8B", # CYRILLIC CAPITAL LETTER KOMI NJE
629             "\xD4\x8C" => "\xD4\x8D", # CYRILLIC CAPITAL LETTER KOMI SJE
630             "\xD4\x8E" => "\xD4\x8F", # CYRILLIC CAPITAL LETTER KOMI TJE
631             "\xD4\x90" => "\xD4\x91", # CYRILLIC CAPITAL LETTER REVERSED ZE
632             "\xD4\x92" => "\xD4\x93", # CYRILLIC CAPITAL LETTER EL WITH HOOK
633             "\xD4\x94" => "\xD4\x95", # CYRILLIC CAPITAL LETTER LHA
634             "\xD4\x96" => "\xD4\x97", # CYRILLIC CAPITAL LETTER RHA
635             "\xD4\x98" => "\xD4\x99", # CYRILLIC CAPITAL LETTER YAE
636             "\xD4\x9A" => "\xD4\x9B", # CYRILLIC CAPITAL LETTER QA
637             "\xD4\x9C" => "\xD4\x9D", # CYRILLIC CAPITAL LETTER WE
638             "\xD4\x9E" => "\xD4\x9F", # CYRILLIC CAPITAL LETTER ALEUT KA
639             "\xD4\xA0" => "\xD4\xA1", # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
640             "\xD4\xA2" => "\xD4\xA3", # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
641             "\xD4\xA4" => "\xD4\xA5", # CYRILLIC CAPITAL LETTER PE WITH DESCENDER
642             "\xD4\xA6" => "\xD4\xA7", # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER
643             "\xD4\xA8" => "\xD4\xA9", # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
644             "\xD4\xAA" => "\xD4\xAB", # CYRILLIC CAPITAL LETTER DZZHE
645             "\xD4\xAC" => "\xD4\xAD", # CYRILLIC CAPITAL LETTER DCHE
646             "\xD4\xAE" => "\xD4\xAF", # CYRILLIC CAPITAL LETTER EL WITH DESCENDER
647             "\xD4\xB1" => "\xD5\xA1", # ARMENIAN CAPITAL LETTER AYB
648             "\xD4\xB2" => "\xD5\xA2", # ARMENIAN CAPITAL LETTER BEN
649             "\xD4\xB3" => "\xD5\xA3", # ARMENIAN CAPITAL LETTER GIM
650             "\xD4\xB4" => "\xD5\xA4", # ARMENIAN CAPITAL LETTER DA
651             "\xD4\xB5" => "\xD5\xA5", # ARMENIAN CAPITAL LETTER ECH
652             "\xD4\xB6" => "\xD5\xA6", # ARMENIAN CAPITAL LETTER ZA
653             "\xD4\xB7" => "\xD5\xA7", # ARMENIAN CAPITAL LETTER EH
654             "\xD4\xB8" => "\xD5\xA8", # ARMENIAN CAPITAL LETTER ET
655             "\xD4\xB9" => "\xD5\xA9", # ARMENIAN CAPITAL LETTER TO
656             "\xD4\xBA" => "\xD5\xAA", # ARMENIAN CAPITAL LETTER ZHE
657             "\xD4\xBB" => "\xD5\xAB", # ARMENIAN CAPITAL LETTER INI
658             "\xD4\xBC" => "\xD5\xAC", # ARMENIAN CAPITAL LETTER LIWN
659             "\xD4\xBD" => "\xD5\xAD", # ARMENIAN CAPITAL LETTER XEH
660             "\xD4\xBE" => "\xD5\xAE", # ARMENIAN CAPITAL LETTER CA
661             "\xD4\xBF" => "\xD5\xAF", # ARMENIAN CAPITAL LETTER KEN
662             "\xD5\x80" => "\xD5\xB0", # ARMENIAN CAPITAL LETTER HO
663             "\xD5\x81" => "\xD5\xB1", # ARMENIAN CAPITAL LETTER JA
664             "\xD5\x82" => "\xD5\xB2", # ARMENIAN CAPITAL LETTER GHAD
665             "\xD5\x83" => "\xD5\xB3", # ARMENIAN CAPITAL LETTER CHEH
666             "\xD5\x84" => "\xD5\xB4", # ARMENIAN CAPITAL LETTER MEN
667             "\xD5\x85" => "\xD5\xB5", # ARMENIAN CAPITAL LETTER YI
668             "\xD5\x86" => "\xD5\xB6", # ARMENIAN CAPITAL LETTER NOW
669             "\xD5\x87" => "\xD5\xB7", # ARMENIAN CAPITAL LETTER SHA
670             "\xD5\x88" => "\xD5\xB8", # ARMENIAN CAPITAL LETTER VO
671             "\xD5\x89" => "\xD5\xB9", # ARMENIAN CAPITAL LETTER CHA
672             "\xD5\x8A" => "\xD5\xBA", # ARMENIAN CAPITAL LETTER PEH
673             "\xD5\x8B" => "\xD5\xBB", # ARMENIAN CAPITAL LETTER JHEH
674             "\xD5\x8C" => "\xD5\xBC", # ARMENIAN CAPITAL LETTER RA
675             "\xD5\x8D" => "\xD5\xBD", # ARMENIAN CAPITAL LETTER SEH
676             "\xD5\x8E" => "\xD5\xBE", # ARMENIAN CAPITAL LETTER VEW
677             "\xD5\x8F" => "\xD5\xBF", # ARMENIAN CAPITAL LETTER TIWN
678             "\xD5\x90" => "\xD6\x80", # ARMENIAN CAPITAL LETTER REH
679             "\xD5\x91" => "\xD6\x81", # ARMENIAN CAPITAL LETTER CO
680             "\xD5\x92" => "\xD6\x82", # ARMENIAN CAPITAL LETTER YIWN
681             "\xD5\x93" => "\xD6\x83", # ARMENIAN CAPITAL LETTER PIWR
682             "\xD5\x94" => "\xD6\x84", # ARMENIAN CAPITAL LETTER KEH
683             "\xD5\x95" => "\xD6\x85", # ARMENIAN CAPITAL LETTER OH
684             "\xD5\x96" => "\xD6\x86", # ARMENIAN CAPITAL LETTER FEH
685             "\xD6\x87" => "\xD5\xA5\xD6\x82", # ARMENIAN SMALL LIGATURE ECH YIWN
686             "\xE1\x82\xA0" => "\xE2\xB4\x80", # GEORGIAN CAPITAL LETTER AN
687             "\xE1\x82\xA1" => "\xE2\xB4\x81", # GEORGIAN CAPITAL LETTER BAN
688             "\xE1\x82\xA2" => "\xE2\xB4\x82", # GEORGIAN CAPITAL LETTER GAN
689             "\xE1\x82\xA3" => "\xE2\xB4\x83", # GEORGIAN CAPITAL LETTER DON
690             "\xE1\x82\xA4" => "\xE2\xB4\x84", # GEORGIAN CAPITAL LETTER EN
691             "\xE1\x82\xA5" => "\xE2\xB4\x85", # GEORGIAN CAPITAL LETTER VIN
692             "\xE1\x82\xA6" => "\xE2\xB4\x86", # GEORGIAN CAPITAL LETTER ZEN
693             "\xE1\x82\xA7" => "\xE2\xB4\x87", # GEORGIAN CAPITAL LETTER TAN
694             "\xE1\x82\xA8" => "\xE2\xB4\x88", # GEORGIAN CAPITAL LETTER IN
695             "\xE1\x82\xA9" => "\xE2\xB4\x89", # GEORGIAN CAPITAL LETTER KAN
696             "\xE1\x82\xAA" => "\xE2\xB4\x8A", # GEORGIAN CAPITAL LETTER LAS
697             "\xE1\x82\xAB" => "\xE2\xB4\x8B", # GEORGIAN CAPITAL LETTER MAN
698             "\xE1\x82\xAC" => "\xE2\xB4\x8C", # GEORGIAN CAPITAL LETTER NAR
699             "\xE1\x82\xAD" => "\xE2\xB4\x8D", # GEORGIAN CAPITAL LETTER ON
700             "\xE1\x82\xAE" => "\xE2\xB4\x8E", # GEORGIAN CAPITAL LETTER PAR
701             "\xE1\x82\xAF" => "\xE2\xB4\x8F", # GEORGIAN CAPITAL LETTER ZHAR
702             "\xE1\x82\xB0" => "\xE2\xB4\x90", # GEORGIAN CAPITAL LETTER RAE
703             "\xE1\x82\xB1" => "\xE2\xB4\x91", # GEORGIAN CAPITAL LETTER SAN
704             "\xE1\x82\xB2" => "\xE2\xB4\x92", # GEORGIAN CAPITAL LETTER TAR
705             "\xE1\x82\xB3" => "\xE2\xB4\x93", # GEORGIAN CAPITAL LETTER UN
706             "\xE1\x82\xB4" => "\xE2\xB4\x94", # GEORGIAN CAPITAL LETTER PHAR
707             "\xE1\x82\xB5" => "\xE2\xB4\x95", # GEORGIAN CAPITAL LETTER KHAR
708             "\xE1\x82\xB6" => "\xE2\xB4\x96", # GEORGIAN CAPITAL LETTER GHAN
709             "\xE1\x82\xB7" => "\xE2\xB4\x97", # GEORGIAN CAPITAL LETTER QAR
710             "\xE1\x82\xB8" => "\xE2\xB4\x98", # GEORGIAN CAPITAL LETTER SHIN
711             "\xE1\x82\xB9" => "\xE2\xB4\x99", # GEORGIAN CAPITAL LETTER CHIN
712             "\xE1\x82\xBA" => "\xE2\xB4\x9A", # GEORGIAN CAPITAL LETTER CAN
713             "\xE1\x82\xBB" => "\xE2\xB4\x9B", # GEORGIAN CAPITAL LETTER JIL
714             "\xE1\x82\xBC" => "\xE2\xB4\x9C", # GEORGIAN CAPITAL LETTER CIL
715             "\xE1\x82\xBD" => "\xE2\xB4\x9D", # GEORGIAN CAPITAL LETTER CHAR
716             "\xE1\x82\xBE" => "\xE2\xB4\x9E", # GEORGIAN CAPITAL LETTER XAN
717             "\xE1\x82\xBF" => "\xE2\xB4\x9F", # GEORGIAN CAPITAL LETTER JHAN
718             "\xE1\x83\x80" => "\xE2\xB4\xA0", # GEORGIAN CAPITAL LETTER HAE
719             "\xE1\x83\x81" => "\xE2\xB4\xA1", # GEORGIAN CAPITAL LETTER HE
720             "\xE1\x83\x82" => "\xE2\xB4\xA2", # GEORGIAN CAPITAL LETTER HIE
721             "\xE1\x83\x83" => "\xE2\xB4\xA3", # GEORGIAN CAPITAL LETTER WE
722             "\xE1\x83\x84" => "\xE2\xB4\xA4", # GEORGIAN CAPITAL LETTER HAR
723             "\xE1\x83\x85" => "\xE2\xB4\xA5", # GEORGIAN CAPITAL LETTER HOE
724             "\xE1\x83\x87" => "\xE2\xB4\xA7", # GEORGIAN CAPITAL LETTER YN
725             "\xE1\x83\x8D" => "\xE2\xB4\xAD", # GEORGIAN CAPITAL LETTER AEN
726             "\xE1\x8F\xB8" => "\xE1\x8F\xB0", # CHEROKEE SMALL LETTER YE
727             "\xE1\x8F\xB9" => "\xE1\x8F\xB1", # CHEROKEE SMALL LETTER YI
728             "\xE1\x8F\xBA" => "\xE1\x8F\xB2", # CHEROKEE SMALL LETTER YO
729             "\xE1\x8F\xBB" => "\xE1\x8F\xB3", # CHEROKEE SMALL LETTER YU
730             "\xE1\x8F\xBC" => "\xE1\x8F\xB4", # CHEROKEE SMALL LETTER YV
731             "\xE1\x8F\xBD" => "\xE1\x8F\xB5", # CHEROKEE SMALL LETTER MV
732             "\xE1\xB2\x80" => "\xD0\xB2", # CYRILLIC SMALL LETTER ROUNDED VE
733             "\xE1\xB2\x81" => "\xD0\xB4", # CYRILLIC SMALL LETTER LONG-LEGGED DE
734             "\xE1\xB2\x82" => "\xD0\xBE", # CYRILLIC SMALL LETTER NARROW O
735             "\xE1\xB2\x83" => "\xD1\x81", # CYRILLIC SMALL LETTER WIDE ES
736             "\xE1\xB2\x84" => "\xD1\x82", # CYRILLIC SMALL LETTER TALL TE
737             "\xE1\xB2\x85" => "\xD1\x82", # CYRILLIC SMALL LETTER THREE-LEGGED TE
738             "\xE1\xB2\x86" => "\xD1\x8A", # CYRILLIC SMALL LETTER TALL HARD SIGN
739             "\xE1\xB2\x87" => "\xD1\xA3", # CYRILLIC SMALL LETTER TALL YAT
740             "\xE1\xB2\x88" => "\xEA\x99\x8B", # CYRILLIC SMALL LETTER UNBLENDED UK
741             "\xE1\xB8\x80" => "\xE1\xB8\x81", # LATIN CAPITAL LETTER A WITH RING BELOW
742             "\xE1\xB8\x82" => "\xE1\xB8\x83", # LATIN CAPITAL LETTER B WITH DOT ABOVE
743             "\xE1\xB8\x84" => "\xE1\xB8\x85", # LATIN CAPITAL LETTER B WITH DOT BELOW
744             "\xE1\xB8\x86" => "\xE1\xB8\x87", # LATIN CAPITAL LETTER B WITH LINE BELOW
745             "\xE1\xB8\x88" => "\xE1\xB8\x89", # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
746             "\xE1\xB8\x8A" => "\xE1\xB8\x8B", # LATIN CAPITAL LETTER D WITH DOT ABOVE
747             "\xE1\xB8\x8C" => "\xE1\xB8\x8D", # LATIN CAPITAL LETTER D WITH DOT BELOW
748             "\xE1\xB8\x8E" => "\xE1\xB8\x8F", # LATIN CAPITAL LETTER D WITH LINE BELOW
749             "\xE1\xB8\x90" => "\xE1\xB8\x91", # LATIN CAPITAL LETTER D WITH CEDILLA
750             "\xE1\xB8\x92" => "\xE1\xB8\x93", # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
751             "\xE1\xB8\x94" => "\xE1\xB8\x95", # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
752             "\xE1\xB8\x96" => "\xE1\xB8\x97", # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
753             "\xE1\xB8\x98" => "\xE1\xB8\x99", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
754             "\xE1\xB8\x9A" => "\xE1\xB8\x9B", # LATIN CAPITAL LETTER E WITH TILDE BELOW
755             "\xE1\xB8\x9C" => "\xE1\xB8\x9D", # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
756             "\xE1\xB8\x9E" => "\xE1\xB8\x9F", # LATIN CAPITAL LETTER F WITH DOT ABOVE
757             "\xE1\xB8\xA0" => "\xE1\xB8\xA1", # LATIN CAPITAL LETTER G WITH MACRON
758             "\xE1\xB8\xA2" => "\xE1\xB8\xA3", # LATIN CAPITAL LETTER H WITH DOT ABOVE
759             "\xE1\xB8\xA4" => "\xE1\xB8\xA5", # LATIN CAPITAL LETTER H WITH DOT BELOW
760             "\xE1\xB8\xA6" => "\xE1\xB8\xA7", # LATIN CAPITAL LETTER H WITH DIAERESIS
761             "\xE1\xB8\xA8" => "\xE1\xB8\xA9", # LATIN CAPITAL LETTER H WITH CEDILLA
762             "\xE1\xB8\xAA" => "\xE1\xB8\xAB", # LATIN CAPITAL LETTER H WITH BREVE BELOW
763             "\xE1\xB8\xAC" => "\xE1\xB8\xAD", # LATIN CAPITAL LETTER I WITH TILDE BELOW
764             "\xE1\xB8\xAE" => "\xE1\xB8\xAF", # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
765             "\xE1\xB8\xB0" => "\xE1\xB8\xB1", # LATIN CAPITAL LETTER K WITH ACUTE
766             "\xE1\xB8\xB2" => "\xE1\xB8\xB3", # LATIN CAPITAL LETTER K WITH DOT BELOW
767             "\xE1\xB8\xB4" => "\xE1\xB8\xB5", # LATIN CAPITAL LETTER K WITH LINE BELOW
768             "\xE1\xB8\xB6" => "\xE1\xB8\xB7", # LATIN CAPITAL LETTER L WITH DOT BELOW
769             "\xE1\xB8\xB8" => "\xE1\xB8\xB9", # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
770             "\xE1\xB8\xBA" => "\xE1\xB8\xBB", # LATIN CAPITAL LETTER L WITH LINE BELOW
771             "\xE1\xB8\xBC" => "\xE1\xB8\xBD", # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
772             "\xE1\xB8\xBE" => "\xE1\xB8\xBF", # LATIN CAPITAL LETTER M WITH ACUTE
773             "\xE1\xB9\x80" => "\xE1\xB9\x81", # LATIN CAPITAL LETTER M WITH DOT ABOVE
774             "\xE1\xB9\x82" => "\xE1\xB9\x83", # LATIN CAPITAL LETTER M WITH DOT BELOW
775             "\xE1\xB9\x84" => "\xE1\xB9\x85", # LATIN CAPITAL LETTER N WITH DOT ABOVE
776             "\xE1\xB9\x86" => "\xE1\xB9\x87", # LATIN CAPITAL LETTER N WITH DOT BELOW
777             "\xE1\xB9\x88" => "\xE1\xB9\x89", # LATIN CAPITAL LETTER N WITH LINE BELOW
778             "\xE1\xB9\x8A" => "\xE1\xB9\x8B", # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
779             "\xE1\xB9\x8C" => "\xE1\xB9\x8D", # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
780             "\xE1\xB9\x8E" => "\xE1\xB9\x8F", # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
781             "\xE1\xB9\x90" => "\xE1\xB9\x91", # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
782             "\xE1\xB9\x92" => "\xE1\xB9\x93", # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
783             "\xE1\xB9\x94" => "\xE1\xB9\x95", # LATIN CAPITAL LETTER P WITH ACUTE
784             "\xE1\xB9\x96" => "\xE1\xB9\x97", # LATIN CAPITAL LETTER P WITH DOT ABOVE
785             "\xE1\xB9\x98" => "\xE1\xB9\x99", # LATIN CAPITAL LETTER R WITH DOT ABOVE
786             "\xE1\xB9\x9A" => "\xE1\xB9\x9B", # LATIN CAPITAL LETTER R WITH DOT BELOW
787             "\xE1\xB9\x9C" => "\xE1\xB9\x9D", # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
788             "\xE1\xB9\x9E" => "\xE1\xB9\x9F", # LATIN CAPITAL LETTER R WITH LINE BELOW
789             "\xE1\xB9\xA0" => "\xE1\xB9\xA1", # LATIN CAPITAL LETTER S WITH DOT ABOVE
790             "\xE1\xB9\xA2" => "\xE1\xB9\xA3", # LATIN CAPITAL LETTER S WITH DOT BELOW
791             "\xE1\xB9\xA4" => "\xE1\xB9\xA5", # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
792             "\xE1\xB9\xA6" => "\xE1\xB9\xA7", # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
793             "\xE1\xB9\xA8" => "\xE1\xB9\xA9", # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
794             "\xE1\xB9\xAA" => "\xE1\xB9\xAB", # LATIN CAPITAL LETTER T WITH DOT ABOVE
795             "\xE1\xB9\xAC" => "\xE1\xB9\xAD", # LATIN CAPITAL LETTER T WITH DOT BELOW
796             "\xE1\xB9\xAE" => "\xE1\xB9\xAF", # LATIN CAPITAL LETTER T WITH LINE BELOW
797             "\xE1\xB9\xB0" => "\xE1\xB9\xB1", # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
798             "\xE1\xB9\xB2" => "\xE1\xB9\xB3", # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
799             "\xE1\xB9\xB4" => "\xE1\xB9\xB5", # LATIN CAPITAL LETTER U WITH TILDE BELOW
800             "\xE1\xB9\xB6" => "\xE1\xB9\xB7", # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
801             "\xE1\xB9\xB8" => "\xE1\xB9\xB9", # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
802             "\xE1\xB9\xBA" => "\xE1\xB9\xBB", # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
803             "\xE1\xB9\xBC" => "\xE1\xB9\xBD", # LATIN CAPITAL LETTER V WITH TILDE
804             "\xE1\xB9\xBE" => "\xE1\xB9\xBF", # LATIN CAPITAL LETTER V WITH DOT BELOW
805             "\xE1\xBA\x80" => "\xE1\xBA\x81", # LATIN CAPITAL LETTER W WITH GRAVE
806             "\xE1\xBA\x82" => "\xE1\xBA\x83", # LATIN CAPITAL LETTER W WITH ACUTE
807             "\xE1\xBA\x84" => "\xE1\xBA\x85", # LATIN CAPITAL LETTER W WITH DIAERESIS
808             "\xE1\xBA\x86" => "\xE1\xBA\x87", # LATIN CAPITAL LETTER W WITH DOT ABOVE
809             "\xE1\xBA\x88" => "\xE1\xBA\x89", # LATIN CAPITAL LETTER W WITH DOT BELOW
810             "\xE1\xBA\x8A" => "\xE1\xBA\x8B", # LATIN CAPITAL LETTER X WITH DOT ABOVE
811             "\xE1\xBA\x8C" => "\xE1\xBA\x8D", # LATIN CAPITAL LETTER X WITH DIAERESIS
812             "\xE1\xBA\x8E" => "\xE1\xBA\x8F", # LATIN CAPITAL LETTER Y WITH DOT ABOVE
813             "\xE1\xBA\x90" => "\xE1\xBA\x91", # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
814             "\xE1\xBA\x92" => "\xE1\xBA\x93", # LATIN CAPITAL LETTER Z WITH DOT BELOW
815             "\xE1\xBA\x94" => "\xE1\xBA\x95", # LATIN CAPITAL LETTER Z WITH LINE BELOW
816             "\xE1\xBA\x96" => "\x68\xCC\xB1", # LATIN SMALL LETTER H WITH LINE BELOW
817             "\xE1\xBA\x97" => "\x74\xCC\x88", # LATIN SMALL LETTER T WITH DIAERESIS
818             "\xE1\xBA\x98" => "\x77\xCC\x8A", # LATIN SMALL LETTER W WITH RING ABOVE
819             "\xE1\xBA\x99" => "\x79\xCC\x8A", # LATIN SMALL LETTER Y WITH RING ABOVE
820             "\xE1\xBA\x9A" => "\x61\xCA\xBE", # LATIN SMALL LETTER A WITH RIGHT HALF RING
821             "\xE1\xBA\x9B" => "\xE1\xB9\xA1", # LATIN SMALL LETTER LONG S WITH DOT ABOVE
822             "\xE1\xBA\x9E" => "\x73\x73", # LATIN CAPITAL LETTER SHARP S
823             "\xE1\xBA\xA0" => "\xE1\xBA\xA1", # LATIN CAPITAL LETTER A WITH DOT BELOW
824             "\xE1\xBA\xA2" => "\xE1\xBA\xA3", # LATIN CAPITAL LETTER A WITH HOOK ABOVE
825             "\xE1\xBA\xA4" => "\xE1\xBA\xA5", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
826             "\xE1\xBA\xA6" => "\xE1\xBA\xA7", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
827             "\xE1\xBA\xA8" => "\xE1\xBA\xA9", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
828             "\xE1\xBA\xAA" => "\xE1\xBA\xAB", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
829             "\xE1\xBA\xAC" => "\xE1\xBA\xAD", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
830             "\xE1\xBA\xAE" => "\xE1\xBA\xAF", # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
831             "\xE1\xBA\xB0" => "\xE1\xBA\xB1", # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
832             "\xE1\xBA\xB2" => "\xE1\xBA\xB3", # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
833             "\xE1\xBA\xB4" => "\xE1\xBA\xB5", # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
834             "\xE1\xBA\xB6" => "\xE1\xBA\xB7", # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
835             "\xE1\xBA\xB8" => "\xE1\xBA\xB9", # LATIN CAPITAL LETTER E WITH DOT BELOW
836             "\xE1\xBA\xBA" => "\xE1\xBA\xBB", # LATIN CAPITAL LETTER E WITH HOOK ABOVE
837             "\xE1\xBA\xBC" => "\xE1\xBA\xBD", # LATIN CAPITAL LETTER E WITH TILDE
838             "\xE1\xBA\xBE" => "\xE1\xBA\xBF", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
839             "\xE1\xBB\x80" => "\xE1\xBB\x81", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
840             "\xE1\xBB\x82" => "\xE1\xBB\x83", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
841             "\xE1\xBB\x84" => "\xE1\xBB\x85", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
842             "\xE1\xBB\x86" => "\xE1\xBB\x87", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
843             "\xE1\xBB\x88" => "\xE1\xBB\x89", # LATIN CAPITAL LETTER I WITH HOOK ABOVE
844             "\xE1\xBB\x8A" => "\xE1\xBB\x8B", # LATIN CAPITAL LETTER I WITH DOT BELOW
845             "\xE1\xBB\x8C" => "\xE1\xBB\x8D", # LATIN CAPITAL LETTER O WITH DOT BELOW
846             "\xE1\xBB\x8E" => "\xE1\xBB\x8F", # LATIN CAPITAL LETTER O WITH HOOK ABOVE
847             "\xE1\xBB\x90" => "\xE1\xBB\x91", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
848             "\xE1\xBB\x92" => "\xE1\xBB\x93", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
849             "\xE1\xBB\x94" => "\xE1\xBB\x95", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
850             "\xE1\xBB\x96" => "\xE1\xBB\x97", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
851             "\xE1\xBB\x98" => "\xE1\xBB\x99", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
852             "\xE1\xBB\x9A" => "\xE1\xBB\x9B", # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
853             "\xE1\xBB\x9C" => "\xE1\xBB\x9D", # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
854             "\xE1\xBB\x9E" => "\xE1\xBB\x9F", # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
855             "\xE1\xBB\xA0" => "\xE1\xBB\xA1", # LATIN CAPITAL LETTER O WITH HORN AND TILDE
856             "\xE1\xBB\xA2" => "\xE1\xBB\xA3", # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
857             "\xE1\xBB\xA4" => "\xE1\xBB\xA5", # LATIN CAPITAL LETTER U WITH DOT BELOW
858             "\xE1\xBB\xA6" => "\xE1\xBB\xA7", # LATIN CAPITAL LETTER U WITH HOOK ABOVE
859             "\xE1\xBB\xA8" => "\xE1\xBB\xA9", # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
860             "\xE1\xBB\xAA" => "\xE1\xBB\xAB", # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
861             "\xE1\xBB\xAC" => "\xE1\xBB\xAD", # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
862             "\xE1\xBB\xAE" => "\xE1\xBB\xAF", # LATIN CAPITAL LETTER U WITH HORN AND TILDE
863             "\xE1\xBB\xB0" => "\xE1\xBB\xB1", # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
864             "\xE1\xBB\xB2" => "\xE1\xBB\xB3", # LATIN CAPITAL LETTER Y WITH GRAVE
865             "\xE1\xBB\xB4" => "\xE1\xBB\xB5", # LATIN CAPITAL LETTER Y WITH DOT BELOW
866             "\xE1\xBB\xB6" => "\xE1\xBB\xB7", # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
867             "\xE1\xBB\xB8" => "\xE1\xBB\xB9", # LATIN CAPITAL LETTER Y WITH TILDE
868             "\xE1\xBB\xBA" => "\xE1\xBB\xBB", # LATIN CAPITAL LETTER MIDDLE-WELSH LL
869             "\xE1\xBB\xBC" => "\xE1\xBB\xBD", # LATIN CAPITAL LETTER MIDDLE-WELSH V
870             "\xE1\xBB\xBE" => "\xE1\xBB\xBF", # LATIN CAPITAL LETTER Y WITH LOOP
871             "\xE1\xBC\x88" => "\xE1\xBC\x80", # GREEK CAPITAL LETTER ALPHA WITH PSILI
872             "\xE1\xBC\x89" => "\xE1\xBC\x81", # GREEK CAPITAL LETTER ALPHA WITH DASIA
873             "\xE1\xBC\x8A" => "\xE1\xBC\x82", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
874             "\xE1\xBC\x8B" => "\xE1\xBC\x83", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
875             "\xE1\xBC\x8C" => "\xE1\xBC\x84", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
876             "\xE1\xBC\x8D" => "\xE1\xBC\x85", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
877             "\xE1\xBC\x8E" => "\xE1\xBC\x86", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
878             "\xE1\xBC\x8F" => "\xE1\xBC\x87", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
879             "\xE1\xBC\x98" => "\xE1\xBC\x90", # GREEK CAPITAL LETTER EPSILON WITH PSILI
880             "\xE1\xBC\x99" => "\xE1\xBC\x91", # GREEK CAPITAL LETTER EPSILON WITH DASIA
881             "\xE1\xBC\x9A" => "\xE1\xBC\x92", # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
882             "\xE1\xBC\x9B" => "\xE1\xBC\x93", # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
883             "\xE1\xBC\x9C" => "\xE1\xBC\x94", # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
884             "\xE1\xBC\x9D" => "\xE1\xBC\x95", # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
885             "\xE1\xBC\xA8" => "\xE1\xBC\xA0", # GREEK CAPITAL LETTER ETA WITH PSILI
886             "\xE1\xBC\xA9" => "\xE1\xBC\xA1", # GREEK CAPITAL LETTER ETA WITH DASIA
887             "\xE1\xBC\xAA" => "\xE1\xBC\xA2", # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
888             "\xE1\xBC\xAB" => "\xE1\xBC\xA3", # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
889             "\xE1\xBC\xAC" => "\xE1\xBC\xA4", # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
890             "\xE1\xBC\xAD" => "\xE1\xBC\xA5", # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
891             "\xE1\xBC\xAE" => "\xE1\xBC\xA6", # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
892             "\xE1\xBC\xAF" => "\xE1\xBC\xA7", # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
893             "\xE1\xBC\xB8" => "\xE1\xBC\xB0", # GREEK CAPITAL LETTER IOTA WITH PSILI
894             "\xE1\xBC\xB9" => "\xE1\xBC\xB1", # GREEK CAPITAL LETTER IOTA WITH DASIA
895             "\xE1\xBC\xBA" => "\xE1\xBC\xB2", # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
896             "\xE1\xBC\xBB" => "\xE1\xBC\xB3", # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
897             "\xE1\xBC\xBC" => "\xE1\xBC\xB4", # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
898             "\xE1\xBC\xBD" => "\xE1\xBC\xB5", # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
899             "\xE1\xBC\xBE" => "\xE1\xBC\xB6", # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
900             "\xE1\xBC\xBF" => "\xE1\xBC\xB7", # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
901             "\xE1\xBD\x88" => "\xE1\xBD\x80", # GREEK CAPITAL LETTER OMICRON WITH PSILI
902             "\xE1\xBD\x89" => "\xE1\xBD\x81", # GREEK CAPITAL LETTER OMICRON WITH DASIA
903             "\xE1\xBD\x8A" => "\xE1\xBD\x82", # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
904             "\xE1\xBD\x8B" => "\xE1\xBD\x83", # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
905             "\xE1\xBD\x8C" => "\xE1\xBD\x84", # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
906             "\xE1\xBD\x8D" => "\xE1\xBD\x85", # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
907             "\xE1\xBD\x90" => "\xCF\x85\xCC\x93", # GREEK SMALL LETTER UPSILON WITH PSILI
908             "\xE1\xBD\x92" => "\xCF\x85\xCC\x93\xCC\x80", # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
909             "\xE1\xBD\x94" => "\xCF\x85\xCC\x93\xCC\x81", # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
910             "\xE1\xBD\x96" => "\xCF\x85\xCC\x93\xCD\x82", # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
911             "\xE1\xBD\x99" => "\xE1\xBD\x91", # GREEK CAPITAL LETTER UPSILON WITH DASIA
912             "\xE1\xBD\x9B" => "\xE1\xBD\x93", # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
913             "\xE1\xBD\x9D" => "\xE1\xBD\x95", # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
914             "\xE1\xBD\x9F" => "\xE1\xBD\x97", # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
915             "\xE1\xBD\xA8" => "\xE1\xBD\xA0", # GREEK CAPITAL LETTER OMEGA WITH PSILI
916             "\xE1\xBD\xA9" => "\xE1\xBD\xA1", # GREEK CAPITAL LETTER OMEGA WITH DASIA
917             "\xE1\xBD\xAA" => "\xE1\xBD\xA2", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
918             "\xE1\xBD\xAB" => "\xE1\xBD\xA3", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
919             "\xE1\xBD\xAC" => "\xE1\xBD\xA4", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
920             "\xE1\xBD\xAD" => "\xE1\xBD\xA5", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
921             "\xE1\xBD\xAE" => "\xE1\xBD\xA6", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
922             "\xE1\xBD\xAF" => "\xE1\xBD\xA7", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
923             "\xE1\xBE\x80" => "\xE1\xBC\x80\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
924             "\xE1\xBE\x81" => "\xE1\xBC\x81\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
925             "\xE1\xBE\x82" => "\xE1\xBC\x82\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
926             "\xE1\xBE\x83" => "\xE1\xBC\x83\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
927             "\xE1\xBE\x84" => "\xE1\xBC\x84\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
928             "\xE1\xBE\x85" => "\xE1\xBC\x85\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
929             "\xE1\xBE\x86" => "\xE1\xBC\x86\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
930             "\xE1\xBE\x87" => "\xE1\xBC\x87\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
931             "\xE1\xBE\x88" => "\xE1\xBC\x80\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
932             "\xE1\xBE\x89" => "\xE1\xBC\x81\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
933             "\xE1\xBE\x8A" => "\xE1\xBC\x82\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
934             "\xE1\xBE\x8B" => "\xE1\xBC\x83\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
935             "\xE1\xBE\x8C" => "\xE1\xBC\x84\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
936             "\xE1\xBE\x8D" => "\xE1\xBC\x85\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
937             "\xE1\xBE\x8E" => "\xE1\xBC\x86\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
938             "\xE1\xBE\x8F" => "\xE1\xBC\x87\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
939             "\xE1\xBE\x90" => "\xE1\xBC\xA0\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
940             "\xE1\xBE\x91" => "\xE1\xBC\xA1\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
941             "\xE1\xBE\x92" => "\xE1\xBC\xA2\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
942             "\xE1\xBE\x93" => "\xE1\xBC\xA3\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
943             "\xE1\xBE\x94" => "\xE1\xBC\xA4\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
944             "\xE1\xBE\x95" => "\xE1\xBC\xA5\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
945             "\xE1\xBE\x96" => "\xE1\xBC\xA6\xCE\xB9", # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
946             "\xE1\xBE\x97" => "\xE1\xBC\xA7\xCE\xB9", # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
947             "\xE1\xBE\x98" => "\xE1\xBC\xA0\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
948             "\xE1\xBE\x99" => "\xE1\xBC\xA1\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
949             "\xE1\xBE\x9A" => "\xE1\xBC\xA2\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
950             "\xE1\xBE\x9B" => "\xE1\xBC\xA3\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
951             "\xE1\xBE\x9C" => "\xE1\xBC\xA4\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
952             "\xE1\xBE\x9D" => "\xE1\xBC\xA5\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
953             "\xE1\xBE\x9E" => "\xE1\xBC\xA6\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
954             "\xE1\xBE\x9F" => "\xE1\xBC\xA7\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
955             "\xE1\xBE\xA0" => "\xE1\xBD\xA0\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
956             "\xE1\xBE\xA1" => "\xE1\xBD\xA1\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
957             "\xE1\xBE\xA2" => "\xE1\xBD\xA2\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
958             "\xE1\xBE\xA3" => "\xE1\xBD\xA3\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
959             "\xE1\xBE\xA4" => "\xE1\xBD\xA4\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
960             "\xE1\xBE\xA5" => "\xE1\xBD\xA5\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
961             "\xE1\xBE\xA6" => "\xE1\xBD\xA6\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
962             "\xE1\xBE\xA7" => "\xE1\xBD\xA7\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
963             "\xE1\xBE\xA8" => "\xE1\xBD\xA0\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
964             "\xE1\xBE\xA9" => "\xE1\xBD\xA1\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
965             "\xE1\xBE\xAA" => "\xE1\xBD\xA2\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
966             "\xE1\xBE\xAB" => "\xE1\xBD\xA3\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
967             "\xE1\xBE\xAC" => "\xE1\xBD\xA4\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
968             "\xE1\xBE\xAD" => "\xE1\xBD\xA5\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
969             "\xE1\xBE\xAE" => "\xE1\xBD\xA6\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
970             "\xE1\xBE\xAF" => "\xE1\xBD\xA7\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
971             "\xE1\xBE\xB2" => "\xE1\xBD\xB0\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
972             "\xE1\xBE\xB3" => "\xCE\xB1\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
973             "\xE1\xBE\xB4" => "\xCE\xAC\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
974             "\xE1\xBE\xB6" => "\xCE\xB1\xCD\x82", # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
975             "\xE1\xBE\xB7" => "\xCE\xB1\xCD\x82\xCE\xB9", # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
976             "\xE1\xBE\xB8" => "\xE1\xBE\xB0", # GREEK CAPITAL LETTER ALPHA WITH VRACHY
977             "\xE1\xBE\xB9" => "\xE1\xBE\xB1", # GREEK CAPITAL LETTER ALPHA WITH MACRON
978             "\xE1\xBE\xBA" => "\xE1\xBD\xB0", # GREEK CAPITAL LETTER ALPHA WITH VARIA
979             "\xE1\xBE\xBB" => "\xE1\xBD\xB1", # GREEK CAPITAL LETTER ALPHA WITH OXIA
980             "\xE1\xBE\xBC" => "\xCE\xB1\xCE\xB9", # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
981             "\xE1\xBE\xBE" => "\xCE\xB9", # GREEK PROSGEGRAMMENI
982             "\xE1\xBF\x82" => "\xE1\xBD\xB4\xCE\xB9", # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
983             "\xE1\xBF\x83" => "\xCE\xB7\xCE\xB9", # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
984             "\xE1\xBF\x84" => "\xCE\xAE\xCE\xB9", # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
985             "\xE1\xBF\x86" => "\xCE\xB7\xCD\x82", # GREEK SMALL LETTER ETA WITH PERISPOMENI
986             "\xE1\xBF\x87" => "\xCE\xB7\xCD\x82\xCE\xB9", # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
987             "\xE1\xBF\x88" => "\xE1\xBD\xB2", # GREEK CAPITAL LETTER EPSILON WITH VARIA
988             "\xE1\xBF\x89" => "\xE1\xBD\xB3", # GREEK CAPITAL LETTER EPSILON WITH OXIA
989             "\xE1\xBF\x8A" => "\xE1\xBD\xB4", # GREEK CAPITAL LETTER ETA WITH VARIA
990             "\xE1\xBF\x8B" => "\xE1\xBD\xB5", # GREEK CAPITAL LETTER ETA WITH OXIA
991             "\xE1\xBF\x8C" => "\xCE\xB7\xCE\xB9", # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
992             "\xE1\xBF\x92" => "\xCE\xB9\xCC\x88\xCC\x80", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
993             "\xE1\xBF\x93" => "\xCE\xB9\xCC\x88\xCC\x81", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
994             "\xE1\xBF\x96" => "\xCE\xB9\xCD\x82", # GREEK SMALL LETTER IOTA WITH PERISPOMENI
995             "\xE1\xBF\x97" => "\xCE\xB9\xCC\x88\xCD\x82", # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
996             "\xE1\xBF\x98" => "\xE1\xBF\x90", # GREEK CAPITAL LETTER IOTA WITH VRACHY
997             "\xE1\xBF\x99" => "\xE1\xBF\x91", # GREEK CAPITAL LETTER IOTA WITH MACRON
998             "\xE1\xBF\x9A" => "\xE1\xBD\xB6", # GREEK CAPITAL LETTER IOTA WITH VARIA
999             "\xE1\xBF\x9B" => "\xE1\xBD\xB7", # GREEK CAPITAL LETTER IOTA WITH OXIA
1000             "\xE1\xBF\xA2" => "\xCF\x85\xCC\x88\xCC\x80", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
1001             "\xE1\xBF\xA3" => "\xCF\x85\xCC\x88\xCC\x81", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
1002             "\xE1\xBF\xA4" => "\xCF\x81\xCC\x93", # GREEK SMALL LETTER RHO WITH PSILI
1003             "\xE1\xBF\xA6" => "\xCF\x85\xCD\x82", # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
1004             "\xE1\xBF\xA7" => "\xCF\x85\xCC\x88\xCD\x82", # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
1005             "\xE1\xBF\xA8" => "\xE1\xBF\xA0", # GREEK CAPITAL LETTER UPSILON WITH VRACHY
1006             "\xE1\xBF\xA9" => "\xE1\xBF\xA1", # GREEK CAPITAL LETTER UPSILON WITH MACRON
1007             "\xE1\xBF\xAA" => "\xE1\xBD\xBA", # GREEK CAPITAL LETTER UPSILON WITH VARIA
1008             "\xE1\xBF\xAB" => "\xE1\xBD\xBB", # GREEK CAPITAL LETTER UPSILON WITH OXIA
1009             "\xE1\xBF\xAC" => "\xE1\xBF\xA5", # GREEK CAPITAL LETTER RHO WITH DASIA
1010             "\xE1\xBF\xB2" => "\xE1\xBD\xBC\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
1011             "\xE1\xBF\xB3" => "\xCF\x89\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
1012             "\xE1\xBF\xB4" => "\xCF\x8E\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
1013             "\xE1\xBF\xB6" => "\xCF\x89\xCD\x82", # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
1014             "\xE1\xBF\xB7" => "\xCF\x89\xCD\x82\xCE\xB9", # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
1015             "\xE1\xBF\xB8" => "\xE1\xBD\xB8", # GREEK CAPITAL LETTER OMICRON WITH VARIA
1016             "\xE1\xBF\xB9" => "\xE1\xBD\xB9", # GREEK CAPITAL LETTER OMICRON WITH OXIA
1017             "\xE1\xBF\xBA" => "\xE1\xBD\xBC", # GREEK CAPITAL LETTER OMEGA WITH VARIA
1018             "\xE1\xBF\xBB" => "\xE1\xBD\xBD", # GREEK CAPITAL LETTER OMEGA WITH OXIA
1019             "\xE1\xBF\xBC" => "\xCF\x89\xCE\xB9", # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
1020             "\xE2\x84\xA6" => "\xCF\x89", # OHM SIGN
1021             "\xE2\x84\xAA" => "\x6B", # KELVIN SIGN
1022             "\xE2\x84\xAB" => "\xC3\xA5", # ANGSTROM SIGN
1023             "\xE2\x84\xB2" => "\xE2\x85\x8E", # TURNED CAPITAL F
1024             "\xE2\x85\xA0" => "\xE2\x85\xB0", # ROMAN NUMERAL ONE
1025             "\xE2\x85\xA1" => "\xE2\x85\xB1", # ROMAN NUMERAL TWO
1026             "\xE2\x85\xA2" => "\xE2\x85\xB2", # ROMAN NUMERAL THREE
1027             "\xE2\x85\xA3" => "\xE2\x85\xB3", # ROMAN NUMERAL FOUR
1028             "\xE2\x85\xA4" => "\xE2\x85\xB4", # ROMAN NUMERAL FIVE
1029             "\xE2\x85\xA5" => "\xE2\x85\xB5", # ROMAN NUMERAL SIX
1030             "\xE2\x85\xA6" => "\xE2\x85\xB6", # ROMAN NUMERAL SEVEN
1031             "\xE2\x85\xA7" => "\xE2\x85\xB7", # ROMAN NUMERAL EIGHT
1032             "\xE2\x85\xA8" => "\xE2\x85\xB8", # ROMAN NUMERAL NINE
1033             "\xE2\x85\xA9" => "\xE2\x85\xB9", # ROMAN NUMERAL TEN
1034             "\xE2\x85\xAA" => "\xE2\x85\xBA", # ROMAN NUMERAL ELEVEN
1035             "\xE2\x85\xAB" => "\xE2\x85\xBB", # ROMAN NUMERAL TWELVE
1036             "\xE2\x85\xAC" => "\xE2\x85\xBC", # ROMAN NUMERAL FIFTY
1037             "\xE2\x85\xAD" => "\xE2\x85\xBD", # ROMAN NUMERAL ONE HUNDRED
1038             "\xE2\x85\xAE" => "\xE2\x85\xBE", # ROMAN NUMERAL FIVE HUNDRED
1039             "\xE2\x85\xAF" => "\xE2\x85\xBF", # ROMAN NUMERAL ONE THOUSAND
1040             "\xE2\x86\x83" => "\xE2\x86\x84", # ROMAN NUMERAL REVERSED ONE HUNDRED
1041             "\xE2\x92\xB6" => "\xE2\x93\x90", # CIRCLED LATIN CAPITAL LETTER A
1042             "\xE2\x92\xB7" => "\xE2\x93\x91", # CIRCLED LATIN CAPITAL LETTER B
1043             "\xE2\x92\xB8" => "\xE2\x93\x92", # CIRCLED LATIN CAPITAL LETTER C
1044             "\xE2\x92\xB9" => "\xE2\x93\x93", # CIRCLED LATIN CAPITAL LETTER D
1045             "\xE2\x92\xBA" => "\xE2\x93\x94", # CIRCLED LATIN CAPITAL LETTER E
1046             "\xE2\x92\xBB" => "\xE2\x93\x95", # CIRCLED LATIN CAPITAL LETTER F
1047             "\xE2\x92\xBC" => "\xE2\x93\x96", # CIRCLED LATIN CAPITAL LETTER G
1048             "\xE2\x92\xBD" => "\xE2\x93\x97", # CIRCLED LATIN CAPITAL LETTER H
1049             "\xE2\x92\xBE" => "\xE2\x93\x98", # CIRCLED LATIN CAPITAL LETTER I
1050             "\xE2\x92\xBF" => "\xE2\x93\x99", # CIRCLED LATIN CAPITAL LETTER J
1051             "\xE2\x93\x80" => "\xE2\x93\x9A", # CIRCLED LATIN CAPITAL LETTER K
1052             "\xE2\x93\x81" => "\xE2\x93\x9B", # CIRCLED LATIN CAPITAL LETTER L
1053             "\xE2\x93\x82" => "\xE2\x93\x9C", # CIRCLED LATIN CAPITAL LETTER M
1054             "\xE2\x93\x83" => "\xE2\x93\x9D", # CIRCLED LATIN CAPITAL LETTER N
1055             "\xE2\x93\x84" => "\xE2\x93\x9E", # CIRCLED LATIN CAPITAL LETTER O
1056             "\xE2\x93\x85" => "\xE2\x93\x9F", # CIRCLED LATIN CAPITAL LETTER P
1057             "\xE2\x93\x86" => "\xE2\x93\xA0", # CIRCLED LATIN CAPITAL LETTER Q
1058             "\xE2\x93\x87" => "\xE2\x93\xA1", # CIRCLED LATIN CAPITAL LETTER R
1059             "\xE2\x93\x88" => "\xE2\x93\xA2", # CIRCLED LATIN CAPITAL LETTER S
1060             "\xE2\x93\x89" => "\xE2\x93\xA3", # CIRCLED LATIN CAPITAL LETTER T
1061             "\xE2\x93\x8A" => "\xE2\x93\xA4", # CIRCLED LATIN CAPITAL LETTER U
1062             "\xE2\x93\x8B" => "\xE2\x93\xA5", # CIRCLED LATIN CAPITAL LETTER V
1063             "\xE2\x93\x8C" => "\xE2\x93\xA6", # CIRCLED LATIN CAPITAL LETTER W
1064             "\xE2\x93\x8D" => "\xE2\x93\xA7", # CIRCLED LATIN CAPITAL LETTER X
1065             "\xE2\x93\x8E" => "\xE2\x93\xA8", # CIRCLED LATIN CAPITAL LETTER Y
1066             "\xE2\x93\x8F" => "\xE2\x93\xA9", # CIRCLED LATIN CAPITAL LETTER Z
1067             "\xE2\xB0\x80" => "\xE2\xB0\xB0", # GLAGOLITIC CAPITAL LETTER AZU
1068             "\xE2\xB0\x81" => "\xE2\xB0\xB1", # GLAGOLITIC CAPITAL LETTER BUKY
1069             "\xE2\xB0\x82" => "\xE2\xB0\xB2", # GLAGOLITIC CAPITAL LETTER VEDE
1070             "\xE2\xB0\x83" => "\xE2\xB0\xB3", # GLAGOLITIC CAPITAL LETTER GLAGOLI
1071             "\xE2\xB0\x84" => "\xE2\xB0\xB4", # GLAGOLITIC CAPITAL LETTER DOBRO
1072             "\xE2\xB0\x85" => "\xE2\xB0\xB5", # GLAGOLITIC CAPITAL LETTER YESTU
1073             "\xE2\xB0\x86" => "\xE2\xB0\xB6", # GLAGOLITIC CAPITAL LETTER ZHIVETE
1074             "\xE2\xB0\x87" => "\xE2\xB0\xB7", # GLAGOLITIC CAPITAL LETTER DZELO
1075             "\xE2\xB0\x88" => "\xE2\xB0\xB8", # GLAGOLITIC CAPITAL LETTER ZEMLJA
1076             "\xE2\xB0\x89" => "\xE2\xB0\xB9", # GLAGOLITIC CAPITAL LETTER IZHE
1077             "\xE2\xB0\x8A" => "\xE2\xB0\xBA", # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
1078             "\xE2\xB0\x8B" => "\xE2\xB0\xBB", # GLAGOLITIC CAPITAL LETTER I
1079             "\xE2\xB0\x8C" => "\xE2\xB0\xBC", # GLAGOLITIC CAPITAL LETTER DJERVI
1080             "\xE2\xB0\x8D" => "\xE2\xB0\xBD", # GLAGOLITIC CAPITAL LETTER KAKO
1081             "\xE2\xB0\x8E" => "\xE2\xB0\xBE", # GLAGOLITIC CAPITAL LETTER LJUDIJE
1082             "\xE2\xB0\x8F" => "\xE2\xB0\xBF", # GLAGOLITIC CAPITAL LETTER MYSLITE
1083             "\xE2\xB0\x90" => "\xE2\xB1\x80", # GLAGOLITIC CAPITAL LETTER NASHI
1084             "\xE2\xB0\x91" => "\xE2\xB1\x81", # GLAGOLITIC CAPITAL LETTER ONU
1085             "\xE2\xB0\x92" => "\xE2\xB1\x82", # GLAGOLITIC CAPITAL LETTER POKOJI
1086             "\xE2\xB0\x93" => "\xE2\xB1\x83", # GLAGOLITIC CAPITAL LETTER RITSI
1087             "\xE2\xB0\x94" => "\xE2\xB1\x84", # GLAGOLITIC CAPITAL LETTER SLOVO
1088             "\xE2\xB0\x95" => "\xE2\xB1\x85", # GLAGOLITIC CAPITAL LETTER TVRIDO
1089             "\xE2\xB0\x96" => "\xE2\xB1\x86", # GLAGOLITIC CAPITAL LETTER UKU
1090             "\xE2\xB0\x97" => "\xE2\xB1\x87", # GLAGOLITIC CAPITAL LETTER FRITU
1091             "\xE2\xB0\x98" => "\xE2\xB1\x88", # GLAGOLITIC CAPITAL LETTER HERU
1092             "\xE2\xB0\x99" => "\xE2\xB1\x89", # GLAGOLITIC CAPITAL LETTER OTU
1093             "\xE2\xB0\x9A" => "\xE2\xB1\x8A", # GLAGOLITIC CAPITAL LETTER PE
1094             "\xE2\xB0\x9B" => "\xE2\xB1\x8B", # GLAGOLITIC CAPITAL LETTER SHTA
1095             "\xE2\xB0\x9C" => "\xE2\xB1\x8C", # GLAGOLITIC CAPITAL LETTER TSI
1096             "\xE2\xB0\x9D" => "\xE2\xB1\x8D", # GLAGOLITIC CAPITAL LETTER CHRIVI
1097             "\xE2\xB0\x9E" => "\xE2\xB1\x8E", # GLAGOLITIC CAPITAL LETTER SHA
1098             "\xE2\xB0\x9F" => "\xE2\xB1\x8F", # GLAGOLITIC CAPITAL LETTER YERU
1099             "\xE2\xB0\xA0" => "\xE2\xB1\x90", # GLAGOLITIC CAPITAL LETTER YERI
1100             "\xE2\xB0\xA1" => "\xE2\xB1\x91", # GLAGOLITIC CAPITAL LETTER YATI
1101             "\xE2\xB0\xA2" => "\xE2\xB1\x92", # GLAGOLITIC CAPITAL LETTER SPIDERY HA
1102             "\xE2\xB0\xA3" => "\xE2\xB1\x93", # GLAGOLITIC CAPITAL LETTER YU
1103             "\xE2\xB0\xA4" => "\xE2\xB1\x94", # GLAGOLITIC CAPITAL LETTER SMALL YUS
1104             "\xE2\xB0\xA5" => "\xE2\xB1\x95", # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
1105             "\xE2\xB0\xA6" => "\xE2\xB1\x96", # GLAGOLITIC CAPITAL LETTER YO
1106             "\xE2\xB0\xA7" => "\xE2\xB1\x97", # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
1107             "\xE2\xB0\xA8" => "\xE2\xB1\x98", # GLAGOLITIC CAPITAL LETTER BIG YUS
1108             "\xE2\xB0\xA9" => "\xE2\xB1\x99", # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
1109             "\xE2\xB0\xAA" => "\xE2\xB1\x9A", # GLAGOLITIC CAPITAL LETTER FITA
1110             "\xE2\xB0\xAB" => "\xE2\xB1\x9B", # GLAGOLITIC CAPITAL LETTER IZHITSA
1111             "\xE2\xB0\xAC" => "\xE2\xB1\x9C", # GLAGOLITIC CAPITAL LETTER SHTAPIC
1112             "\xE2\xB0\xAD" => "\xE2\xB1\x9D", # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
1113             "\xE2\xB0\xAE" => "\xE2\xB1\x9E", # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
1114             "\xE2\xB1\xA0" => "\xE2\xB1\xA1", # LATIN CAPITAL LETTER L WITH DOUBLE BAR
1115             "\xE2\xB1\xA2" => "\xC9\xAB", # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
1116             "\xE2\xB1\xA3" => "\xE1\xB5\xBD", # LATIN CAPITAL LETTER P WITH STROKE
1117             "\xE2\xB1\xA4" => "\xC9\xBD", # LATIN CAPITAL LETTER R WITH TAIL
1118             "\xE2\xB1\xA7" => "\xE2\xB1\xA8", # LATIN CAPITAL LETTER H WITH DESCENDER
1119             "\xE2\xB1\xA9" => "\xE2\xB1\xAA", # LATIN CAPITAL LETTER K WITH DESCENDER
1120             "\xE2\xB1\xAB" => "\xE2\xB1\xAC", # LATIN CAPITAL LETTER Z WITH DESCENDER
1121             "\xE2\xB1\xAD" => "\xC9\x91", # LATIN CAPITAL LETTER ALPHA
1122             "\xE2\xB1\xAE" => "\xC9\xB1", # LATIN CAPITAL LETTER M WITH HOOK
1123             "\xE2\xB1\xAF" => "\xC9\x90", # LATIN CAPITAL LETTER TURNED A
1124             "\xE2\xB1\xB0" => "\xC9\x92", # LATIN CAPITAL LETTER TURNED ALPHA
1125             "\xE2\xB1\xB2" => "\xE2\xB1\xB3", # LATIN CAPITAL LETTER W WITH HOOK
1126             "\xE2\xB1\xB5" => "\xE2\xB1\xB6", # LATIN CAPITAL LETTER HALF H
1127             "\xE2\xB1\xBE" => "\xC8\xBF", # LATIN CAPITAL LETTER S WITH SWASH TAIL
1128             "\xE2\xB1\xBF" => "\xC9\x80", # LATIN CAPITAL LETTER Z WITH SWASH TAIL
1129             "\xE2\xB2\x80" => "\xE2\xB2\x81", # COPTIC CAPITAL LETTER ALFA
1130             "\xE2\xB2\x82" => "\xE2\xB2\x83", # COPTIC CAPITAL LETTER VIDA
1131             "\xE2\xB2\x84" => "\xE2\xB2\x85", # COPTIC CAPITAL LETTER GAMMA
1132             "\xE2\xB2\x86" => "\xE2\xB2\x87", # COPTIC CAPITAL LETTER DALDA
1133             "\xE2\xB2\x88" => "\xE2\xB2\x89", # COPTIC CAPITAL LETTER EIE
1134             "\xE2\xB2\x8A" => "\xE2\xB2\x8B", # COPTIC CAPITAL LETTER SOU
1135             "\xE2\xB2\x8C" => "\xE2\xB2\x8D", # COPTIC CAPITAL LETTER ZATA
1136             "\xE2\xB2\x8E" => "\xE2\xB2\x8F", # COPTIC CAPITAL LETTER HATE
1137             "\xE2\xB2\x90" => "\xE2\xB2\x91", # COPTIC CAPITAL LETTER THETHE
1138             "\xE2\xB2\x92" => "\xE2\xB2\x93", # COPTIC CAPITAL LETTER IAUDA
1139             "\xE2\xB2\x94" => "\xE2\xB2\x95", # COPTIC CAPITAL LETTER KAPA
1140             "\xE2\xB2\x96" => "\xE2\xB2\x97", # COPTIC CAPITAL LETTER LAULA
1141             "\xE2\xB2\x98" => "\xE2\xB2\x99", # COPTIC CAPITAL LETTER MI
1142             "\xE2\xB2\x9A" => "\xE2\xB2\x9B", # COPTIC CAPITAL LETTER NI
1143             "\xE2\xB2\x9C" => "\xE2\xB2\x9D", # COPTIC CAPITAL LETTER KSI
1144             "\xE2\xB2\x9E" => "\xE2\xB2\x9F", # COPTIC CAPITAL LETTER O
1145             "\xE2\xB2\xA0" => "\xE2\xB2\xA1", # COPTIC CAPITAL LETTER PI
1146             "\xE2\xB2\xA2" => "\xE2\xB2\xA3", # COPTIC CAPITAL LETTER RO
1147             "\xE2\xB2\xA4" => "\xE2\xB2\xA5", # COPTIC CAPITAL LETTER SIMA
1148             "\xE2\xB2\xA6" => "\xE2\xB2\xA7", # COPTIC CAPITAL LETTER TAU
1149             "\xE2\xB2\xA8" => "\xE2\xB2\xA9", # COPTIC CAPITAL LETTER UA
1150             "\xE2\xB2\xAA" => "\xE2\xB2\xAB", # COPTIC CAPITAL LETTER FI
1151             "\xE2\xB2\xAC" => "\xE2\xB2\xAD", # COPTIC CAPITAL LETTER KHI
1152             "\xE2\xB2\xAE" => "\xE2\xB2\xAF", # COPTIC CAPITAL LETTER PSI
1153             "\xE2\xB2\xB0" => "\xE2\xB2\xB1", # COPTIC CAPITAL LETTER OOU
1154             "\xE2\xB2\xB2" => "\xE2\xB2\xB3", # COPTIC CAPITAL LETTER DIALECT-P ALEF
1155             "\xE2\xB2\xB4" => "\xE2\xB2\xB5", # COPTIC CAPITAL LETTER OLD COPTIC AIN
1156             "\xE2\xB2\xB6" => "\xE2\xB2\xB7", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
1157             "\xE2\xB2\xB8" => "\xE2\xB2\xB9", # COPTIC CAPITAL LETTER DIALECT-P KAPA
1158             "\xE2\xB2\xBA" => "\xE2\xB2\xBB", # COPTIC CAPITAL LETTER DIALECT-P NI
1159             "\xE2\xB2\xBC" => "\xE2\xB2\xBD", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
1160             "\xE2\xB2\xBE" => "\xE2\xB2\xBF", # COPTIC CAPITAL LETTER OLD COPTIC OOU
1161             "\xE2\xB3\x80" => "\xE2\xB3\x81", # COPTIC CAPITAL LETTER SAMPI
1162             "\xE2\xB3\x82" => "\xE2\xB3\x83", # COPTIC CAPITAL LETTER CROSSED SHEI
1163             "\xE2\xB3\x84" => "\xE2\xB3\x85", # COPTIC CAPITAL LETTER OLD COPTIC SHEI
1164             "\xE2\xB3\x86" => "\xE2\xB3\x87", # COPTIC CAPITAL LETTER OLD COPTIC ESH
1165             "\xE2\xB3\x88" => "\xE2\xB3\x89", # COPTIC CAPITAL LETTER AKHMIMIC KHEI
1166             "\xE2\xB3\x8A" => "\xE2\xB3\x8B", # COPTIC CAPITAL LETTER DIALECT-P HORI
1167             "\xE2\xB3\x8C" => "\xE2\xB3\x8D", # COPTIC CAPITAL LETTER OLD COPTIC HORI
1168             "\xE2\xB3\x8E" => "\xE2\xB3\x8F", # COPTIC CAPITAL LETTER OLD COPTIC HA
1169             "\xE2\xB3\x90" => "\xE2\xB3\x91", # COPTIC CAPITAL LETTER L-SHAPED HA
1170             "\xE2\xB3\x92" => "\xE2\xB3\x93", # COPTIC CAPITAL LETTER OLD COPTIC HEI
1171             "\xE2\xB3\x94" => "\xE2\xB3\x95", # COPTIC CAPITAL LETTER OLD COPTIC HAT
1172             "\xE2\xB3\x96" => "\xE2\xB3\x97", # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
1173             "\xE2\xB3\x98" => "\xE2\xB3\x99", # COPTIC CAPITAL LETTER OLD COPTIC DJA
1174             "\xE2\xB3\x9A" => "\xE2\xB3\x9B", # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
1175             "\xE2\xB3\x9C" => "\xE2\xB3\x9D", # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
1176             "\xE2\xB3\x9E" => "\xE2\xB3\x9F", # COPTIC CAPITAL LETTER OLD NUBIAN NGI
1177             "\xE2\xB3\xA0" => "\xE2\xB3\xA1", # COPTIC CAPITAL LETTER OLD NUBIAN NYI
1178             "\xE2\xB3\xA2" => "\xE2\xB3\xA3", # COPTIC CAPITAL LETTER OLD NUBIAN WAU
1179             "\xE2\xB3\xAB" => "\xE2\xB3\xAC", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
1180             "\xE2\xB3\xAD" => "\xE2\xB3\xAE", # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
1181             "\xE2\xB3\xB2" => "\xE2\xB3\xB3", # COPTIC CAPITAL LETTER BOHAIRIC KHEI
1182             "\xEA\x99\x80" => "\xEA\x99\x81", # CYRILLIC CAPITAL LETTER ZEMLYA
1183             "\xEA\x99\x82" => "\xEA\x99\x83", # CYRILLIC CAPITAL LETTER DZELO
1184             "\xEA\x99\x84" => "\xEA\x99\x85", # CYRILLIC CAPITAL LETTER REVERSED DZE
1185             "\xEA\x99\x86" => "\xEA\x99\x87", # CYRILLIC CAPITAL LETTER IOTA
1186             "\xEA\x99\x88" => "\xEA\x99\x89", # CYRILLIC CAPITAL LETTER DJERV
1187             "\xEA\x99\x8A" => "\xEA\x99\x8B", # CYRILLIC CAPITAL LETTER MONOGRAPH UK
1188             "\xEA\x99\x8C" => "\xEA\x99\x8D", # CYRILLIC CAPITAL LETTER BROAD OMEGA
1189             "\xEA\x99\x8E" => "\xEA\x99\x8F", # CYRILLIC CAPITAL LETTER NEUTRAL YER
1190             "\xEA\x99\x90" => "\xEA\x99\x91", # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
1191             "\xEA\x99\x92" => "\xEA\x99\x93", # CYRILLIC CAPITAL LETTER IOTIFIED YAT
1192             "\xEA\x99\x94" => "\xEA\x99\x95", # CYRILLIC CAPITAL LETTER REVERSED YU
1193             "\xEA\x99\x96" => "\xEA\x99\x97", # CYRILLIC CAPITAL LETTER IOTIFIED A
1194             "\xEA\x99\x98" => "\xEA\x99\x99", # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
1195             "\xEA\x99\x9A" => "\xEA\x99\x9B", # CYRILLIC CAPITAL LETTER BLENDED YUS
1196             "\xEA\x99\x9C" => "\xEA\x99\x9D", # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
1197             "\xEA\x99\x9E" => "\xEA\x99\x9F", # CYRILLIC CAPITAL LETTER YN
1198             "\xEA\x99\xA0" => "\xEA\x99\xA1", # CYRILLIC CAPITAL LETTER REVERSED TSE
1199             "\xEA\x99\xA2" => "\xEA\x99\xA3", # CYRILLIC CAPITAL LETTER SOFT DE
1200             "\xEA\x99\xA4" => "\xEA\x99\xA5", # CYRILLIC CAPITAL LETTER SOFT EL
1201             "\xEA\x99\xA6" => "\xEA\x99\xA7", # CYRILLIC CAPITAL LETTER SOFT EM
1202             "\xEA\x99\xA8" => "\xEA\x99\xA9", # CYRILLIC CAPITAL LETTER MONOCULAR O
1203             "\xEA\x99\xAA" => "\xEA\x99\xAB", # CYRILLIC CAPITAL LETTER BINOCULAR O
1204             "\xEA\x99\xAC" => "\xEA\x99\xAD", # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
1205             "\xEA\x9A\x80" => "\xEA\x9A\x81", # CYRILLIC CAPITAL LETTER DWE
1206             "\xEA\x9A\x82" => "\xEA\x9A\x83", # CYRILLIC CAPITAL LETTER DZWE
1207             "\xEA\x9A\x84" => "\xEA\x9A\x85", # CYRILLIC CAPITAL LETTER ZHWE
1208             "\xEA\x9A\x86" => "\xEA\x9A\x87", # CYRILLIC CAPITAL LETTER CCHE
1209             "\xEA\x9A\x88" => "\xEA\x9A\x89", # CYRILLIC CAPITAL LETTER DZZE
1210             "\xEA\x9A\x8A" => "\xEA\x9A\x8B", # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
1211             "\xEA\x9A\x8C" => "\xEA\x9A\x8D", # CYRILLIC CAPITAL LETTER TWE
1212             "\xEA\x9A\x8E" => "\xEA\x9A\x8F", # CYRILLIC CAPITAL LETTER TSWE
1213             "\xEA\x9A\x90" => "\xEA\x9A\x91", # CYRILLIC CAPITAL LETTER TSSE
1214             "\xEA\x9A\x92" => "\xEA\x9A\x93", # CYRILLIC CAPITAL LETTER TCHE
1215             "\xEA\x9A\x94" => "\xEA\x9A\x95", # CYRILLIC CAPITAL LETTER HWE
1216             "\xEA\x9A\x96" => "\xEA\x9A\x97", # CYRILLIC CAPITAL LETTER SHWE
1217             "\xEA\x9A\x98" => "\xEA\x9A\x99", # CYRILLIC CAPITAL LETTER DOUBLE O
1218             "\xEA\x9A\x9A" => "\xEA\x9A\x9B", # CYRILLIC CAPITAL LETTER CROSSED O
1219             "\xEA\x9C\xA2" => "\xEA\x9C\xA3", # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
1220             "\xEA\x9C\xA4" => "\xEA\x9C\xA5", # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
1221             "\xEA\x9C\xA6" => "\xEA\x9C\xA7", # LATIN CAPITAL LETTER HENG
1222             "\xEA\x9C\xA8" => "\xEA\x9C\xA9", # LATIN CAPITAL LETTER TZ
1223             "\xEA\x9C\xAA" => "\xEA\x9C\xAB", # LATIN CAPITAL LETTER TRESILLO
1224             "\xEA\x9C\xAC" => "\xEA\x9C\xAD", # LATIN CAPITAL LETTER CUATRILLO
1225             "\xEA\x9C\xAE" => "\xEA\x9C\xAF", # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
1226             "\xEA\x9C\xB2" => "\xEA\x9C\xB3", # LATIN CAPITAL LETTER AA
1227             "\xEA\x9C\xB4" => "\xEA\x9C\xB5", # LATIN CAPITAL LETTER AO
1228             "\xEA\x9C\xB6" => "\xEA\x9C\xB7", # LATIN CAPITAL LETTER AU
1229             "\xEA\x9C\xB8" => "\xEA\x9C\xB9", # LATIN CAPITAL LETTER AV
1230             "\xEA\x9C\xBA" => "\xEA\x9C\xBB", # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
1231             "\xEA\x9C\xBC" => "\xEA\x9C\xBD", # LATIN CAPITAL LETTER AY
1232             "\xEA\x9C\xBE" => "\xEA\x9C\xBF", # LATIN CAPITAL LETTER REVERSED C WITH DOT
1233             "\xEA\x9D\x80" => "\xEA\x9D\x81", # LATIN CAPITAL LETTER K WITH STROKE
1234             "\xEA\x9D\x82" => "\xEA\x9D\x83", # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
1235             "\xEA\x9D\x84" => "\xEA\x9D\x85", # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
1236             "\xEA\x9D\x86" => "\xEA\x9D\x87", # LATIN CAPITAL LETTER BROKEN L
1237             "\xEA\x9D\x88" => "\xEA\x9D\x89", # LATIN CAPITAL LETTER L WITH HIGH STROKE
1238             "\xEA\x9D\x8A" => "\xEA\x9D\x8B", # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
1239             "\xEA\x9D\x8C" => "\xEA\x9D\x8D", # LATIN CAPITAL LETTER O WITH LOOP
1240             "\xEA\x9D\x8E" => "\xEA\x9D\x8F", # LATIN CAPITAL LETTER OO
1241             "\xEA\x9D\x90" => "\xEA\x9D\x91", # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
1242             "\xEA\x9D\x92" => "\xEA\x9D\x93", # LATIN CAPITAL LETTER P WITH FLOURISH
1243             "\xEA\x9D\x94" => "\xEA\x9D\x95", # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
1244             "\xEA\x9D\x96" => "\xEA\x9D\x97", # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
1245             "\xEA\x9D\x98" => "\xEA\x9D\x99", # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
1246             "\xEA\x9D\x9A" => "\xEA\x9D\x9B", # LATIN CAPITAL LETTER R ROTUNDA
1247             "\xEA\x9D\x9C" => "\xEA\x9D\x9D", # LATIN CAPITAL LETTER RUM ROTUNDA
1248             "\xEA\x9D\x9E" => "\xEA\x9D\x9F", # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
1249             "\xEA\x9D\xA0" => "\xEA\x9D\xA1", # LATIN CAPITAL LETTER VY
1250             "\xEA\x9D\xA2" => "\xEA\x9D\xA3", # LATIN CAPITAL LETTER VISIGOTHIC Z
1251             "\xEA\x9D\xA4" => "\xEA\x9D\xA5", # LATIN CAPITAL LETTER THORN WITH STROKE
1252             "\xEA\x9D\xA6" => "\xEA\x9D\xA7", # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
1253             "\xEA\x9D\xA8" => "\xEA\x9D\xA9", # LATIN CAPITAL LETTER VEND
1254             "\xEA\x9D\xAA" => "\xEA\x9D\xAB", # LATIN CAPITAL LETTER ET
1255             "\xEA\x9D\xAC" => "\xEA\x9D\xAD", # LATIN CAPITAL LETTER IS
1256             "\xEA\x9D\xAE" => "\xEA\x9D\xAF", # LATIN CAPITAL LETTER CON
1257             "\xEA\x9D\xB9" => "\xEA\x9D\xBA", # LATIN CAPITAL LETTER INSULAR D
1258             "\xEA\x9D\xBB" => "\xEA\x9D\xBC", # LATIN CAPITAL LETTER INSULAR F
1259             "\xEA\x9D\xBD" => "\xE1\xB5\xB9", # LATIN CAPITAL LETTER INSULAR G
1260             "\xEA\x9D\xBE" => "\xEA\x9D\xBF", # LATIN CAPITAL LETTER TURNED INSULAR G
1261             "\xEA\x9E\x80" => "\xEA\x9E\x81", # LATIN CAPITAL LETTER TURNED L
1262             "\xEA\x9E\x82" => "\xEA\x9E\x83", # LATIN CAPITAL LETTER INSULAR R
1263             "\xEA\x9E\x84" => "\xEA\x9E\x85", # LATIN CAPITAL LETTER INSULAR S
1264             "\xEA\x9E\x86" => "\xEA\x9E\x87", # LATIN CAPITAL LETTER INSULAR T
1265             "\xEA\x9E\x8B" => "\xEA\x9E\x8C", # LATIN CAPITAL LETTER SALTILLO
1266             "\xEA\x9E\x8D" => "\xC9\xA5", # LATIN CAPITAL LETTER TURNED H
1267             "\xEA\x9E\x90" => "\xEA\x9E\x91", # LATIN CAPITAL LETTER N WITH DESCENDER
1268             "\xEA\x9E\x92" => "\xEA\x9E\x93", # LATIN CAPITAL LETTER C WITH BAR
1269             "\xEA\x9E\x96" => "\xEA\x9E\x97", # LATIN CAPITAL LETTER B WITH FLOURISH
1270             "\xEA\x9E\x98" => "\xEA\x9E\x99", # LATIN CAPITAL LETTER F WITH STROKE
1271             "\xEA\x9E\x9A" => "\xEA\x9E\x9B", # LATIN CAPITAL LETTER VOLAPUK AE
1272             "\xEA\x9E\x9C" => "\xEA\x9E\x9D", # LATIN CAPITAL LETTER VOLAPUK OE
1273             "\xEA\x9E\x9E" => "\xEA\x9E\x9F", # LATIN CAPITAL LETTER VOLAPUK UE
1274             "\xEA\x9E\xA0" => "\xEA\x9E\xA1", # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE
1275             "\xEA\x9E\xA2" => "\xEA\x9E\xA3", # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
1276             "\xEA\x9E\xA4" => "\xEA\x9E\xA5", # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
1277             "\xEA\x9E\xA6" => "\xEA\x9E\xA7", # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
1278             "\xEA\x9E\xA8" => "\xEA\x9E\xA9", # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
1279             "\xEA\x9E\xAA" => "\xC9\xA6", # LATIN CAPITAL LETTER H WITH HOOK
1280             "\xEA\x9E\xAB" => "\xC9\x9C", # LATIN CAPITAL LETTER REVERSED OPEN E
1281             "\xEA\x9E\xAC" => "\xC9\xA1", # LATIN CAPITAL LETTER SCRIPT G
1282             "\xEA\x9E\xAD" => "\xC9\xAC", # LATIN CAPITAL LETTER L WITH BELT
1283             "\xEA\x9E\xAE" => "\xC9\xAA", # LATIN CAPITAL LETTER SMALL CAPITAL I
1284             "\xEA\x9E\xB0" => "\xCA\x9E", # LATIN CAPITAL LETTER TURNED K
1285             "\xEA\x9E\xB1" => "\xCA\x87", # LATIN CAPITAL LETTER TURNED T
1286             "\xEA\x9E\xB2" => "\xCA\x9D", # LATIN CAPITAL LETTER J WITH CROSSED-TAIL
1287             "\xEA\x9E\xB3" => "\xEA\xAD\x93", # LATIN CAPITAL LETTER CHI
1288             "\xEA\x9E\xB4" => "\xEA\x9E\xB5", # LATIN CAPITAL LETTER BETA
1289             "\xEA\x9E\xB6" => "\xEA\x9E\xB7", # LATIN CAPITAL LETTER OMEGA
1290             "\xEA\xAD\xB0" => "\xE1\x8E\xA0", # CHEROKEE SMALL LETTER A
1291             "\xEA\xAD\xB1" => "\xE1\x8E\xA1", # CHEROKEE SMALL LETTER E
1292             "\xEA\xAD\xB2" => "\xE1\x8E\xA2", # CHEROKEE SMALL LETTER I
1293             "\xEA\xAD\xB3" => "\xE1\x8E\xA3", # CHEROKEE SMALL LETTER O
1294             "\xEA\xAD\xB4" => "\xE1\x8E\xA4", # CHEROKEE SMALL LETTER U
1295             "\xEA\xAD\xB5" => "\xE1\x8E\xA5", # CHEROKEE SMALL LETTER V
1296             "\xEA\xAD\xB6" => "\xE1\x8E\xA6", # CHEROKEE SMALL LETTER GA
1297             "\xEA\xAD\xB7" => "\xE1\x8E\xA7", # CHEROKEE SMALL LETTER KA
1298             "\xEA\xAD\xB8" => "\xE1\x8E\xA8", # CHEROKEE SMALL LETTER GE
1299             "\xEA\xAD\xB9" => "\xE1\x8E\xA9", # CHEROKEE SMALL LETTER GI
1300             "\xEA\xAD\xBA" => "\xE1\x8E\xAA", # CHEROKEE SMALL LETTER GO
1301             "\xEA\xAD\xBB" => "\xE1\x8E\xAB", # CHEROKEE SMALL LETTER GU
1302             "\xEA\xAD\xBC" => "\xE1\x8E\xAC", # CHEROKEE SMALL LETTER GV
1303             "\xEA\xAD\xBD" => "\xE1\x8E\xAD", # CHEROKEE SMALL LETTER HA
1304             "\xEA\xAD\xBE" => "\xE1\x8E\xAE", # CHEROKEE SMALL LETTER HE
1305             "\xEA\xAD\xBF" => "\xE1\x8E\xAF", # CHEROKEE SMALL LETTER HI
1306             "\xEA\xAE\x80" => "\xE1\x8E\xB0", # CHEROKEE SMALL LETTER HO
1307             "\xEA\xAE\x81" => "\xE1\x8E\xB1", # CHEROKEE SMALL LETTER HU
1308             "\xEA\xAE\x82" => "\xE1\x8E\xB2", # CHEROKEE SMALL LETTER HV
1309             "\xEA\xAE\x83" => "\xE1\x8E\xB3", # CHEROKEE SMALL LETTER LA
1310             "\xEA\xAE\x84" => "\xE1\x8E\xB4", # CHEROKEE SMALL LETTER LE
1311             "\xEA\xAE\x85" => "\xE1\x8E\xB5", # CHEROKEE SMALL LETTER LI
1312             "\xEA\xAE\x86" => "\xE1\x8E\xB6", # CHEROKEE SMALL LETTER LO
1313             "\xEA\xAE\x87" => "\xE1\x8E\xB7", # CHEROKEE SMALL LETTER LU
1314             "\xEA\xAE\x88" => "\xE1\x8E\xB8", # CHEROKEE SMALL LETTER LV
1315             "\xEA\xAE\x89" => "\xE1\x8E\xB9", # CHEROKEE SMALL LETTER MA
1316             "\xEA\xAE\x8A" => "\xE1\x8E\xBA", # CHEROKEE SMALL LETTER ME
1317             "\xEA\xAE\x8B" => "\xE1\x8E\xBB", # CHEROKEE SMALL LETTER MI
1318             "\xEA\xAE\x8C" => "\xE1\x8E\xBC", # CHEROKEE SMALL LETTER MO
1319             "\xEA\xAE\x8D" => "\xE1\x8E\xBD", # CHEROKEE SMALL LETTER MU
1320             "\xEA\xAE\x8E" => "\xE1\x8E\xBE", # CHEROKEE SMALL LETTER NA
1321             "\xEA\xAE\x8F" => "\xE1\x8E\xBF", # CHEROKEE SMALL LETTER HNA
1322             "\xEA\xAE\x90" => "\xE1\x8F\x80", # CHEROKEE SMALL LETTER NAH
1323             "\xEA\xAE\x91" => "\xE1\x8F\x81", # CHEROKEE SMALL LETTER NE
1324             "\xEA\xAE\x92" => "\xE1\x8F\x82", # CHEROKEE SMALL LETTER NI
1325             "\xEA\xAE\x93" => "\xE1\x8F\x83", # CHEROKEE SMALL LETTER NO
1326             "\xEA\xAE\x94" => "\xE1\x8F\x84", # CHEROKEE SMALL LETTER NU
1327             "\xEA\xAE\x95" => "\xE1\x8F\x85", # CHEROKEE SMALL LETTER NV
1328             "\xEA\xAE\x96" => "\xE1\x8F\x86", # CHEROKEE SMALL LETTER QUA
1329             "\xEA\xAE\x97" => "\xE1\x8F\x87", # CHEROKEE SMALL LETTER QUE
1330             "\xEA\xAE\x98" => "\xE1\x8F\x88", # CHEROKEE SMALL LETTER QUI
1331             "\xEA\xAE\x99" => "\xE1\x8F\x89", # CHEROKEE SMALL LETTER QUO
1332             "\xEA\xAE\x9A" => "\xE1\x8F\x8A", # CHEROKEE SMALL LETTER QUU
1333             "\xEA\xAE\x9B" => "\xE1\x8F\x8B", # CHEROKEE SMALL LETTER QUV
1334             "\xEA\xAE\x9C" => "\xE1\x8F\x8C", # CHEROKEE SMALL LETTER SA
1335             "\xEA\xAE\x9D" => "\xE1\x8F\x8D", # CHEROKEE SMALL LETTER S
1336             "\xEA\xAE\x9E" => "\xE1\x8F\x8E", # CHEROKEE SMALL LETTER SE
1337             "\xEA\xAE\x9F" => "\xE1\x8F\x8F", # CHEROKEE SMALL LETTER SI
1338             "\xEA\xAE\xA0" => "\xE1\x8F\x90", # CHEROKEE SMALL LETTER SO
1339             "\xEA\xAE\xA1" => "\xE1\x8F\x91", # CHEROKEE SMALL LETTER SU
1340             "\xEA\xAE\xA2" => "\xE1\x8F\x92", # CHEROKEE SMALL LETTER SV
1341             "\xEA\xAE\xA3" => "\xE1\x8F\x93", # CHEROKEE SMALL LETTER DA
1342             "\xEA\xAE\xA4" => "\xE1\x8F\x94", # CHEROKEE SMALL LETTER TA
1343             "\xEA\xAE\xA5" => "\xE1\x8F\x95", # CHEROKEE SMALL LETTER DE
1344             "\xEA\xAE\xA6" => "\xE1\x8F\x96", # CHEROKEE SMALL LETTER TE
1345             "\xEA\xAE\xA7" => "\xE1\x8F\x97", # CHEROKEE SMALL LETTER DI
1346             "\xEA\xAE\xA8" => "\xE1\x8F\x98", # CHEROKEE SMALL LETTER TI
1347             "\xEA\xAE\xA9" => "\xE1\x8F\x99", # CHEROKEE SMALL LETTER DO
1348             "\xEA\xAE\xAA" => "\xE1\x8F\x9A", # CHEROKEE SMALL LETTER DU
1349             "\xEA\xAE\xAB" => "\xE1\x8F\x9B", # CHEROKEE SMALL LETTER DV
1350             "\xEA\xAE\xAC" => "\xE1\x8F\x9C", # CHEROKEE SMALL LETTER DLA
1351             "\xEA\xAE\xAD" => "\xE1\x8F\x9D", # CHEROKEE SMALL LETTER TLA
1352             "\xEA\xAE\xAE" => "\xE1\x8F\x9E", # CHEROKEE SMALL LETTER TLE
1353             "\xEA\xAE\xAF" => "\xE1\x8F\x9F", # CHEROKEE SMALL LETTER TLI
1354             "\xEA\xAE\xB0" => "\xE1\x8F\xA0", # CHEROKEE SMALL LETTER TLO
1355             "\xEA\xAE\xB1" => "\xE1\x8F\xA1", # CHEROKEE SMALL LETTER TLU
1356             "\xEA\xAE\xB2" => "\xE1\x8F\xA2", # CHEROKEE SMALL LETTER TLV
1357             "\xEA\xAE\xB3" => "\xE1\x8F\xA3", # CHEROKEE SMALL LETTER TSA
1358             "\xEA\xAE\xB4" => "\xE1\x8F\xA4", # CHEROKEE SMALL LETTER TSE
1359             "\xEA\xAE\xB5" => "\xE1\x8F\xA5", # CHEROKEE SMALL LETTER TSI
1360             "\xEA\xAE\xB6" => "\xE1\x8F\xA6", # CHEROKEE SMALL LETTER TSO
1361             "\xEA\xAE\xB7" => "\xE1\x8F\xA7", # CHEROKEE SMALL LETTER TSU
1362             "\xEA\xAE\xB8" => "\xE1\x8F\xA8", # CHEROKEE SMALL LETTER TSV
1363             "\xEA\xAE\xB9" => "\xE1\x8F\xA9", # CHEROKEE SMALL LETTER WA
1364             "\xEA\xAE\xBA" => "\xE1\x8F\xAA", # CHEROKEE SMALL LETTER WE
1365             "\xEA\xAE\xBB" => "\xE1\x8F\xAB", # CHEROKEE SMALL LETTER WI
1366             "\xEA\xAE\xBC" => "\xE1\x8F\xAC", # CHEROKEE SMALL LETTER WO
1367             "\xEA\xAE\xBD" => "\xE1\x8F\xAD", # CHEROKEE SMALL LETTER WU
1368             "\xEA\xAE\xBE" => "\xE1\x8F\xAE", # CHEROKEE SMALL LETTER WV
1369             "\xEA\xAE\xBF" => "\xE1\x8F\xAF", # CHEROKEE SMALL LETTER YA
1370             "\xEF\xAC\x80" => "\x66\x66", # LATIN SMALL LIGATURE FF
1371             "\xEF\xAC\x81" => "\x66\x69", # LATIN SMALL LIGATURE FI
1372             "\xEF\xAC\x82" => "\x66\x6C", # LATIN SMALL LIGATURE FL
1373             "\xEF\xAC\x83" => "\x66\x66\x69", # LATIN SMALL LIGATURE FFI
1374             "\xEF\xAC\x84" => "\x66\x66\x6C", # LATIN SMALL LIGATURE FFL
1375             "\xEF\xAC\x85" => "\x73\x74", # LATIN SMALL LIGATURE LONG S T
1376             "\xEF\xAC\x86" => "\x73\x74", # LATIN SMALL LIGATURE ST
1377             "\xEF\xAC\x93" => "\xD5\xB4\xD5\xB6", # ARMENIAN SMALL LIGATURE MEN NOW
1378             "\xEF\xAC\x94" => "\xD5\xB4\xD5\xA5", # ARMENIAN SMALL LIGATURE MEN ECH
1379             "\xEF\xAC\x95" => "\xD5\xB4\xD5\xAB", # ARMENIAN SMALL LIGATURE MEN INI
1380             "\xEF\xAC\x96" => "\xD5\xBE\xD5\xB6", # ARMENIAN SMALL LIGATURE VEW NOW
1381             "\xEF\xAC\x97" => "\xD5\xB4\xD5\xAD", # ARMENIAN SMALL LIGATURE MEN XEH
1382             "\xEF\xBC\xA1" => "\xEF\xBD\x81", # FULLWIDTH LATIN CAPITAL LETTER A
1383             "\xEF\xBC\xA2" => "\xEF\xBD\x82", # FULLWIDTH LATIN CAPITAL LETTER B
1384             "\xEF\xBC\xA3" => "\xEF\xBD\x83", # FULLWIDTH LATIN CAPITAL LETTER C
1385             "\xEF\xBC\xA4" => "\xEF\xBD\x84", # FULLWIDTH LATIN CAPITAL LETTER D
1386             "\xEF\xBC\xA5" => "\xEF\xBD\x85", # FULLWIDTH LATIN CAPITAL LETTER E
1387             "\xEF\xBC\xA6" => "\xEF\xBD\x86", # FULLWIDTH LATIN CAPITAL LETTER F
1388             "\xEF\xBC\xA7" => "\xEF\xBD\x87", # FULLWIDTH LATIN CAPITAL LETTER G
1389             "\xEF\xBC\xA8" => "\xEF\xBD\x88", # FULLWIDTH LATIN CAPITAL LETTER H
1390             "\xEF\xBC\xA9" => "\xEF\xBD\x89", # FULLWIDTH LATIN CAPITAL LETTER I
1391             "\xEF\xBC\xAA" => "\xEF\xBD\x8A", # FULLWIDTH LATIN CAPITAL LETTER J
1392             "\xEF\xBC\xAB" => "\xEF\xBD\x8B", # FULLWIDTH LATIN CAPITAL LETTER K
1393             "\xEF\xBC\xAC" => "\xEF\xBD\x8C", # FULLWIDTH LATIN CAPITAL LETTER L
1394             "\xEF\xBC\xAD" => "\xEF\xBD\x8D", # FULLWIDTH LATIN CAPITAL LETTER M
1395             "\xEF\xBC\xAE" => "\xEF\xBD\x8E", # FULLWIDTH LATIN CAPITAL LETTER N
1396             "\xEF\xBC\xAF" => "\xEF\xBD\x8F", # FULLWIDTH LATIN CAPITAL LETTER O
1397             "\xEF\xBC\xB0" => "\xEF\xBD\x90", # FULLWIDTH LATIN CAPITAL LETTER P
1398             "\xEF\xBC\xB1" => "\xEF\xBD\x91", # FULLWIDTH LATIN CAPITAL LETTER Q
1399             "\xEF\xBC\xB2" => "\xEF\xBD\x92", # FULLWIDTH LATIN CAPITAL LETTER R
1400             "\xEF\xBC\xB3" => "\xEF\xBD\x93", # FULLWIDTH LATIN CAPITAL LETTER S
1401             "\xEF\xBC\xB4" => "\xEF\xBD\x94", # FULLWIDTH LATIN CAPITAL LETTER T
1402             "\xEF\xBC\xB5" => "\xEF\xBD\x95", # FULLWIDTH LATIN CAPITAL LETTER U
1403             "\xEF\xBC\xB6" => "\xEF\xBD\x96", # FULLWIDTH LATIN CAPITAL LETTER V
1404             "\xEF\xBC\xB7" => "\xEF\xBD\x97", # FULLWIDTH LATIN CAPITAL LETTER W
1405             "\xEF\xBC\xB8" => "\xEF\xBD\x98", # FULLWIDTH LATIN CAPITAL LETTER X
1406             "\xEF\xBC\xB9" => "\xEF\xBD\x99", # FULLWIDTH LATIN CAPITAL LETTER Y
1407             "\xEF\xBC\xBA" => "\xEF\xBD\x9A", # FULLWIDTH LATIN CAPITAL LETTER Z
1408             "\xF0\x90\x90\x80" => "\xF0\x90\x90\xA8", # DESERET CAPITAL LETTER LONG I
1409             "\xF0\x90\x90\x81" => "\xF0\x90\x90\xA9", # DESERET CAPITAL LETTER LONG E
1410             "\xF0\x90\x90\x82" => "\xF0\x90\x90\xAA", # DESERET CAPITAL LETTER LONG A
1411             "\xF0\x90\x90\x83" => "\xF0\x90\x90\xAB", # DESERET CAPITAL LETTER LONG AH
1412             "\xF0\x90\x90\x84" => "\xF0\x90\x90\xAC", # DESERET CAPITAL LETTER LONG O
1413             "\xF0\x90\x90\x85" => "\xF0\x90\x90\xAD", # DESERET CAPITAL LETTER LONG OO
1414             "\xF0\x90\x90\x86" => "\xF0\x90\x90\xAE", # DESERET CAPITAL LETTER SHORT I
1415             "\xF0\x90\x90\x87" => "\xF0\x90\x90\xAF", # DESERET CAPITAL LETTER SHORT E
1416             "\xF0\x90\x90\x88" => "\xF0\x90\x90\xB0", # DESERET CAPITAL LETTER SHORT A
1417             "\xF0\x90\x90\x89" => "\xF0\x90\x90\xB1", # DESERET CAPITAL LETTER SHORT AH
1418             "\xF0\x90\x90\x8A" => "\xF0\x90\x90\xB2", # DESERET CAPITAL LETTER SHORT O
1419             "\xF0\x90\x90\x8B" => "\xF0\x90\x90\xB3", # DESERET CAPITAL LETTER SHORT OO
1420             "\xF0\x90\x90\x8C" => "\xF0\x90\x90\xB4", # DESERET CAPITAL LETTER AY
1421             "\xF0\x90\x90\x8D" => "\xF0\x90\x90\xB5", # DESERET CAPITAL LETTER OW
1422             "\xF0\x90\x90\x8E" => "\xF0\x90\x90\xB6", # DESERET CAPITAL LETTER WU
1423             "\xF0\x90\x90\x8F" => "\xF0\x90\x90\xB7", # DESERET CAPITAL LETTER YEE
1424             "\xF0\x90\x90\x90" => "\xF0\x90\x90\xB8", # DESERET CAPITAL LETTER H
1425             "\xF0\x90\x90\x91" => "\xF0\x90\x90\xB9", # DESERET CAPITAL LETTER PEE
1426             "\xF0\x90\x90\x92" => "\xF0\x90\x90\xBA", # DESERET CAPITAL LETTER BEE
1427             "\xF0\x90\x90\x93" => "\xF0\x90\x90\xBB", # DESERET CAPITAL LETTER TEE
1428             "\xF0\x90\x90\x94" => "\xF0\x90\x90\xBC", # DESERET CAPITAL LETTER DEE
1429             "\xF0\x90\x90\x95" => "\xF0\x90\x90\xBD", # DESERET CAPITAL LETTER CHEE
1430             "\xF0\x90\x90\x96" => "\xF0\x90\x90\xBE", # DESERET CAPITAL LETTER JEE
1431             "\xF0\x90\x90\x97" => "\xF0\x90\x90\xBF", # DESERET CAPITAL LETTER KAY
1432             "\xF0\x90\x90\x98" => "\xF0\x90\x91\x80", # DESERET CAPITAL LETTER GAY
1433             "\xF0\x90\x90\x99" => "\xF0\x90\x91\x81", # DESERET CAPITAL LETTER EF
1434             "\xF0\x90\x90\x9A" => "\xF0\x90\x91\x82", # DESERET CAPITAL LETTER VEE
1435             "\xF0\x90\x90\x9B" => "\xF0\x90\x91\x83", # DESERET CAPITAL LETTER ETH
1436             "\xF0\x90\x90\x9C" => "\xF0\x90\x91\x84", # DESERET CAPITAL LETTER THEE
1437             "\xF0\x90\x90\x9D" => "\xF0\x90\x91\x85", # DESERET CAPITAL LETTER ES
1438             "\xF0\x90\x90\x9E" => "\xF0\x90\x91\x86", # DESERET CAPITAL LETTER ZEE
1439             "\xF0\x90\x90\x9F" => "\xF0\x90\x91\x87", # DESERET CAPITAL LETTER ESH
1440             "\xF0\x90\x90\xA0" => "\xF0\x90\x91\x88", # DESERET CAPITAL LETTER ZHEE
1441             "\xF0\x90\x90\xA1" => "\xF0\x90\x91\x89", # DESERET CAPITAL LETTER ER
1442             "\xF0\x90\x90\xA2" => "\xF0\x90\x91\x8A", # DESERET CAPITAL LETTER EL
1443             "\xF0\x90\x90\xA3" => "\xF0\x90\x91\x8B", # DESERET CAPITAL LETTER EM
1444             "\xF0\x90\x90\xA4" => "\xF0\x90\x91\x8C", # DESERET CAPITAL LETTER EN
1445             "\xF0\x90\x90\xA5" => "\xF0\x90\x91\x8D", # DESERET CAPITAL LETTER ENG
1446             "\xF0\x90\x90\xA6" => "\xF0\x90\x91\x8E", # DESERET CAPITAL LETTER OI
1447             "\xF0\x90\x90\xA7" => "\xF0\x90\x91\x8F", # DESERET CAPITAL LETTER EW
1448             "\xF0\x90\x92\xB0" => "\xF0\x90\x93\x98", # OSAGE CAPITAL LETTER A
1449             "\xF0\x90\x92\xB1" => "\xF0\x90\x93\x99", # OSAGE CAPITAL LETTER AI
1450             "\xF0\x90\x92\xB2" => "\xF0\x90\x93\x9A", # OSAGE CAPITAL LETTER AIN
1451             "\xF0\x90\x92\xB3" => "\xF0\x90\x93\x9B", # OSAGE CAPITAL LETTER AH
1452             "\xF0\x90\x92\xB4" => "\xF0\x90\x93\x9C", # OSAGE CAPITAL LETTER BRA
1453             "\xF0\x90\x92\xB5" => "\xF0\x90\x93\x9D", # OSAGE CAPITAL LETTER CHA
1454             "\xF0\x90\x92\xB6" => "\xF0\x90\x93\x9E", # OSAGE CAPITAL LETTER EHCHA
1455             "\xF0\x90\x92\xB7" => "\xF0\x90\x93\x9F", # OSAGE CAPITAL LETTER E
1456             "\xF0\x90\x92\xB8" => "\xF0\x90\x93\xA0", # OSAGE CAPITAL LETTER EIN
1457             "\xF0\x90\x92\xB9" => "\xF0\x90\x93\xA1", # OSAGE CAPITAL LETTER HA
1458             "\xF0\x90\x92\xBA" => "\xF0\x90\x93\xA2", # OSAGE CAPITAL LETTER HYA
1459             "\xF0\x90\x92\xBB" => "\xF0\x90\x93\xA3", # OSAGE CAPITAL LETTER I
1460             "\xF0\x90\x92\xBC" => "\xF0\x90\x93\xA4", # OSAGE CAPITAL LETTER KA
1461             "\xF0\x90\x92\xBD" => "\xF0\x90\x93\xA5", # OSAGE CAPITAL LETTER EHKA
1462             "\xF0\x90\x92\xBE" => "\xF0\x90\x93\xA6", # OSAGE CAPITAL LETTER KYA
1463             "\xF0\x90\x92\xBF" => "\xF0\x90\x93\xA7", # OSAGE CAPITAL LETTER LA
1464             "\xF0\x90\x93\x80" => "\xF0\x90\x93\xA8", # OSAGE CAPITAL LETTER MA
1465             "\xF0\x90\x93\x81" => "\xF0\x90\x93\xA9", # OSAGE CAPITAL LETTER NA
1466             "\xF0\x90\x93\x82" => "\xF0\x90\x93\xAA", # OSAGE CAPITAL LETTER O
1467             "\xF0\x90\x93\x83" => "\xF0\x90\x93\xAB", # OSAGE CAPITAL LETTER OIN
1468             "\xF0\x90\x93\x84" => "\xF0\x90\x93\xAC", # OSAGE CAPITAL LETTER PA
1469             "\xF0\x90\x93\x85" => "\xF0\x90\x93\xAD", # OSAGE CAPITAL LETTER EHPA
1470             "\xF0\x90\x93\x86" => "\xF0\x90\x93\xAE", # OSAGE CAPITAL LETTER SA
1471             "\xF0\x90\x93\x87" => "\xF0\x90\x93\xAF", # OSAGE CAPITAL LETTER SHA
1472             "\xF0\x90\x93\x88" => "\xF0\x90\x93\xB0", # OSAGE CAPITAL LETTER TA
1473             "\xF0\x90\x93\x89" => "\xF0\x90\x93\xB1", # OSAGE CAPITAL LETTER EHTA
1474             "\xF0\x90\x93\x8A" => "\xF0\x90\x93\xB2", # OSAGE CAPITAL LETTER TSA
1475             "\xF0\x90\x93\x8B" => "\xF0\x90\x93\xB3", # OSAGE CAPITAL LETTER EHTSA
1476             "\xF0\x90\x93\x8C" => "\xF0\x90\x93\xB4", # OSAGE CAPITAL LETTER TSHA
1477             "\xF0\x90\x93\x8D" => "\xF0\x90\x93\xB5", # OSAGE CAPITAL LETTER DHA
1478             "\xF0\x90\x93\x8E" => "\xF0\x90\x93\xB6", # OSAGE CAPITAL LETTER U
1479             "\xF0\x90\x93\x8F" => "\xF0\x90\x93\xB7", # OSAGE CAPITAL LETTER WA
1480             "\xF0\x90\x93\x90" => "\xF0\x90\x93\xB8", # OSAGE CAPITAL LETTER KHA
1481             "\xF0\x90\x93\x91" => "\xF0\x90\x93\xB9", # OSAGE CAPITAL LETTER GHA
1482             "\xF0\x90\x93\x92" => "\xF0\x90\x93\xBA", # OSAGE CAPITAL LETTER ZA
1483             "\xF0\x90\x93\x93" => "\xF0\x90\x93\xBB", # OSAGE CAPITAL LETTER ZHA
1484             "\xF0\x90\xB2\x80" => "\xF0\x90\xB3\x80", # OLD HUNGARIAN CAPITAL LETTER A
1485             "\xF0\x90\xB2\x81" => "\xF0\x90\xB3\x81", # OLD HUNGARIAN CAPITAL LETTER AA
1486             "\xF0\x90\xB2\x82" => "\xF0\x90\xB3\x82", # OLD HUNGARIAN CAPITAL LETTER EB
1487             "\xF0\x90\xB2\x83" => "\xF0\x90\xB3\x83", # OLD HUNGARIAN CAPITAL LETTER AMB
1488             "\xF0\x90\xB2\x84" => "\xF0\x90\xB3\x84", # OLD HUNGARIAN CAPITAL LETTER EC
1489             "\xF0\x90\xB2\x85" => "\xF0\x90\xB3\x85", # OLD HUNGARIAN CAPITAL LETTER ENC
1490             "\xF0\x90\xB2\x86" => "\xF0\x90\xB3\x86", # OLD HUNGARIAN CAPITAL LETTER ECS
1491             "\xF0\x90\xB2\x87" => "\xF0\x90\xB3\x87", # OLD HUNGARIAN CAPITAL LETTER ED
1492             "\xF0\x90\xB2\x88" => "\xF0\x90\xB3\x88", # OLD HUNGARIAN CAPITAL LETTER AND
1493             "\xF0\x90\xB2\x89" => "\xF0\x90\xB3\x89", # OLD HUNGARIAN CAPITAL LETTER E
1494             "\xF0\x90\xB2\x8A" => "\xF0\x90\xB3\x8A", # OLD HUNGARIAN CAPITAL LETTER CLOSE E
1495             "\xF0\x90\xB2\x8B" => "\xF0\x90\xB3\x8B", # OLD HUNGARIAN CAPITAL LETTER EE
1496             "\xF0\x90\xB2\x8C" => "\xF0\x90\xB3\x8C", # OLD HUNGARIAN CAPITAL LETTER EF
1497             "\xF0\x90\xB2\x8D" => "\xF0\x90\xB3\x8D", # OLD HUNGARIAN CAPITAL LETTER EG
1498             "\xF0\x90\xB2\x8E" => "\xF0\x90\xB3\x8E", # OLD HUNGARIAN CAPITAL LETTER EGY
1499             "\xF0\x90\xB2\x8F" => "\xF0\x90\xB3\x8F", # OLD HUNGARIAN CAPITAL LETTER EH
1500             "\xF0\x90\xB2\x90" => "\xF0\x90\xB3\x90", # OLD HUNGARIAN CAPITAL LETTER I
1501             "\xF0\x90\xB2\x91" => "\xF0\x90\xB3\x91", # OLD HUNGARIAN CAPITAL LETTER II
1502             "\xF0\x90\xB2\x92" => "\xF0\x90\xB3\x92", # OLD HUNGARIAN CAPITAL LETTER EJ
1503             "\xF0\x90\xB2\x93" => "\xF0\x90\xB3\x93", # OLD HUNGARIAN CAPITAL LETTER EK
1504             "\xF0\x90\xB2\x94" => "\xF0\x90\xB3\x94", # OLD HUNGARIAN CAPITAL LETTER AK
1505             "\xF0\x90\xB2\x95" => "\xF0\x90\xB3\x95", # OLD HUNGARIAN CAPITAL LETTER UNK
1506             "\xF0\x90\xB2\x96" => "\xF0\x90\xB3\x96", # OLD HUNGARIAN CAPITAL LETTER EL
1507             "\xF0\x90\xB2\x97" => "\xF0\x90\xB3\x97", # OLD HUNGARIAN CAPITAL LETTER ELY
1508             "\xF0\x90\xB2\x98" => "\xF0\x90\xB3\x98", # OLD HUNGARIAN CAPITAL LETTER EM
1509             "\xF0\x90\xB2\x99" => "\xF0\x90\xB3\x99", # OLD HUNGARIAN CAPITAL LETTER EN
1510             "\xF0\x90\xB2\x9A" => "\xF0\x90\xB3\x9A", # OLD HUNGARIAN CAPITAL LETTER ENY
1511             "\xF0\x90\xB2\x9B" => "\xF0\x90\xB3\x9B", # OLD HUNGARIAN CAPITAL LETTER O
1512             "\xF0\x90\xB2\x9C" => "\xF0\x90\xB3\x9C", # OLD HUNGARIAN CAPITAL LETTER OO
1513             "\xF0\x90\xB2\x9D" => "\xF0\x90\xB3\x9D", # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE
1514             "\xF0\x90\xB2\x9E" => "\xF0\x90\xB3\x9E", # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE
1515             "\xF0\x90\xB2\x9F" => "\xF0\x90\xB3\x9F", # OLD HUNGARIAN CAPITAL LETTER OEE
1516             "\xF0\x90\xB2\xA0" => "\xF0\x90\xB3\xA0", # OLD HUNGARIAN CAPITAL LETTER EP
1517             "\xF0\x90\xB2\xA1" => "\xF0\x90\xB3\xA1", # OLD HUNGARIAN CAPITAL LETTER EMP
1518             "\xF0\x90\xB2\xA2" => "\xF0\x90\xB3\xA2", # OLD HUNGARIAN CAPITAL LETTER ER
1519             "\xF0\x90\xB2\xA3" => "\xF0\x90\xB3\xA3", # OLD HUNGARIAN CAPITAL LETTER SHORT ER
1520             "\xF0\x90\xB2\xA4" => "\xF0\x90\xB3\xA4", # OLD HUNGARIAN CAPITAL LETTER ES
1521             "\xF0\x90\xB2\xA5" => "\xF0\x90\xB3\xA5", # OLD HUNGARIAN CAPITAL LETTER ESZ
1522             "\xF0\x90\xB2\xA6" => "\xF0\x90\xB3\xA6", # OLD HUNGARIAN CAPITAL LETTER ET
1523             "\xF0\x90\xB2\xA7" => "\xF0\x90\xB3\xA7", # OLD HUNGARIAN CAPITAL LETTER ENT
1524             "\xF0\x90\xB2\xA8" => "\xF0\x90\xB3\xA8", # OLD HUNGARIAN CAPITAL LETTER ETY
1525             "\xF0\x90\xB2\xA9" => "\xF0\x90\xB3\xA9", # OLD HUNGARIAN CAPITAL LETTER ECH
1526             "\xF0\x90\xB2\xAA" => "\xF0\x90\xB3\xAA", # OLD HUNGARIAN CAPITAL LETTER U
1527             "\xF0\x90\xB2\xAB" => "\xF0\x90\xB3\xAB", # OLD HUNGARIAN CAPITAL LETTER UU
1528             "\xF0\x90\xB2\xAC" => "\xF0\x90\xB3\xAC", # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE
1529             "\xF0\x90\xB2\xAD" => "\xF0\x90\xB3\xAD", # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE
1530             "\xF0\x90\xB2\xAE" => "\xF0\x90\xB3\xAE", # OLD HUNGARIAN CAPITAL LETTER EV
1531             "\xF0\x90\xB2\xAF" => "\xF0\x90\xB3\xAF", # OLD HUNGARIAN CAPITAL LETTER EZ
1532             "\xF0\x90\xB2\xB0" => "\xF0\x90\xB3\xB0", # OLD HUNGARIAN CAPITAL LETTER EZS
1533             "\xF0\x90\xB2\xB1" => "\xF0\x90\xB3\xB1", # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN
1534             "\xF0\x90\xB2\xB2" => "\xF0\x90\xB3\xB2", # OLD HUNGARIAN CAPITAL LETTER US
1535             "\xF0\x91\xA2\xA0" => "\xF0\x91\xA3\x80", # WARANG CITI CAPITAL LETTER NGAA
1536             "\xF0\x91\xA2\xA1" => "\xF0\x91\xA3\x81", # WARANG CITI CAPITAL LETTER A
1537             "\xF0\x91\xA2\xA2" => "\xF0\x91\xA3\x82", # WARANG CITI CAPITAL LETTER WI
1538             "\xF0\x91\xA2\xA3" => "\xF0\x91\xA3\x83", # WARANG CITI CAPITAL LETTER YU
1539             "\xF0\x91\xA2\xA4" => "\xF0\x91\xA3\x84", # WARANG CITI CAPITAL LETTER YA
1540             "\xF0\x91\xA2\xA5" => "\xF0\x91\xA3\x85", # WARANG CITI CAPITAL LETTER YO
1541             "\xF0\x91\xA2\xA6" => "\xF0\x91\xA3\x86", # WARANG CITI CAPITAL LETTER II
1542             "\xF0\x91\xA2\xA7" => "\xF0\x91\xA3\x87", # WARANG CITI CAPITAL LETTER UU
1543             "\xF0\x91\xA2\xA8" => "\xF0\x91\xA3\x88", # WARANG CITI CAPITAL LETTER E
1544             "\xF0\x91\xA2\xA9" => "\xF0\x91\xA3\x89", # WARANG CITI CAPITAL LETTER O
1545             "\xF0\x91\xA2\xAA" => "\xF0\x91\xA3\x8A", # WARANG CITI CAPITAL LETTER ANG
1546             "\xF0\x91\xA2\xAB" => "\xF0\x91\xA3\x8B", # WARANG CITI CAPITAL LETTER GA
1547             "\xF0\x91\xA2\xAC" => "\xF0\x91\xA3\x8C", # WARANG CITI CAPITAL LETTER KO
1548             "\xF0\x91\xA2\xAD" => "\xF0\x91\xA3\x8D", # WARANG CITI CAPITAL LETTER ENY
1549             "\xF0\x91\xA2\xAE" => "\xF0\x91\xA3\x8E", # WARANG CITI CAPITAL LETTER YUJ
1550             "\xF0\x91\xA2\xAF" => "\xF0\x91\xA3\x8F", # WARANG CITI CAPITAL LETTER UC
1551             "\xF0\x91\xA2\xB0" => "\xF0\x91\xA3\x90", # WARANG CITI CAPITAL LETTER ENN
1552             "\xF0\x91\xA2\xB1" => "\xF0\x91\xA3\x91", # WARANG CITI CAPITAL LETTER ODD
1553             "\xF0\x91\xA2\xB2" => "\xF0\x91\xA3\x92", # WARANG CITI CAPITAL LETTER TTE
1554             "\xF0\x91\xA2\xB3" => "\xF0\x91\xA3\x93", # WARANG CITI CAPITAL LETTER NUNG
1555             "\xF0\x91\xA2\xB4" => "\xF0\x91\xA3\x94", # WARANG CITI CAPITAL LETTER DA
1556             "\xF0\x91\xA2\xB5" => "\xF0\x91\xA3\x95", # WARANG CITI CAPITAL LETTER AT
1557             "\xF0\x91\xA2\xB6" => "\xF0\x91\xA3\x96", # WARANG CITI CAPITAL LETTER AM
1558             "\xF0\x91\xA2\xB7" => "\xF0\x91\xA3\x97", # WARANG CITI CAPITAL LETTER BU
1559             "\xF0\x91\xA2\xB8" => "\xF0\x91\xA3\x98", # WARANG CITI CAPITAL LETTER PU
1560             "\xF0\x91\xA2\xB9" => "\xF0\x91\xA3\x99", # WARANG CITI CAPITAL LETTER HIYO
1561             "\xF0\x91\xA2\xBA" => "\xF0\x91\xA3\x9A", # WARANG CITI CAPITAL LETTER HOLO
1562             "\xF0\x91\xA2\xBB" => "\xF0\x91\xA3\x9B", # WARANG CITI CAPITAL LETTER HORR
1563             "\xF0\x91\xA2\xBC" => "\xF0\x91\xA3\x9C", # WARANG CITI CAPITAL LETTER HAR
1564             "\xF0\x91\xA2\xBD" => "\xF0\x91\xA3\x9D", # WARANG CITI CAPITAL LETTER SSUU
1565             "\xF0\x91\xA2\xBE" => "\xF0\x91\xA3\x9E", # WARANG CITI CAPITAL LETTER SII
1566             "\xF0\x91\xA2\xBF" => "\xF0\x91\xA3\x9F", # WARANG CITI CAPITAL LETTER VIYO
1567             "\xF0\x9E\xA4\x80" => "\xF0\x9E\xA4\xA2", # ADLAM CAPITAL LETTER ALIF
1568             "\xF0\x9E\xA4\x81" => "\xF0\x9E\xA4\xA3", # ADLAM CAPITAL LETTER DAALI
1569             "\xF0\x9E\xA4\x82" => "\xF0\x9E\xA4\xA4", # ADLAM CAPITAL LETTER LAAM
1570             "\xF0\x9E\xA4\x83" => "\xF0\x9E\xA4\xA5", # ADLAM CAPITAL LETTER MIIM
1571             "\xF0\x9E\xA4\x84" => "\xF0\x9E\xA4\xA6", # ADLAM CAPITAL LETTER BA
1572             "\xF0\x9E\xA4\x85" => "\xF0\x9E\xA4\xA7", # ADLAM CAPITAL LETTER SINNYIIYHE
1573             "\xF0\x9E\xA4\x86" => "\xF0\x9E\xA4\xA8", # ADLAM CAPITAL LETTER PE
1574             "\xF0\x9E\xA4\x87" => "\xF0\x9E\xA4\xA9", # ADLAM CAPITAL LETTER BHE
1575             "\xF0\x9E\xA4\x88" => "\xF0\x9E\xA4\xAA", # ADLAM CAPITAL LETTER RA
1576             "\xF0\x9E\xA4\x89" => "\xF0\x9E\xA4\xAB", # ADLAM CAPITAL LETTER E
1577             "\xF0\x9E\xA4\x8A" => "\xF0\x9E\xA4\xAC", # ADLAM CAPITAL LETTER FA
1578             "\xF0\x9E\xA4\x8B" => "\xF0\x9E\xA4\xAD", # ADLAM CAPITAL LETTER I
1579             "\xF0\x9E\xA4\x8C" => "\xF0\x9E\xA4\xAE", # ADLAM CAPITAL LETTER O
1580             "\xF0\x9E\xA4\x8D" => "\xF0\x9E\xA4\xAF", # ADLAM CAPITAL LETTER DHA
1581             "\xF0\x9E\xA4\x8E" => "\xF0\x9E\xA4\xB0", # ADLAM CAPITAL LETTER YHE
1582             "\xF0\x9E\xA4\x8F" => "\xF0\x9E\xA4\xB1", # ADLAM CAPITAL LETTER WAW
1583             "\xF0\x9E\xA4\x90" => "\xF0\x9E\xA4\xB2", # ADLAM CAPITAL LETTER NUN
1584             "\xF0\x9E\xA4\x91" => "\xF0\x9E\xA4\xB3", # ADLAM CAPITAL LETTER KAF
1585             "\xF0\x9E\xA4\x92" => "\xF0\x9E\xA4\xB4", # ADLAM CAPITAL LETTER YA
1586             "\xF0\x9E\xA4\x93" => "\xF0\x9E\xA4\xB5", # ADLAM CAPITAL LETTER U
1587             "\xF0\x9E\xA4\x94" => "\xF0\x9E\xA4\xB6", # ADLAM CAPITAL LETTER JIIM
1588             "\xF0\x9E\xA4\x95" => "\xF0\x9E\xA4\xB7", # ADLAM CAPITAL LETTER CHI
1589             "\xF0\x9E\xA4\x96" => "\xF0\x9E\xA4\xB8", # ADLAM CAPITAL LETTER HA
1590             "\xF0\x9E\xA4\x97" => "\xF0\x9E\xA4\xB9", # ADLAM CAPITAL LETTER QAAF
1591             "\xF0\x9E\xA4\x98" => "\xF0\x9E\xA4\xBA", # ADLAM CAPITAL LETTER GA
1592             "\xF0\x9E\xA4\x99" => "\xF0\x9E\xA4\xBB", # ADLAM CAPITAL LETTER NYA
1593             "\xF0\x9E\xA4\x9A" => "\xF0\x9E\xA4\xBC", # ADLAM CAPITAL LETTER TU
1594             "\xF0\x9E\xA4\x9B" => "\xF0\x9E\xA4\xBD", # ADLAM CAPITAL LETTER NHA
1595             "\xF0\x9E\xA4\x9C" => "\xF0\x9E\xA4\xBE", # ADLAM CAPITAL LETTER VA
1596             "\xF0\x9E\xA4\x9D" => "\xF0\x9E\xA4\xBF", # ADLAM CAPITAL LETTER KHA
1597             "\xF0\x9E\xA4\x9E" => "\xF0\x9E\xA5\x80", # ADLAM CAPITAL LETTER GBE
1598             "\xF0\x9E\xA4\x9F" => "\xF0\x9E\xA5\x81", # ADLAM CAPITAL LETTER ZAL
1599             "\xF0\x9E\xA4\xA0" => "\xF0\x9E\xA5\x82", # ADLAM CAPITAL LETTER KPO
1600             "\xF0\x9E\xA4\xA1" => "\xF0\x9E\xA5\x83", # ADLAM CAPITAL LETTER SHA
1601             );
1602             }
1603              
1604             else {
1605             croak "Don't know my package name '@{[__PACKAGE__]}'";
1606             }
1607              
1608             #
1609             # @ARGV wildcard globbing
1610             #
1611             sub import {
1612              
1613 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
1614 0         0 my @argv = ();
1615 0         0 for (@ARGV) {
1616              
1617             # has space
1618 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
1619 0 0       0 if (my @glob = Eoldutf8::glob(qq{"$_"})) {
1620 0         0 push @argv, @glob;
1621             }
1622             else {
1623 0         0 push @argv, $_;
1624             }
1625             }
1626              
1627             # has wildcard metachar
1628             elsif (/\A (?:$q_char)*? [*?] /oxms) {
1629 0 0       0 if (my @glob = Eoldutf8::glob($_)) {
1630 0         0 push @argv, @glob;
1631             }
1632             else {
1633 0         0 push @argv, $_;
1634             }
1635             }
1636              
1637             # no wildcard globbing
1638             else {
1639 0         0 push @argv, $_;
1640             }
1641             }
1642 0         0 @ARGV = @argv;
1643             }
1644              
1645 0         0 *Char::ord = \&OldUTF8::ord;
1646 0         0 *Char::ord_ = \&OldUTF8::ord_;
1647 0         0 *Char::reverse = \&OldUTF8::reverse;
1648 0         0 *Char::getc = \&OldUTF8::getc;
1649 0         0 *Char::length = \&OldUTF8::length;
1650 0         0 *Char::substr = \&OldUTF8::substr;
1651 0         0 *Char::index = \&OldUTF8::index;
1652 0         0 *Char::rindex = \&OldUTF8::rindex;
1653 0         0 *Char::eval = \&OldUTF8::eval;
1654 0         0 *Char::escape = \&OldUTF8::escape;
1655 0         0 *Char::escape_token = \&OldUTF8::escape_token;
1656 0         0 *Char::escape_script = \&OldUTF8::escape_script;
1657             }
1658              
1659             # P.230 Care with Prototypes
1660             # in Chapter 6: Subroutines
1661             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1662             #
1663             # If you aren't careful, you can get yourself into trouble with prototypes.
1664             # But if you are careful, you can do a lot of neat things with them. This is
1665             # all very powerful, of course, and should only be used in moderation to make
1666             # the world a better place.
1667              
1668             # P.332 Care with Prototypes
1669             # in Chapter 7: Subroutines
1670             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1671             #
1672             # If you aren't careful, you can get yourself into trouble with prototypes.
1673             # But if you are careful, you can do a lot of neat things with them. This is
1674             # all very powerful, of course, and should only be used in moderation to make
1675             # the world a better place.
1676              
1677             #
1678             # Prototypes of subroutines
1679             #
1680       0     sub unimport {}
1681             sub Eoldutf8::split(;$$$);
1682             sub Eoldutf8::tr($$$$;$);
1683             sub Eoldutf8::chop(@);
1684             sub Eoldutf8::index($$;$);
1685             sub Eoldutf8::rindex($$;$);
1686             sub Eoldutf8::lcfirst(@);
1687             sub Eoldutf8::lcfirst_();
1688             sub Eoldutf8::lc(@);
1689             sub Eoldutf8::lc_();
1690             sub Eoldutf8::ucfirst(@);
1691             sub Eoldutf8::ucfirst_();
1692             sub Eoldutf8::uc(@);
1693             sub Eoldutf8::uc_();
1694             sub Eoldutf8::fc(@);
1695             sub Eoldutf8::fc_();
1696             sub Eoldutf8::ignorecase;
1697             sub Eoldutf8::classic_character_class;
1698             sub Eoldutf8::capture;
1699             sub Eoldutf8::chr(;$);
1700             sub Eoldutf8::chr_();
1701             sub Eoldutf8::glob($);
1702             sub Eoldutf8::glob_();
1703              
1704             sub OldUTF8::ord(;$);
1705             sub OldUTF8::ord_();
1706             sub OldUTF8::reverse(@);
1707             sub OldUTF8::getc(;*@);
1708             sub OldUTF8::length(;$);
1709             sub OldUTF8::substr($$;$$);
1710             sub OldUTF8::index($$;$);
1711             sub OldUTF8::rindex($$;$);
1712             sub OldUTF8::escape(;$);
1713              
1714             #
1715             # Regexp work
1716             #
1717 302     302   20535 BEGIN { CORE::eval q{ use vars qw(
  302     302   1799  
  302         417  
  302         90677  
1718             $OldUTF8::re_a
1719             $OldUTF8::re_t
1720             $OldUTF8::re_n
1721             $OldUTF8::re_r
1722             ) } }
1723              
1724             #
1725             # Character class
1726             #
1727 302     302   18608 BEGIN { CORE::eval q{ use vars qw(
  302     302   1262  
  302         408  
  302         4387672  
1728             $dot
1729             $dot_s
1730             $eD
1731             $eS
1732             $eW
1733             $eH
1734             $eV
1735             $eR
1736             $eN
1737             $not_alnum
1738             $not_alpha
1739             $not_ascii
1740             $not_blank
1741             $not_cntrl
1742             $not_digit
1743             $not_graph
1744             $not_lower
1745             $not_lower_i
1746             $not_print
1747             $not_punct
1748             $not_space
1749             $not_upper
1750             $not_upper_i
1751             $not_word
1752             $not_xdigit
1753             $eb
1754             $eB
1755             ) } }
1756              
1757             ${Eoldutf8::dot} = qr{(?>[^\x80-\xFF\x0A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1758             ${Eoldutf8::dot_s} = qr{(?>[^\x80-\xFF]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1759             ${Eoldutf8::eD} = qr{(?>[^\x80-\xFF0-9]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1760              
1761             # Vertical tabs are now whitespace
1762             # \s in a regex now matches a vertical tab in all circumstances.
1763             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1764             # ${Eoldutf8::eS} = qr{(?>[^\x80-\xFF\x09\x0A \x0C\x0D\x20]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1765             # ${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])};
1766             ${Eoldutf8::eS} = qr{(?>[^\x80-\xFF\s]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1767              
1768             ${Eoldutf8::eW} = qr{(?>[^\x80-\xFF0-9A-Z_a-z]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1769             ${Eoldutf8::eH} = qr{(?>[^\x80-\xFF\x09\x20]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1770             ${Eoldutf8::eV} = qr{(?>[^\x80-\xFF\x0A\x0B\x0C\x0D]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1771             ${Eoldutf8::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
1772             ${Eoldutf8::eN} = qr{(?>[^\x80-\xFF\x0A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1773             ${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])};
1774             ${Eoldutf8::not_alpha} = qr{(?>[^\x80-\xFF\x41-\x5A\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1775             ${Eoldutf8::not_ascii} = qr{(?>[^\x80-\xFF\x00-\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1776             ${Eoldutf8::not_blank} = qr{(?>[^\x80-\xFF\x09\x20]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1777             ${Eoldutf8::not_cntrl} = qr{(?>[^\x80-\xFF\x00-\x1F\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1778             ${Eoldutf8::not_digit} = qr{(?>[^\x80-\xFF\x30-\x39]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1779             ${Eoldutf8::not_graph} = qr{(?>[^\x80-\xFF\x21-\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1780             ${Eoldutf8::not_lower} = qr{(?>[^\x80-\xFF\x61-\x7A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1781             ${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
1782             # ${Eoldutf8::not_lower_i} = qr{(?>[^\x80-\xFF]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])}; # older Perl compatible
1783             ${Eoldutf8::not_print} = qr{(?>[^\x80-\xFF\x20-\x7F]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1784             ${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])};
1785             ${Eoldutf8::not_space} = qr{(?>[^\x80-\xFF\s\x0B]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1786             ${Eoldutf8::not_upper} = qr{(?>[^\x80-\xFF\x41-\x5A]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])};
1787             ${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
1788             # ${Eoldutf8::not_upper_i} = qr{(?>[^\x80-\xFF]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])}; # older Perl compatible
1789             ${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])};
1790             ${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])};
1791             ${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))};
1792             ${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]))};
1793              
1794             # avoid: Name "Eoldutf8::foo" used only once: possible typo at here.
1795             ${Eoldutf8::dot} = ${Eoldutf8::dot};
1796             ${Eoldutf8::dot_s} = ${Eoldutf8::dot_s};
1797             ${Eoldutf8::eD} = ${Eoldutf8::eD};
1798             ${Eoldutf8::eS} = ${Eoldutf8::eS};
1799             ${Eoldutf8::eW} = ${Eoldutf8::eW};
1800             ${Eoldutf8::eH} = ${Eoldutf8::eH};
1801             ${Eoldutf8::eV} = ${Eoldutf8::eV};
1802             ${Eoldutf8::eR} = ${Eoldutf8::eR};
1803             ${Eoldutf8::eN} = ${Eoldutf8::eN};
1804             ${Eoldutf8::not_alnum} = ${Eoldutf8::not_alnum};
1805             ${Eoldutf8::not_alpha} = ${Eoldutf8::not_alpha};
1806             ${Eoldutf8::not_ascii} = ${Eoldutf8::not_ascii};
1807             ${Eoldutf8::not_blank} = ${Eoldutf8::not_blank};
1808             ${Eoldutf8::not_cntrl} = ${Eoldutf8::not_cntrl};
1809             ${Eoldutf8::not_digit} = ${Eoldutf8::not_digit};
1810             ${Eoldutf8::not_graph} = ${Eoldutf8::not_graph};
1811             ${Eoldutf8::not_lower} = ${Eoldutf8::not_lower};
1812             ${Eoldutf8::not_lower_i} = ${Eoldutf8::not_lower_i};
1813             ${Eoldutf8::not_print} = ${Eoldutf8::not_print};
1814             ${Eoldutf8::not_punct} = ${Eoldutf8::not_punct};
1815             ${Eoldutf8::not_space} = ${Eoldutf8::not_space};
1816             ${Eoldutf8::not_upper} = ${Eoldutf8::not_upper};
1817             ${Eoldutf8::not_upper_i} = ${Eoldutf8::not_upper_i};
1818             ${Eoldutf8::not_word} = ${Eoldutf8::not_word};
1819             ${Eoldutf8::not_xdigit} = ${Eoldutf8::not_xdigit};
1820             ${Eoldutf8::eb} = ${Eoldutf8::eb};
1821             ${Eoldutf8::eB} = ${Eoldutf8::eB};
1822              
1823             #
1824             # old UTF-8 split
1825             #
1826             sub Eoldutf8::split(;$$$) {
1827              
1828             # P.794 29.2.161. split
1829             # in Chapter 29: Functions
1830             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1831              
1832             # P.951 split
1833             # in Chapter 27: Functions
1834             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1835              
1836 0     0 0 0 my $pattern = $_[0];
1837 0         0 my $string = $_[1];
1838 0         0 my $limit = $_[2];
1839              
1840             # if $pattern is also omitted or is the literal space, " "
1841 0 0       0 if (not defined $pattern) {
1842 0         0 $pattern = ' ';
1843             }
1844              
1845             # if $string is omitted, the function splits the $_ string
1846 0 0       0 if (not defined $string) {
1847 0 0       0 if (defined $_) {
1848 0         0 $string = $_;
1849             }
1850             else {
1851 0         0 $string = '';
1852             }
1853             }
1854              
1855 0         0 my @split = ();
1856              
1857             # when string is empty
1858 0 0       0 if ($string eq '') {
    0          
1859              
1860             # resulting list value in list context
1861 0 0       0 if (wantarray) {
1862 0         0 return @split;
1863             }
1864              
1865             # count of substrings in scalar context
1866             else {
1867 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
1868 0         0 @_ = @split;
1869 0         0 return scalar @_;
1870             }
1871             }
1872              
1873             # split's first argument is more consistently interpreted
1874             #
1875             # After some changes earlier in v5.17, split's behavior has been simplified:
1876             # if the PATTERN argument evaluates to a string containing one space, it is
1877             # treated the way that a literal string containing one space once was.
1878             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
1879              
1880             # if $pattern is also omitted or is the literal space, " ", the function splits
1881             # on whitespace, /\s+/, after skipping any leading whitespace
1882             # (and so on)
1883              
1884             elsif ($pattern eq ' ') {
1885 0 0       0 if (not defined $limit) {
1886 0         0 return CORE::split(' ', $string);
1887             }
1888             else {
1889 0         0 return CORE::split(' ', $string, $limit);
1890             }
1891             }
1892              
1893             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
1894 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
1895              
1896             # a pattern capable of matching either the null string or something longer than the
1897             # null string will split the value of $string into separate characters wherever it
1898             # matches the null string between characters
1899             # (and so on)
1900              
1901 0 0       0 if ('' =~ / \A $pattern \z /xms) {
1902 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
1903 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
1904              
1905             # P.1024 Appendix W.10 Multibyte Processing
1906             # of ISBN 1-56592-224-7 CJKV Information Processing
1907             # (and so on)
1908              
1909             # the //m modifier is assumed when you split on the pattern /^/
1910             # (and so on)
1911              
1912             # V
1913 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
1914              
1915             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
1916             # is included in the resulting list, interspersed with the fields that are ordinarily returned
1917             # (and so on)
1918              
1919 0         0 local $@;
1920 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
1921 0         0 push @split, CORE::eval('$' . $digit);
1922             }
1923             }
1924             }
1925              
1926             else {
1927 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
1928              
1929             # V
1930 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
1931 0         0 local $@;
1932 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
1933 0         0 push @split, CORE::eval('$' . $digit);
1934             }
1935             }
1936             }
1937             }
1938              
1939             elsif ($limit > 0) {
1940 0 0       0 if ('' =~ / \A $pattern \z /xms) {
1941 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
1942 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
1943              
1944             # V
1945 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
1946 0         0 local $@;
1947 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
1948 0         0 push @split, CORE::eval('$' . $digit);
1949             }
1950             }
1951             }
1952             }
1953             else {
1954 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
1955 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
1956              
1957             # V
1958 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
1959 0         0 local $@;
1960 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
1961 0         0 push @split, CORE::eval('$' . $digit);
1962             }
1963             }
1964             }
1965             }
1966             }
1967              
1968 0 0       0 if (CORE::length($string) > 0) {
1969 0         0 push @split, $string;
1970             }
1971              
1972             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
1973 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
1974 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
1975 0         0 pop @split;
1976             }
1977             }
1978              
1979             # resulting list value in list context
1980 0 0       0 if (wantarray) {
1981 0         0 return @split;
1982             }
1983              
1984             # count of substrings in scalar context
1985             else {
1986 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
1987 0         0 @_ = @split;
1988 0         0 return scalar @_;
1989             }
1990             }
1991              
1992             #
1993             # get last subexpression offsets
1994             #
1995             sub _last_subexpression_offsets {
1996 0     0   0 my $pattern = $_[0];
1997              
1998             # remove comment
1999 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
2000              
2001 0         0 my $modifier = '';
2002 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
2003 0         0 $modifier = $1;
2004 0         0 $modifier =~ s/-[A-Za-z]*//;
2005             }
2006              
2007             # with /x modifier
2008 0         0 my @char = ();
2009 0 0       0 if ($modifier =~ /x/oxms) {
2010 0         0 @char = $pattern =~ /\G((?>
2011             [^\x80-\xFF\\\#\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
2012             \\ $q_char |
2013             \# (?>[^\n]*) $ |
2014             \[ (?>(?:[^\x80-\xFF\\\]]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF]|\\\\|\\\]|$q_char)+) \] |
2015             \(\? |
2016             $q_char
2017             ))/oxmsg;
2018             }
2019              
2020             # without /x modifier
2021             else {
2022 0         0 @char = $pattern =~ /\G((?>
2023             [^\x80-\xFF\\\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
2024             \\ $q_char |
2025             \[ (?>(?:[^\x80-\xFF\\\]]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF]|\\\\|\\\]|$q_char)+) \] |
2026             \(\? |
2027             $q_char
2028             ))/oxmsg;
2029             }
2030              
2031 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
2032             }
2033              
2034             #
2035             # old UTF-8 transliteration (tr///)
2036             #
2037             sub Eoldutf8::tr($$$$;$) {
2038              
2039 0     0 0 0 my $bind_operator = $_[1];
2040 0         0 my $searchlist = $_[2];
2041 0         0 my $replacementlist = $_[3];
2042 0   0     0 my $modifier = $_[4] || '';
2043              
2044 0 0       0 if ($modifier =~ /r/oxms) {
2045 0 0       0 if ($bind_operator =~ / !~ /oxms) {
2046 0         0 croak "Using !~ with tr///r doesn't make sense";
2047             }
2048             }
2049              
2050 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
2051 0         0 my @searchlist = _charlist_tr($searchlist);
2052 0         0 my @replacementlist = _charlist_tr($replacementlist);
2053              
2054 0         0 my %tr = ();
2055 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
2056 0 0       0 if (not exists $tr{$searchlist[$i]}) {
2057 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
2058 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
2059             }
2060             elsif ($modifier =~ /d/oxms) {
2061 0         0 $tr{$searchlist[$i]} = '';
2062             }
2063             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
2064 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
2065             }
2066             else {
2067 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
2068             }
2069             }
2070             }
2071              
2072 0         0 my $tr = 0;
2073 0         0 my $replaced = '';
2074 0 0       0 if ($modifier =~ /c/oxms) {
2075 0         0 while (defined(my $char = shift @char)) {
2076 0 0       0 if (not exists $tr{$char}) {
2077 0 0       0 if (defined $replacementlist[0]) {
2078 0         0 $replaced .= $replacementlist[0];
2079             }
2080 0         0 $tr++;
2081 0 0       0 if ($modifier =~ /s/oxms) {
2082 0   0     0 while (@char and (not exists $tr{$char[0]})) {
2083 0         0 shift @char;
2084 0         0 $tr++;
2085             }
2086             }
2087             }
2088             else {
2089 0         0 $replaced .= $char;
2090             }
2091             }
2092             }
2093             else {
2094 0         0 while (defined(my $char = shift @char)) {
2095 0 0       0 if (exists $tr{$char}) {
2096 0         0 $replaced .= $tr{$char};
2097 0         0 $tr++;
2098 0 0       0 if ($modifier =~ /s/oxms) {
2099 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
2100 0         0 shift @char;
2101 0         0 $tr++;
2102             }
2103             }
2104             }
2105             else {
2106 0         0 $replaced .= $char;
2107             }
2108             }
2109             }
2110              
2111 0 0       0 if ($modifier =~ /r/oxms) {
2112 0         0 return $replaced;
2113             }
2114             else {
2115 0         0 $_[0] = $replaced;
2116 0 0       0 if ($bind_operator =~ / !~ /oxms) {
2117 0         0 return not $tr;
2118             }
2119             else {
2120 0         0 return $tr;
2121             }
2122             }
2123             }
2124              
2125             #
2126             # old UTF-8 chop
2127             #
2128             sub Eoldutf8::chop(@) {
2129              
2130 0     0 0 0 my $chop;
2131 0 0       0 if (@_ == 0) {
2132 0         0 my @char = /\G (?>$q_char) /oxmsg;
2133 0         0 $chop = pop @char;
2134 0         0 $_ = join '', @char;
2135             }
2136             else {
2137 0         0 for (@_) {
2138 0         0 my @char = /\G (?>$q_char) /oxmsg;
2139 0         0 $chop = pop @char;
2140 0         0 $_ = join '', @char;
2141             }
2142             }
2143 0         0 return $chop;
2144             }
2145              
2146             #
2147             # old UTF-8 index by octet
2148             #
2149             sub Eoldutf8::index($$;$) {
2150              
2151 0     0 1 0 my($str,$substr,$position) = @_;
2152 0   0     0 $position ||= 0;
2153 0         0 my $pos = 0;
2154              
2155 0         0 while ($pos < CORE::length($str)) {
2156 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
2157 0 0       0 if ($pos >= $position) {
2158 0         0 return $pos;
2159             }
2160             }
2161 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
2162 0         0 $pos += CORE::length($1);
2163             }
2164             else {
2165 0         0 $pos += 1;
2166             }
2167             }
2168 0         0 return -1;
2169             }
2170              
2171             #
2172             # old UTF-8 reverse index
2173             #
2174             sub Eoldutf8::rindex($$;$) {
2175              
2176 0     0 0 0 my($str,$substr,$position) = @_;
2177 0   0     0 $position ||= CORE::length($str) - 1;
2178 0         0 my $pos = 0;
2179 0         0 my $rindex = -1;
2180              
2181 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
2182 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
2183 0         0 $rindex = $pos;
2184             }
2185 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
2186 0         0 $pos += CORE::length($1);
2187             }
2188             else {
2189 0         0 $pos += 1;
2190             }
2191             }
2192 0         0 return $rindex;
2193             }
2194              
2195             #
2196             # old UTF-8 lower case first with parameter
2197             #
2198             sub Eoldutf8::lcfirst(@) {
2199 0 0   0 0 0 if (@_) {
2200 0         0 my $s = shift @_;
2201 0 0 0     0 if (@_ and wantarray) {
2202 0         0 return Eoldutf8::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
2203             }
2204             else {
2205 0         0 return Eoldutf8::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
2206             }
2207             }
2208             else {
2209 0         0 return Eoldutf8::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2210             }
2211             }
2212              
2213             #
2214             # old UTF-8 lower case first without parameter
2215             #
2216             sub Eoldutf8::lcfirst_() {
2217 0     0 0 0 return Eoldutf8::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2218             }
2219              
2220             #
2221             # old UTF-8 lower case with parameter
2222             #
2223             sub Eoldutf8::lc(@) {
2224 0 0   0 0 0 if (@_) {
2225 0         0 my $s = shift @_;
2226 0 0 0     0 if (@_ and wantarray) {
2227 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
2228             }
2229             else {
2230 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
2231             }
2232             }
2233             else {
2234 0         0 return Eoldutf8::lc_();
2235             }
2236             }
2237              
2238             #
2239             # old UTF-8 lower case without parameter
2240             #
2241             sub Eoldutf8::lc_() {
2242 0     0 0 0 my $s = $_;
2243 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
2244             }
2245              
2246             #
2247             # old UTF-8 upper case first with parameter
2248             #
2249             sub Eoldutf8::ucfirst(@) {
2250 0 0   0 0 0 if (@_) {
2251 0         0 my $s = shift @_;
2252 0 0 0     0 if (@_ and wantarray) {
2253 0         0 return Eoldutf8::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
2254             }
2255             else {
2256 0         0 return Eoldutf8::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
2257             }
2258             }
2259             else {
2260 0         0 return Eoldutf8::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2261             }
2262             }
2263              
2264             #
2265             # old UTF-8 upper case first without parameter
2266             #
2267             sub Eoldutf8::ucfirst_() {
2268 0     0 0 0 return Eoldutf8::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
2269             }
2270              
2271             #
2272             # old UTF-8 upper case with parameter
2273             #
2274             sub Eoldutf8::uc(@) {
2275 2478 50   2478 0 2599 if (@_) {
2276 2478         1835 my $s = shift @_;
2277 2478 50 33     3915 if (@_ and wantarray) {
2278 0 0       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
2279             }
2280             else {
2281 2478 100       4813 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2478         5561  
2282             }
2283             }
2284             else {
2285 0         0 return Eoldutf8::uc_();
2286             }
2287             }
2288              
2289             #
2290             # old UTF-8 upper case without parameter
2291             #
2292             sub Eoldutf8::uc_() {
2293 0     0 0 0 my $s = $_;
2294 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
2295             }
2296              
2297             #
2298             # old UTF-8 fold case with parameter
2299             #
2300             sub Eoldutf8::fc(@) {
2301 2525 50   2525 0 2656 if (@_) {
2302 2525         1844 my $s = shift @_;
2303 2525 50 33     3848 if (@_ and wantarray) {
2304 0 0       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
2305             }
2306             else {
2307 2525 100       4211 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2525         6101  
2308             }
2309             }
2310             else {
2311 0         0 return Eoldutf8::fc_();
2312             }
2313             }
2314              
2315             #
2316             # old UTF-8 fold case without parameter
2317             #
2318             sub Eoldutf8::fc_() {
2319 0     0 0 0 my $s = $_;
2320 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
2321             }
2322              
2323             #
2324             # old UTF-8 regexp capture
2325             #
2326             {
2327             sub Eoldutf8::capture {
2328 0     0 1 0 return $_[0];
2329             }
2330             }
2331              
2332             #
2333             # old UTF-8 regexp ignore case modifier
2334             #
2335             sub Eoldutf8::ignorecase {
2336              
2337 0     0 0 0 my @string = @_;
2338 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
2339              
2340             # ignore case of $scalar or @array
2341 0         0 for my $string (@string) {
2342              
2343             # split regexp
2344 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
2345              
2346             # unescape character
2347 0         0 for (my $i=0; $i <= $#char; $i++) {
2348 0 0       0 next if not defined $char[$i];
2349              
2350             # open character class [...]
2351 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
2352 0         0 my $left = $i;
2353              
2354             # [] make die "unmatched [] in regexp ...\n"
2355              
2356 0 0       0 if ($char[$i+1] eq ']') {
2357 0         0 $i++;
2358             }
2359              
2360 0         0 while (1) {
2361 0 0       0 if (++$i > $#char) {
2362 0         0 croak "Unmatched [] in regexp";
2363             }
2364 0 0       0 if ($char[$i] eq ']') {
2365 0         0 my $right = $i;
2366 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
2367              
2368             # escape character
2369 0         0 for my $char (@charlist) {
2370 0 0       0 if (0) {
2371             }
2372              
2373 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
2374 0         0 $char = '\\' . $char;
2375             }
2376             }
2377              
2378             # [...]
2379 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
2380              
2381 0         0 $i = $left;
2382 0         0 last;
2383             }
2384             }
2385             }
2386              
2387             # open character class [^...]
2388             elsif ($char[$i] eq '[^') {
2389 0         0 my $left = $i;
2390              
2391             # [^] make die "unmatched [] in regexp ...\n"
2392              
2393 0 0       0 if ($char[$i+1] eq ']') {
2394 0         0 $i++;
2395             }
2396              
2397 0         0 while (1) {
2398 0 0       0 if (++$i > $#char) {
2399 0         0 croak "Unmatched [] in regexp";
2400             }
2401 0 0       0 if ($char[$i] eq ']') {
2402 0         0 my $right = $i;
2403 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
2404              
2405             # escape character
2406 0         0 for my $char (@charlist) {
2407 0 0       0 if (0) {
2408             }
2409              
2410 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
2411 0         0 $char = '\\' . $char;
2412             }
2413             }
2414              
2415             # [^...]
2416 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
2417              
2418 0         0 $i = $left;
2419 0         0 last;
2420             }
2421             }
2422             }
2423              
2424             # rewrite classic character class or escape character
2425             elsif (my $char = classic_character_class($char[$i])) {
2426 0         0 $char[$i] = $char;
2427             }
2428              
2429             # with /i modifier
2430             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
2431 0         0 my $uc = Eoldutf8::uc($char[$i]);
2432 0         0 my $fc = Eoldutf8::fc($char[$i]);
2433 0 0       0 if ($uc ne $fc) {
2434 0 0       0 if (CORE::length($fc) == 1) {
2435 0         0 $char[$i] = '[' . $uc . $fc . ']';
2436             }
2437             else {
2438 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
2439             }
2440             }
2441             }
2442             }
2443              
2444             # characterize
2445 0         0 for (my $i=0; $i <= $#char; $i++) {
2446 0 0       0 next if not defined $char[$i];
2447              
2448 0 0       0 if (0) {
2449             }
2450              
2451             # quote character before ? + * {
2452 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
2453 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
2454 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
2455             }
2456             }
2457             }
2458              
2459 0         0 $string = join '', @char;
2460             }
2461              
2462             # make regexp string
2463 0         0 return @string;
2464             }
2465              
2466             #
2467             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
2468             #
2469             sub Eoldutf8::classic_character_class {
2470 2815     2815 0 2295 my($char) = @_;
2471              
2472             return {
2473             '\D' => '${Eoldutf8::eD}',
2474             '\S' => '${Eoldutf8::eS}',
2475             '\W' => '${Eoldutf8::eW}',
2476             '\d' => '[0-9]',
2477              
2478             # Before Perl 5.6, \s only matched the five whitespace characters
2479             # tab, newline, form-feed, carriage return, and the space character
2480             # itself, which, taken together, is the character class [\t\n\f\r ].
2481              
2482             # Vertical tabs are now whitespace
2483             # \s in a regex now matches a vertical tab in all circumstances.
2484             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
2485             # \t \n \v \f \r space
2486             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
2487             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
2488             '\s' => '\s',
2489              
2490             '\w' => '[0-9A-Z_a-z]',
2491             '\C' => '[\x00-\xFF]',
2492             '\X' => 'X',
2493              
2494             # \h \v \H \V
2495              
2496             # P.114 Character Class Shortcuts
2497             # in Chapter 7: In the World of Regular Expressions
2498             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
2499              
2500             # P.357 13.2.3 Whitespace
2501             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
2502             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
2503             #
2504             # 0x00009 CHARACTER TABULATION h s
2505             # 0x0000a LINE FEED (LF) vs
2506             # 0x0000b LINE TABULATION v
2507             # 0x0000c FORM FEED (FF) vs
2508             # 0x0000d CARRIAGE RETURN (CR) vs
2509             # 0x00020 SPACE h s
2510              
2511             # P.196 Table 5-9. Alphanumeric regex metasymbols
2512             # in Chapter 5. Pattern Matching
2513             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2514              
2515             # (and so on)
2516              
2517             '\H' => '${Eoldutf8::eH}',
2518             '\V' => '${Eoldutf8::eV}',
2519             '\h' => '[\x09\x20]',
2520             '\v' => '[\x0A\x0B\x0C\x0D]',
2521             '\R' => '${Eoldutf8::eR}',
2522              
2523             # \N
2524             #
2525             # http://perldoc.perl.org/perlre.html
2526             # Character Classes and other Special Escapes
2527             # Any character but \n (experimental). Not affected by /s modifier
2528              
2529             '\N' => '${Eoldutf8::eN}',
2530              
2531             # \b \B
2532              
2533             # P.180 Boundaries: The \b and \B Assertions
2534             # in Chapter 5: Pattern Matching
2535             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2536              
2537             # P.219 Boundaries: The \b and \B Assertions
2538             # in Chapter 5: Pattern Matching
2539             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2540              
2541             # \b really means (?:(?<=\w)(?!\w)|(?
2542             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
2543             '\b' => '${Eoldutf8::eb}',
2544              
2545             # \B really means (?:(?<=\w)(?=\w)|(?
2546             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
2547             '\B' => '${Eoldutf8::eB}',
2548              
2549 2815   100     109680 }->{$char} || '';
2550             }
2551              
2552             #
2553             # prepare old UTF-8 characters per length
2554             #
2555              
2556             # 1 octet characters
2557             my @chars1 = ();
2558             sub chars1 {
2559 0 0   0 0 0 if (@chars1) {
2560 0         0 return @chars1;
2561             }
2562 0 0       0 if (exists $range_tr{1}) {
2563 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
2564 0         0 while (my @range = splice(@ranges,0,1)) {
2565 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2566 0         0 push @chars1, pack 'C', $oct0;
2567             }
2568             }
2569             }
2570 0         0 return @chars1;
2571             }
2572              
2573             # 2 octets characters
2574             my @chars2 = ();
2575             sub chars2 {
2576 0 0   0 0 0 if (@chars2) {
2577 0         0 return @chars2;
2578             }
2579 0 0       0 if (exists $range_tr{2}) {
2580 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
2581 0         0 while (my @range = splice(@ranges,0,2)) {
2582 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2583 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
2584 0         0 push @chars2, pack 'CC', $oct0,$oct1;
2585             }
2586             }
2587             }
2588             }
2589 0         0 return @chars2;
2590             }
2591              
2592             # 3 octets characters
2593             my @chars3 = ();
2594             sub chars3 {
2595 0 0   0 0 0 if (@chars3) {
2596 0         0 return @chars3;
2597             }
2598 0 0       0 if (exists $range_tr{3}) {
2599 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
2600 0         0 while (my @range = splice(@ranges,0,3)) {
2601 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2602 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
2603 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
2604 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
2605             }
2606             }
2607             }
2608             }
2609             }
2610 0         0 return @chars3;
2611             }
2612              
2613             # 4 octets characters
2614             my @chars4 = ();
2615             sub chars4 {
2616 0 0   0 0 0 if (@chars4) {
2617 0         0 return @chars4;
2618             }
2619 0 0       0 if (exists $range_tr{4}) {
2620 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
2621 0         0 while (my @range = splice(@ranges,0,4)) {
2622 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
2623 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
2624 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
2625 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
2626 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
2627             }
2628             }
2629             }
2630             }
2631             }
2632             }
2633 0         0 return @chars4;
2634             }
2635              
2636             #
2637             # old UTF-8 open character list for tr
2638             #
2639             sub _charlist_tr {
2640              
2641 0     0   0 local $_ = shift @_;
2642              
2643             # unescape character
2644 0         0 my @char = ();
2645 0         0 while (not /\G \z/oxmsgc) {
2646 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
2647 0         0 push @char, '\-';
2648             }
2649             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
2650 0         0 push @char, CORE::chr(oct $1);
2651             }
2652             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
2653 0         0 push @char, CORE::chr(hex $1);
2654             }
2655             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
2656 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
2657             }
2658             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
2659             push @char, {
2660             '\0' => "\0",
2661             '\n' => "\n",
2662             '\r' => "\r",
2663             '\t' => "\t",
2664             '\f' => "\f",
2665             '\b' => "\x08", # \b means backspace in character class
2666             '\a' => "\a",
2667             '\e' => "\e",
2668 0         0 }->{$1};
2669             }
2670             elsif (/\G \\ ($q_char) /oxmsgc) {
2671 0         0 push @char, $1;
2672             }
2673             elsif (/\G ($q_char) /oxmsgc) {
2674 0         0 push @char, $1;
2675             }
2676             }
2677              
2678             # join separated multiple-octet
2679 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
2680              
2681             # unescape '-'
2682 0         0 my @i = ();
2683 0         0 for my $i (0 .. $#char) {
2684 0 0       0 if ($char[$i] eq '\-') {
    0          
2685 0         0 $char[$i] = '-';
2686             }
2687             elsif ($char[$i] eq '-') {
2688 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
2689 0         0 push @i, $i;
2690             }
2691             }
2692             }
2693              
2694             # open character list (reverse for splice)
2695 0         0 for my $i (CORE::reverse @i) {
2696 0         0 my @range = ();
2697              
2698             # range error
2699 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
2700 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2701             }
2702              
2703             # range of multiple-octet code
2704 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
2705 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
2706 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
2707             }
2708             elsif (CORE::length($char[$i+1]) == 2) {
2709 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
2710 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
2711             }
2712             elsif (CORE::length($char[$i+1]) == 3) {
2713 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
2714 0         0 push @range, chars2();
2715 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
2716             }
2717             elsif (CORE::length($char[$i+1]) == 4) {
2718 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
2719 0         0 push @range, chars2();
2720 0         0 push @range, chars3();
2721 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
2722             }
2723             else {
2724 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2725             }
2726             }
2727             elsif (CORE::length($char[$i-1]) == 2) {
2728 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
2729 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
2730             }
2731             elsif (CORE::length($char[$i+1]) == 3) {
2732 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
2733 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
2734             }
2735             elsif (CORE::length($char[$i+1]) == 4) {
2736 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
2737 0         0 push @range, chars3();
2738 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
2739             }
2740             else {
2741 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2742             }
2743             }
2744             elsif (CORE::length($char[$i-1]) == 3) {
2745 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
2746 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
2747             }
2748             elsif (CORE::length($char[$i+1]) == 4) {
2749 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
2750 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
2751             }
2752             else {
2753 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2754             }
2755             }
2756             elsif (CORE::length($char[$i-1]) == 4) {
2757 0 0       0 if (CORE::length($char[$i+1]) == 4) {
2758 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
2759             }
2760             else {
2761 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2762             }
2763             }
2764             else {
2765 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
2766             }
2767              
2768 0         0 splice @char, $i-1, 3, @range;
2769             }
2770              
2771 0         0 return @char;
2772             }
2773              
2774             #
2775             # old UTF-8 open character class
2776             #
2777             sub _cc {
2778 753 50   753   1308 if (scalar(@_) == 0) {
    100          
    50          
2779 0         0 die __FILE__, ": subroutine cc got no parameter.\n";
2780             }
2781             elsif (scalar(@_) == 1) {
2782 382         983 return sprintf('\x%02X',$_[0]);
2783             }
2784             elsif (scalar(@_) == 2) {
2785 371 50       793 if ($_[0] > $_[1]) {
    100          
    100          
2786 0         0 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
2787             }
2788             elsif ($_[0] == $_[1]) {
2789 20         46 return sprintf('\x%02X',$_[0]);
2790             }
2791             elsif (($_[0]+1) == $_[1]) {
2792 20         45 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
2793             }
2794             else {
2795 331         1223 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
2796             }
2797             }
2798             else {
2799 0         0 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
2800             }
2801             }
2802              
2803             #
2804             # old UTF-8 octet range
2805             #
2806             sub _octets {
2807 557     557   660 my $length = shift @_;
2808              
2809 557 100       932 if ($length == 1) {
    100          
    50          
    0          
2810 406         933 my($a1) = unpack 'C', $_[0];
2811 406         548 my($z1) = unpack 'C', $_[1];
2812              
2813 406 50       669 if ($a1 > $z1) {
2814 0         0 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
2815             }
2816              
2817 406 50       801 if ($a1 == $z1) {
    50          
2818 0         0 return sprintf('\x%02X',$a1);
2819             }
2820             elsif (($a1+1) == $z1) {
2821 0         0 return sprintf('\x%02X\x%02X',$a1,$z1);
2822             }
2823             else {
2824 406         2275 return sprintf('\x%02X-\x%02X',$a1,$z1);
2825             }
2826             }
2827             elsif ($length == 2) {
2828 20         39 my($a1,$a2) = unpack 'CC', $_[0];
2829 20         23 my($z1,$z2) = unpack 'CC', $_[1];
2830 20         28 my($A1,$A2) = unpack 'CC', $_[2];
2831 20         24 my($Z1,$Z2) = unpack 'CC', $_[3];
2832              
2833 20 50       41 if ($a1 == $z1) {
    50          
2834             return (
2835             # 11111111 222222222222
2836             # A A Z
2837 0         0 _cc($a1) . _cc($a2,$z2), # a2-z2
2838             );
2839             }
2840             elsif (($a1+1) == $z1) {
2841             return (
2842             # 11111111111 222222222222
2843             # A Z A Z
2844 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
2845             _cc( $z1) . _cc($A2,$z2), # -z2
2846             );
2847             }
2848             else {
2849             return (
2850             # 1111111111111111 222222222222
2851             # A Z A Z
2852 20         36 _cc($a1) . _cc($a2,$Z2), # a2-
2853             _cc($a1+1,$z1-1) . _cc($A2,$Z2), # -
2854             _cc( $z1) . _cc($A2,$z2), # -z2
2855             );
2856             }
2857             }
2858             elsif ($length == 3) {
2859 131         315 my($a1,$a2,$a3) = unpack 'CCC', $_[0];
2860 131         191 my($z1,$z2,$z3) = unpack 'CCC', $_[1];
2861 131         186 my($A1,$A2,$A3) = unpack 'CCC', $_[2];
2862 131         174 my($Z1,$Z2,$Z3) = unpack 'CCC', $_[3];
2863              
2864 131 100       222 if ($a1 == $z1) {
    50          
2865 111 50       168 if ($a2 == $z2) {
    0          
2866             return (
2867             # 11111111 22222222 333333333333
2868             # A A A Z
2869 111         220 _cc($a1) . _cc($a2) . _cc($a3,$z3), # a3-z3
2870             );
2871             }
2872             elsif (($a2+1) == $z2) {
2873             return (
2874             # 11111111 22222222222 333333333333
2875             # A A Z A Z
2876 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2877             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
2878             );
2879             }
2880             else {
2881             return (
2882             # 11111111 2222222222222222 333333333333
2883             # A A Z A Z
2884 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2885             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3), # -
2886             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
2887             );
2888             }
2889             }
2890             elsif (($a1+1) == $z1) {
2891             return (
2892             # 11111111111 22222222222222 333333333333
2893             # A Z A Z A Z
2894 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2895             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
2896             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
2897             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
2898             );
2899             }
2900             else {
2901             return (
2902             # 1111111111111111 22222222222222 333333333333
2903             # A Z A Z A Z
2904 20         27 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
2905             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
2906             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3), # -
2907             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
2908             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
2909             );
2910             }
2911             }
2912             elsif ($length == 4) {
2913 0         0 my($a1,$a2,$a3,$a4) = unpack 'CCCC', $_[0];
2914 0         0 my($z1,$z2,$z3,$z4) = unpack 'CCCC', $_[1];
2915 0         0 my($A1,$A2,$A3,$A4) = unpack 'CCCC', $_[0];
2916 0         0 my($Z1,$Z2,$Z3,$Z4) = unpack 'CCCC', $_[1];
2917              
2918 0 0       0 if ($a1 == $z1) {
    0          
2919 0 0       0 if ($a2 == $z2) {
    0          
2920 0 0       0 if ($a3 == $z3) {
    0          
2921             return (
2922             # 11111111 22222222 33333333 444444444444
2923             # A A A A Z
2924 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$z4), # a4-z4
2925             );
2926             }
2927             elsif (($a3+1) == $z3) {
2928             return (
2929             # 11111111 22222222 33333333333 444444444444
2930             # A A A Z A Z
2931 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
2932             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
2933             );
2934             }
2935             else {
2936             return (
2937             # 11111111 22222222 3333333333333333 444444444444
2938             # A A A Z A Z
2939 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
2940             _cc($a1) . _cc($a2) . _cc($a3+1,$z3-1) . _cc($A4,$Z4), # -
2941             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
2942             );
2943             }
2944             }
2945             elsif (($a2+1) == $z2) {
2946             return (
2947             # 11111111 22222222222 33333333333333 444444444444
2948             # A A Z A Z A Z
2949 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
2950             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
2951             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
2952             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
2953             );
2954             }
2955             else {
2956             return (
2957             # 11111111 2222222222222222 33333333333333 444444444444
2958             # A A Z A Z A Z
2959 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
2960             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
2961             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
2962             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
2963             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
2964             );
2965             }
2966             }
2967             elsif (($a1+1) == $z1) {
2968             return (
2969             # 11111111111 22222222222222 33333333333333 444444444444
2970             # A Z A Z A Z A Z
2971 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
2972             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
2973             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
2974             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
2975             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
2976             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
2977             );
2978             }
2979             else {
2980             return (
2981             # 1111111111111111 22222222222222 33333333333333 444444444444
2982             # A Z A Z A Z A Z
2983 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
2984             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
2985             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
2986             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
2987             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
2988             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
2989             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
2990             );
2991             }
2992             }
2993             else {
2994 0         0 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
2995             }
2996             }
2997              
2998             #
2999             # old UTF-8 range regexp
3000             #
3001             sub _range_regexp {
3002 537     537   686 my($length,$first,$last) = @_;
3003              
3004 537         608 my @range_regexp = ();
3005 537 50       1081 if (not exists $range_tr{$length}) {
3006 0         0 return @range_regexp;
3007             }
3008              
3009 537         466 my @ranges = @{ $range_tr{$length} };
  537         1035  
3010 537         1385 while (my @range = splice(@ranges,0,$length)) {
3011 923         765 my $min = '';
3012 923         663 my $max = '';
3013 923         1457 for (my $i=0; $i < $length; $i++) {
3014 1205         2309 $min .= pack 'C', $range[$i][0];
3015 1205         2071 $max .= pack 'C', $range[$i][-1];
3016             }
3017              
3018             # min___max
3019             # FIRST_____________LAST
3020             # (nothing)
3021              
3022 923 50 66     9244 if ($max lt $first) {
    100 100        
    50 33        
    100 100        
    100 66        
    100 66        
    50 66        
3023             }
3024              
3025             # **********
3026             # min_________max
3027             # FIRST_____________LAST
3028             # **********
3029              
3030             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
3031 28         50 push @range_regexp, _octets($length,$first,$max,$min,$max);
3032             }
3033              
3034             # **********************
3035             # min________________max
3036             # FIRST_____________LAST
3037             # **********************
3038              
3039             elsif (($min eq $first) and ($max eq $last)) {
3040 0         0 push @range_regexp, _octets($length,$first,$last,$min,$max);
3041             }
3042              
3043             # *********
3044             # min___max
3045             # FIRST_____________LAST
3046             # *********
3047              
3048             elsif (($first le $min) and ($max le $last)) {
3049 40         55 push @range_regexp, _octets($length,$min,$max,$min,$max);
3050             }
3051              
3052             # **********************
3053             # min__________________________max
3054             # FIRST_____________LAST
3055             # **********************
3056              
3057             elsif (($min le $first) and ($last le $max)) {
3058 469         824 push @range_regexp, _octets($length,$first,$last,$min,$max);
3059             }
3060              
3061             # *********
3062             # min________max
3063             # FIRST_____________LAST
3064             # *********
3065              
3066             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
3067 20         32 push @range_regexp, _octets($length,$min,$last,$min,$max);
3068             }
3069              
3070             # min___max
3071             # FIRST_____________LAST
3072             # (nothing)
3073              
3074             elsif ($last lt $min) {
3075             }
3076              
3077             else {
3078 0         0 die __FILE__, ": subroutine _range_regexp panic.\n";
3079             }
3080             }
3081              
3082 537         949 return @range_regexp;
3083             }
3084              
3085             #
3086             # old UTF-8 open character list for qr and not qr
3087             #
3088             sub _charlist {
3089              
3090 770     770   984 my $modifier = pop @_;
3091 770         1200 my @char = @_;
3092              
3093 770 100       1422 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
3094              
3095             # unescape character
3096 770         1779 for (my $i=0; $i <= $#char; $i++) {
3097              
3098             # escape - to ...
3099 2660 100 100     19744 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
3100 522 100 100     1869 if ((0 < $i) and ($i < $#char)) {
3101 497         889 $char[$i] = '...';
3102             }
3103             }
3104              
3105             # octal escape sequence
3106             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
3107 0         0 $char[$i] = octchr($1);
3108             }
3109              
3110             # hexadecimal escape sequence
3111             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
3112 0         0 $char[$i] = hexchr($1);
3113             }
3114              
3115             # \b{...} --> b\{...}
3116             # \B{...} --> B\{...}
3117             # \N{CHARNAME} --> N\{CHARNAME}
3118             # \p{PROPERTY} --> p\{PROPERTY}
3119             # \P{PROPERTY} --> P\{PROPERTY}
3120             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
3121 0         0 $char[$i] = $1 . '\\' . $2;
3122             }
3123              
3124             # \p, \P, \X --> p, P, X
3125             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
3126 0         0 $char[$i] = $1;
3127             }
3128              
3129             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
3130 0         0 $char[$i] = CORE::chr oct $1;
3131             }
3132             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
3133 206         680 $char[$i] = CORE::chr hex $1;
3134             }
3135             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
3136 0         0 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
3137             }
3138             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
3139             $char[$i] = {
3140             '\0' => "\0",
3141             '\n' => "\n",
3142             '\r' => "\r",
3143             '\t' => "\t",
3144             '\f' => "\f",
3145             '\b' => "\x08", # \b means backspace in character class
3146             '\a' => "\a",
3147             '\e' => "\e",
3148             '\d' => '[0-9]',
3149              
3150             # Vertical tabs are now whitespace
3151             # \s in a regex now matches a vertical tab in all circumstances.
3152             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
3153             # \t \n \v \f \r space
3154             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
3155             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
3156             '\s' => '\s',
3157              
3158             '\w' => '[0-9A-Z_a-z]',
3159             '\D' => '${Eoldutf8::eD}',
3160             '\S' => '${Eoldutf8::eS}',
3161             '\W' => '${Eoldutf8::eW}',
3162              
3163             '\H' => '${Eoldutf8::eH}',
3164             '\V' => '${Eoldutf8::eV}',
3165             '\h' => '[\x09\x20]',
3166             '\v' => '[\x0A\x0B\x0C\x0D]',
3167             '\R' => '${Eoldutf8::eR}',
3168              
3169 33         463 }->{$1};
3170             }
3171              
3172             # POSIX-style character classes
3173             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
3174             $char[$i] = {
3175              
3176             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
3177             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
3178             '[:^lower:]' => '${Eoldutf8::not_lower_i}',
3179             '[:^upper:]' => '${Eoldutf8::not_upper_i}',
3180              
3181 8         57 }->{$1};
3182             }
3183             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
3184             $char[$i] = {
3185              
3186             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
3187             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
3188             '[:ascii:]' => '[\x00-\x7F]',
3189             '[:blank:]' => '[\x09\x20]',
3190             '[:cntrl:]' => '[\x00-\x1F\x7F]',
3191             '[:digit:]' => '[\x30-\x39]',
3192             '[:graph:]' => '[\x21-\x7F]',
3193             '[:lower:]' => '[\x61-\x7A]',
3194             '[:print:]' => '[\x20-\x7F]',
3195             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
3196              
3197             # P.174 POSIX-Style Character Classes
3198             # in Chapter 5: Pattern Matching
3199             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3200              
3201             # P.311 11.2.4 Character Classes and other Special Escapes
3202             # in Chapter 11: perlre: Perl regular expressions
3203             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
3204              
3205             # P.210 POSIX-Style Character Classes
3206             # in Chapter 5: Pattern Matching
3207             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3208              
3209             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
3210              
3211             '[:upper:]' => '[\x41-\x5A]',
3212             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
3213             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
3214             '[:^alnum:]' => '${Eoldutf8::not_alnum}',
3215             '[:^alpha:]' => '${Eoldutf8::not_alpha}',
3216             '[:^ascii:]' => '${Eoldutf8::not_ascii}',
3217             '[:^blank:]' => '${Eoldutf8::not_blank}',
3218             '[:^cntrl:]' => '${Eoldutf8::not_cntrl}',
3219             '[:^digit:]' => '${Eoldutf8::not_digit}',
3220             '[:^graph:]' => '${Eoldutf8::not_graph}',
3221             '[:^lower:]' => '${Eoldutf8::not_lower}',
3222             '[:^print:]' => '${Eoldutf8::not_print}',
3223             '[:^punct:]' => '${Eoldutf8::not_punct}',
3224             '[:^space:]' => '${Eoldutf8::not_space}',
3225             '[:^upper:]' => '${Eoldutf8::not_upper}',
3226             '[:^word:]' => '${Eoldutf8::not_word}',
3227             '[:^xdigit:]' => '${Eoldutf8::not_xdigit}',
3228              
3229 70         1363 }->{$1};
3230             }
3231             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
3232 7         32 $char[$i] = $1;
3233             }
3234             }
3235              
3236             # open character list
3237 770         986 my @singleoctet = ();
3238 770         754 my @multipleoctet = ();
3239 770         1435 for (my $i=0; $i <= $#char; ) {
3240              
3241             # escaped -
3242 2163 100 100     9002 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
3243 497         398 $i += 1;
3244 497         788 next;
3245             }
3246              
3247             # make range regexp
3248             elsif ($char[$i] eq '...') {
3249              
3250             # range error
3251 497 50       1620 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    100          
3252 0         0 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
3253             }
3254             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
3255 477 50       974 if ($char[$i-1] gt $char[$i+1]) {
3256 0         0 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
3257             }
3258             }
3259              
3260             # make range regexp per length
3261 497         1137 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
3262 537         538 my @regexp = ();
3263              
3264             # is first and last
3265 537 100 100     1991 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    100 66        
    100          
    50          
3266 477         1006 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
3267             }
3268              
3269             # is first
3270             elsif ($length == CORE::length($char[$i-1])) {
3271 20         60 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
3272             }
3273              
3274             # is inside in first and last
3275             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
3276 20         51 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
3277             }
3278              
3279             # is last
3280             elsif ($length == CORE::length($char[$i+1])) {
3281 20         47 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
3282             }
3283              
3284             else {
3285 0         0 die __FILE__, ": subroutine make_regexp panic.\n";
3286             }
3287              
3288 537 100       790 if ($length == 1) {
3289 386         702 push @singleoctet, @regexp;
3290             }
3291             else {
3292 151         249 push @multipleoctet, @regexp;
3293             }
3294             }
3295              
3296 497         843 $i += 2;
3297             }
3298              
3299             # with /i modifier
3300             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
3301 764 100       898 if ($modifier =~ /i/oxms) {
3302 192         252 my $uc = Eoldutf8::uc($char[$i]);
3303 192         273 my $fc = Eoldutf8::fc($char[$i]);
3304 192 50       244 if ($uc ne $fc) {
3305 192 50       193 if (CORE::length($fc) == 1) {
3306 192         266 push @singleoctet, $uc, $fc;
3307             }
3308             else {
3309 0         0 push @singleoctet, $uc;
3310 0         0 push @multipleoctet, $fc;
3311             }
3312             }
3313             else {
3314 0         0 push @singleoctet, $char[$i];
3315             }
3316             }
3317             else {
3318 572         599 push @singleoctet, $char[$i];
3319             }
3320 764         1097 $i += 1;
3321             }
3322              
3323             # single character of single octet code
3324             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
3325 0         0 push @singleoctet, "\t", "\x20";
3326 0         0 $i += 1;
3327             }
3328             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
3329 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
3330 0         0 $i += 1;
3331             }
3332             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
3333 2         5 push @singleoctet, $char[$i];
3334 2         5 $i += 1;
3335             }
3336              
3337             # single character of multiple-octet code
3338             else {
3339 403         448 push @multipleoctet, $char[$i];
3340 403         603 $i += 1;
3341             }
3342             }
3343              
3344             # quote metachar
3345 770         1336 for (@singleoctet) {
3346 1364 50       5467 if ($_ eq '...') {
    100          
    100          
    100          
    100          
3347 0         0 $_ = '-';
3348             }
3349             elsif (/\A \n \z/oxms) {
3350 8         13 $_ = '\n';
3351             }
3352             elsif (/\A \r \z/oxms) {
3353 8         12 $_ = '\r';
3354             }
3355             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
3356 1         5 $_ = sprintf('\x%02X', CORE::ord $1);
3357             }
3358             elsif (/\A [\x00-\xFF] \z/oxms) {
3359 939         984 $_ = quotemeta $_;
3360             }
3361             }
3362              
3363             # return character list
3364 770         1845 return \@singleoctet, \@multipleoctet;
3365             }
3366              
3367             #
3368             # old UTF-8 octal escape sequence
3369             #
3370             sub octchr {
3371 5     5 0 9 my($octdigit) = @_;
3372              
3373 5         8 my @binary = ();
3374 5         20 for my $octal (split(//,$octdigit)) {
3375             push @binary, {
3376             '0' => '000',
3377             '1' => '001',
3378             '2' => '010',
3379             '3' => '011',
3380             '4' => '100',
3381             '5' => '101',
3382             '6' => '110',
3383             '7' => '111',
3384 50         149 }->{$octal};
3385             }
3386 5         13 my $binary = join '', @binary;
3387              
3388             my $octchr = {
3389             # 1234567
3390             1 => pack('B*', "0000000$binary"),
3391             2 => pack('B*', "000000$binary"),
3392             3 => pack('B*', "00000$binary"),
3393             4 => pack('B*', "0000$binary"),
3394             5 => pack('B*', "000$binary"),
3395             6 => pack('B*', "00$binary"),
3396             7 => pack('B*', "0$binary"),
3397             0 => pack('B*', "$binary"),
3398              
3399 5         68 }->{CORE::length($binary) % 8};
3400              
3401 5         19 return $octchr;
3402             }
3403              
3404             #
3405             # old UTF-8 hexadecimal escape sequence
3406             #
3407             sub hexchr {
3408 5     5 0 12 my($hexdigit) = @_;
3409              
3410             my $hexchr = {
3411             1 => pack('H*', "0$hexdigit"),
3412             0 => pack('H*', "$hexdigit"),
3413              
3414 5         41 }->{CORE::length($_[0]) % 2};
3415              
3416 5         17 return $hexchr;
3417             }
3418              
3419             #
3420             # old UTF-8 open character list for qr
3421             #
3422             sub charlist_qr {
3423              
3424 531     531 0 738 my $modifier = pop @_;
3425 531         1020 my @char = @_;
3426              
3427 531         1134 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
3428 531         858 my @singleoctet = @$singleoctet;
3429 531         638 my @multipleoctet = @$multipleoctet;
3430              
3431             # return character list
3432 531 100       996 if (scalar(@singleoctet) >= 1) {
3433              
3434             # with /i modifier
3435 384 100       730 if ($modifier =~ m/i/oxms) {
3436 107         147 my %singleoctet_ignorecase = ();
3437 107         129 for (@singleoctet) {
3438 272   66     843 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
3439 80         236 for my $ord (hex($1) .. hex($2)) {
3440 1091         855 my $char = CORE::chr($ord);
3441 1091         1049 my $uc = Eoldutf8::uc($char);
3442 1091         1163 my $fc = Eoldutf8::fc($char);
3443 1091 100       1225 if ($uc eq $fc) {
3444 502         925 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
3445             }
3446             else {
3447 589 50       551 if (CORE::length($fc) == 1) {
3448 589         869 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3449 589         1185 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
3450             }
3451             else {
3452 0         0 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3453 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
3454             }
3455             }
3456             }
3457             }
3458 272 100       381 if ($_ ne '') {
3459 192         413 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
3460             }
3461             }
3462 107         90 my $i = 0;
3463 107         108 my @singleoctet_ignorecase = ();
3464 107         147 for my $ord (0 .. 255) {
3465 27392 100       22792 if (exists $singleoctet_ignorecase{$ord}) {
3466 1622         876 push @{$singleoctet_ignorecase[$i]}, $ord;
  1622         1767  
3467             }
3468             else {
3469 25770         15747 $i++;
3470             }
3471             }
3472 107         148 @singleoctet = ();
3473 107         199 for my $range (@singleoctet_ignorecase) {
3474 11367 100       14759 if (ref $range) {
3475 214 50       172 if (scalar(@{$range}) == 1) {
  214 50       324  
3476 0         0 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  0         0  
3477             }
3478 214         237 elsif (scalar(@{$range}) == 2) {
3479 0         0 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
3480             }
3481             else {
3482 214         186 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         198  
  214         790  
3483             }
3484             }
3485             }
3486             }
3487              
3488 384         415 my $not_anchor = '';
3489 384         365 $not_anchor = '(?!(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF]))';
3490              
3491 384         818 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
3492             }
3493 531 100       879 if (scalar(@multipleoctet) >= 2) {
3494 102         504 return '(?:' . join('|', @multipleoctet) . ')';
3495             }
3496             else {
3497 429         1517 return $multipleoctet[0];
3498             }
3499             }
3500              
3501             #
3502             # old UTF-8 open character list for not qr
3503             #
3504             sub charlist_not_qr {
3505              
3506 239     239 0 312 my $modifier = pop @_;
3507 239         425 my @char = @_;
3508              
3509 239         466 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
3510 239         381 my @singleoctet = @$singleoctet;
3511 239         260 my @multipleoctet = @$multipleoctet;
3512              
3513             # with /i modifier
3514 239 100       487 if ($modifier =~ m/i/oxms) {
3515 128         174 my %singleoctet_ignorecase = ();
3516 128         133 for (@singleoctet) {
3517 272   66     818 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
3518 80         210 for my $ord (hex($1) .. hex($2)) {
3519 1091         911 my $char = CORE::chr($ord);
3520 1091         1092 my $uc = Eoldutf8::uc($char);
3521 1091         1291 my $fc = Eoldutf8::fc($char);
3522 1091 100       1291 if ($uc eq $fc) {
3523 502         964 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
3524             }
3525             else {
3526 589 50       626 if (CORE::length($fc) == 1) {
3527 589         1050 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3528 589         1239 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
3529             }
3530             else {
3531 0         0 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
3532 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
3533             }
3534             }
3535             }
3536             }
3537 272 100       345 if ($_ ne '') {
3538 192         359 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
3539             }
3540             }
3541 128         92 my $i = 0;
3542 128         131 my @singleoctet_ignorecase = ();
3543 128         169 for my $ord (0 .. 255) {
3544 32768 100       27527 if (exists $singleoctet_ignorecase{$ord}) {
3545 1622         907 push @{$singleoctet_ignorecase[$i]}, $ord;
  1622         1850  
3546             }
3547             else {
3548 31146         19041 $i++;
3549             }
3550             }
3551 128         159 @singleoctet = ();
3552 128         212 for my $range (@singleoctet_ignorecase) {
3553 11367 100       14946 if (ref $range) {
3554 214 50       140 if (scalar(@{$range}) == 1) {
  214 50       270  
3555 0         0 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  0         0  
3556             }
3557 214         233 elsif (scalar(@{$range}) == 2) {
3558 0         0 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
3559             }
3560             else {
3561 214         160 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         173  
  214         824  
3562             }
3563             }
3564             }
3565             }
3566              
3567             # return character list
3568 239 100       431 if (scalar(@multipleoctet) >= 1) {
3569 114 100       147 if (scalar(@singleoctet) >= 1) {
3570              
3571             # any character other than multiple-octet and single octet character class
3572 70         397 return '(?!' . join('|', @multipleoctet) . ')(?:[^\x80-\xFF' . join('', @singleoctet) . ']|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])';
3573             }
3574             else {
3575              
3576             # any character other than multiple-octet character class
3577 44         229 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
3578             }
3579             }
3580             else {
3581 125 50       181 if (scalar(@singleoctet) >= 1) {
3582              
3583             # any character other than single octet character class
3584 125         586 return '(?:[^\x80-\xFF' . join('', @singleoctet) . ']|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])';
3585             }
3586             else {
3587              
3588             # any character
3589 0         0 return "(?:$your_char)";
3590             }
3591             }
3592             }
3593              
3594             #
3595             # open file in read mode
3596             #
3597             sub _open_r {
3598 604     604   1264 my(undef,$file) = @_;
3599 604         1666 $file =~ s#\A (\s) #./$1#oxms;
3600 604   33     47497 return CORE::eval(q{open($_[0],'<',$_[1])}) ||
3601             open($_[0],"< $file\0");
3602             }
3603              
3604             #
3605             # open file in write mode
3606             #
3607             sub _open_w {
3608 0     0   0 my(undef,$file) = @_;
3609 0         0 $file =~ s#\A (\s) #./$1#oxms;
3610 0   0     0 return CORE::eval(q{open($_[0],'>',$_[1])}) ||
3611             open($_[0],"> $file\0");
3612             }
3613              
3614             #
3615             # open file in append mode
3616             #
3617             sub _open_a {
3618 0     0   0 my(undef,$file) = @_;
3619 0         0 $file =~ s#\A (\s) #./$1#oxms;
3620 0   0     0 return CORE::eval(q{open($_[0],'>>',$_[1])}) ||
3621             open($_[0],">> $file\0");
3622             }
3623              
3624             #
3625             # safe system
3626             #
3627             sub _systemx {
3628              
3629             # P.707 29.2.33. exec
3630             # in Chapter 29: Functions
3631             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3632             #
3633             # Be aware that in older releases of Perl, exec (and system) did not flush
3634             # your output buffer, so you needed to enable command buffering by setting $|
3635             # on one or more filehandles to avoid lost output in the case of exec, or
3636             # misordererd output in the case of system. This situation was largely remedied
3637             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
3638              
3639             # P.855 exec
3640             # in Chapter 27: Functions
3641             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3642             #
3643             # In very old release of Perl (before v5.6), exec (and system) did not flush
3644             # your output buffer, so you needed to enable command buffering by setting $|
3645             # on one or more filehandles to avoid lost output with exec or misordered
3646             # output with system.
3647              
3648 302     302   1139 $| = 1;
3649              
3650             # P.565 23.1.2. Cleaning Up Your Environment
3651             # in Chapter 23: Security
3652             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3653              
3654             # P.656 Cleaning Up Your Environment
3655             # in Chapter 20: Security
3656             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3657              
3658             # local $ENV{'PATH'} = '.';
3659 302         2443 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
3660              
3661             # P.707 29.2.33. exec
3662             # in Chapter 29: Functions
3663             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3664             #
3665             # As we mentioned earlier, exec treats a discrete list of arguments as an
3666             # indication that it should bypass shell processing. However, there is one
3667             # place where you might still get tripped up. The exec call (and system, too)
3668             # will not distinguish between a single scalar argument and an array containing
3669             # only one element.
3670             #
3671             # @args = ("echo surprise"); # just one element in list
3672             # exec @args # still subject to shell escapes
3673             # or die "exec: $!"; # because @args == 1
3674             #
3675             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
3676             # first argument as the pathname, which forces the rest of the arguments to be
3677             # interpreted as a list, even if there is only one of them:
3678             #
3679             # exec { $args[0] } @args # safe even with one-argument list
3680             # or die "can't exec @args: $!";
3681              
3682             # P.855 exec
3683             # in Chapter 27: Functions
3684             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3685             #
3686             # As we mentioned earlier, exec treats a discrete list of arguments as a
3687             # directive to bypass shell processing. However, there is one place where
3688             # you might still get tripped up. The exec call (and system, too) cannot
3689             # distinguish between a single scalar argument and an array containing
3690             # only one element.
3691             #
3692             # @args = ("echo surprise"); # just one element in list
3693             # exec @args # still subject to shell escapes
3694             # || die "exec: $!"; # because @args == 1
3695             #
3696             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
3697             # argument as the pathname, which forces the rest of the arguments to be
3698             # interpreted as a list, even if there is only one of them:
3699             #
3700             # exec { $args[0] } @args # safe even with one-argument list
3701             # || die "can't exec @args: $!";
3702              
3703 302         471 return CORE::system { $_[0] } @_; # safe even with one-argument list
  302         31205175  
3704             }
3705              
3706             #
3707             # old UTF-8 order to character (with parameter)
3708             #
3709             sub Eoldutf8::chr(;$) {
3710              
3711 0 0   0 0 0 my $c = @_ ? $_[0] : $_;
3712              
3713 0 0       0 if ($c == 0x00) {
3714 0         0 return "\x00";
3715             }
3716             else {
3717 0         0 my @chr = ();
3718 0         0 while ($c > 0) {
3719 0         0 unshift @chr, ($c % 0x100);
3720 0         0 $c = int($c / 0x100);
3721             }
3722 0         0 return pack 'C*', @chr;
3723             }
3724             }
3725              
3726             #
3727             # old UTF-8 order to character (without parameter)
3728             #
3729             sub Eoldutf8::chr_() {
3730              
3731 0     0 0 0 my $c = $_;
3732              
3733 0 0       0 if ($c == 0x00) {
3734 0         0 return "\x00";
3735             }
3736             else {
3737 0         0 my @chr = ();
3738 0         0 while ($c > 0) {
3739 0         0 unshift @chr, ($c % 0x100);
3740 0         0 $c = int($c / 0x100);
3741             }
3742 0         0 return pack 'C*', @chr;
3743             }
3744             }
3745              
3746             #
3747             # old UTF-8 path globbing (with parameter)
3748             #
3749             sub Eoldutf8::glob($) {
3750              
3751 0 0   0 0 0 if (wantarray) {
3752 0         0 my @glob = _DOS_like_glob(@_);
3753 0         0 for my $glob (@glob) {
3754 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3755             }
3756 0         0 return @glob;
3757             }
3758             else {
3759 0         0 my $glob = _DOS_like_glob(@_);
3760 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3761 0         0 return $glob;
3762             }
3763             }
3764              
3765             #
3766             # old UTF-8 path globbing (without parameter)
3767             #
3768             sub Eoldutf8::glob_() {
3769              
3770 0 0   0 0 0 if (wantarray) {
3771 0         0 my @glob = _DOS_like_glob();
3772 0         0 for my $glob (@glob) {
3773 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3774             }
3775 0         0 return @glob;
3776             }
3777             else {
3778 0         0 my $glob = _DOS_like_glob();
3779 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
3780 0         0 return $glob;
3781             }
3782             }
3783              
3784             #
3785             # old UTF-8 path globbing via File::DosGlob 1.10
3786             #
3787             # Often I confuse "_dosglob" and "_doglob".
3788             # So, I renamed "_dosglob" to "_DOS_like_glob".
3789             #
3790             my %iter;
3791             my %entries;
3792             sub _DOS_like_glob {
3793              
3794             # context (keyed by second cxix argument provided by core)
3795 0     0   0 my($expr,$cxix) = @_;
3796              
3797             # glob without args defaults to $_
3798 0 0       0 $expr = $_ if not defined $expr;
3799              
3800             # represents the current user's home directory
3801             #
3802             # 7.3. Expanding Tildes in Filenames
3803             # in Chapter 7. File Access
3804             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
3805             #
3806             # and File::HomeDir, File::HomeDir::Windows module
3807              
3808             # DOS-like system
3809 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
3810 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
3811 0         0 { my_home_MSWin32() }oxmse;
3812             }
3813              
3814             # UNIX-like system
3815             else {
3816 0         0 $expr =~ s{ \A ~ ( (?:[^\x80-\xFF/]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF])* ) }
3817 0 0 0     0 { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
3818             }
3819              
3820             # assume global context if not provided one
3821 0 0       0 $cxix = '_G_' if not defined $cxix;
3822 0 0       0 $iter{$cxix} = 0 if not exists $iter{$cxix};
3823              
3824             # if we're just beginning, do it all first
3825 0 0       0 if ($iter{$cxix} == 0) {
3826 0         0 $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
3827             }
3828              
3829             # chuck it all out, quick or slow
3830 0 0       0 if (wantarray) {
3831 0         0 delete $iter{$cxix};
3832 0         0 return @{delete $entries{$cxix}};
  0         0  
3833             }
3834             else {
3835 0 0       0 if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
  0         0  
3836 0         0 return shift @{$entries{$cxix}};
  0         0  
3837             }
3838             else {
3839             # return undef for EOL
3840 0         0 delete $iter{$cxix};
3841 0         0 delete $entries{$cxix};
3842 0         0 return undef;
3843             }
3844             }
3845             }
3846              
3847             #
3848             # old UTF-8 path globbing subroutine
3849             #
3850             sub _do_glob {
3851              
3852 0     0   0 my($cond,@expr) = @_;
3853 0         0 my @glob = ();
3854 0         0 my $fix_drive_relative_paths = 0;
3855              
3856             OUTER:
3857 0         0 for my $expr (@expr) {
3858 0 0       0 next OUTER if not defined $expr;
3859 0 0       0 next OUTER if $expr eq '';
3860              
3861 0         0 my @matched = ();
3862 0         0 my @globdir = ();
3863 0         0 my $head = '.';
3864 0         0 my $pathsep = '/';
3865 0         0 my $tail;
3866              
3867             # if argument is within quotes strip em and do no globbing
3868 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
3869 0         0 $expr = $1;
3870 0 0       0 if ($cond eq 'd') {
3871 0 0       0 if (-d $expr) {
3872 0         0 push @glob, $expr;
3873             }
3874             }
3875             else {
3876 0 0       0 if (-e $expr) {
3877 0         0 push @glob, $expr;
3878             }
3879             }
3880 0         0 next OUTER;
3881             }
3882              
3883             # wildcards with a drive prefix such as h:*.pm must be changed
3884             # to h:./*.pm to expand correctly
3885 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
3886 0 0       0 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) {
3887 0         0 $fix_drive_relative_paths = 1;
3888             }
3889             }
3890              
3891 0 0       0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
3892 0 0       0 if ($tail eq '') {
3893 0         0 push @glob, $expr;
3894 0         0 next OUTER;
3895             }
3896 0 0       0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
3897 0 0       0 if (@globdir = _do_glob('d', $head)) {
3898 0         0 push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
  0         0  
3899 0         0 next OUTER;
3900             }
3901             }
3902 0 0 0     0 if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
3903 0         0 $head .= $pathsep;
3904             }
3905 0         0 $expr = $tail;
3906             }
3907              
3908             # If file component has no wildcards, we can avoid opendir
3909 0 0       0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
3910 0 0       0 if ($head eq '.') {
3911 0         0 $head = '';
3912             }
3913 0 0 0     0 if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
3914 0         0 $head .= $pathsep;
3915             }
3916 0         0 $head .= $expr;
3917 0 0       0 if ($cond eq 'd') {
3918 0 0       0 if (-d $head) {
3919 0         0 push @glob, $head;
3920             }
3921             }
3922             else {
3923 0 0       0 if (-e $head) {
3924 0         0 push @glob, $head;
3925             }
3926             }
3927 0         0 next OUTER;
3928             }
3929 0 0       0 opendir(*DIR, $head) or next OUTER;
3930 0         0 my @leaf = readdir DIR;
3931 0         0 closedir DIR;
3932              
3933 0 0       0 if ($head eq '.') {
3934 0         0 $head = '';
3935             }
3936 0 0 0     0 if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
3937 0         0 $head .= $pathsep;
3938             }
3939              
3940 0         0 my $pattern = '';
3941 0         0 while ($expr =~ / \G ($q_char) /oxgc) {
3942 0         0 my $char = $1;
3943              
3944             # 6.9. Matching Shell Globs as Regular Expressions
3945             # in Chapter 6. Pattern Matching
3946             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
3947             # (and so on)
3948              
3949 0 0       0 if ($char eq '*') {
    0          
    0          
3950 0         0 $pattern .= "(?:$your_char)*",
3951             }
3952             elsif ($char eq '?') {
3953 0         0 $pattern .= "(?:$your_char)?", # DOS style
3954             # $pattern .= "(?:$your_char)", # UNIX style
3955             }
3956             elsif ((my $fc = Eoldutf8::fc($char)) ne $char) {
3957 0         0 $pattern .= $fc;
3958             }
3959             else {
3960 0         0 $pattern .= quotemeta $char;
3961             }
3962             }
3963 0     0   0 my $matchsub = sub { Eoldutf8::fc($_[0]) =~ /\A $pattern \z/xms };
  0         0  
3964              
3965             # if ($@) {
3966             # print STDERR "$0: $@\n";
3967             # next OUTER;
3968             # }
3969              
3970             INNER:
3971 0         0 for my $leaf (@leaf) {
3972 0 0 0     0 if ($leaf eq '.' or $leaf eq '..') {
3973 0         0 next INNER;
3974             }
3975 0 0 0     0 if ($cond eq 'd' and not -d "$head$leaf") {
3976 0         0 next INNER;
3977             }
3978              
3979 0 0       0 if (&$matchsub($leaf)) {
3980 0         0 push @matched, "$head$leaf";
3981 0         0 next INNER;
3982             }
3983              
3984             # [DOS compatibility special case]
3985             # Failed, add a trailing dot and try again, but only...
3986              
3987 0 0 0     0 if (Eoldutf8::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
      0        
3988             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
3989             Eoldutf8::index($pattern,'\\.') != -1 # pattern has a dot.
3990             ) {
3991 0 0       0 if (&$matchsub("$leaf.")) {
3992 0         0 push @matched, "$head$leaf";
3993 0         0 next INNER;
3994             }
3995             }
3996             }
3997 0 0       0 if (@matched) {
3998 0         0 push @glob, @matched;
3999             }
4000             }
4001 0 0       0 if ($fix_drive_relative_paths) {
4002 0         0 for my $glob (@glob) {
4003 0         0 $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
4004             }
4005             }
4006 0         0 return @glob;
4007             }
4008              
4009             #
4010             # old UTF-8 parse line
4011             #
4012             sub _parse_line {
4013              
4014 0     0   0 my($line) = @_;
4015              
4016 0         0 $line .= ' ';
4017 0         0 my @piece = ();
4018 0         0 while ($line =~ /
4019             " ( (?>(?: [^\x80-\xFF"] |(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] )* ) ) " (?>\s+) |
4020             ( (?>(?: [^\x80-\xFF"\s]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] )* ) ) (?>\s+)
4021             /oxmsg
4022             ) {
4023 0 0       0 push @piece, defined($1) ? $1 : $2;
4024             }
4025 0         0 return @piece;
4026             }
4027              
4028             #
4029             # old UTF-8 parse path
4030             #
4031             sub _parse_path {
4032              
4033 0     0   0 my($path,$pathsep) = @_;
4034              
4035 0         0 $path .= '/';
4036 0         0 my @subpath = ();
4037 0         0 while ($path =~ /
4038             ((?: [^\x80-\xFF\/\\]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] )+?) [\/\\]
4039             /oxmsg
4040             ) {
4041 0         0 push @subpath, $1;
4042             }
4043              
4044 0         0 my $tail = pop @subpath;
4045 0         0 my $head = join $pathsep, @subpath;
4046 0         0 return $head, $tail;
4047             }
4048              
4049             #
4050             # via File::HomeDir::Windows 1.00
4051             #
4052             sub my_home_MSWin32 {
4053              
4054             # A lot of unix people and unix-derived tools rely on
4055             # the ability to overload HOME. We will support it too
4056             # so that they can replace raw HOME calls with File::HomeDir.
4057 0 0 0 0 0 0 if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
    0 0        
    0 0        
      0        
      0        
4058 0         0 return $ENV{'HOME'};
4059             }
4060              
4061             # Do we have a user profile?
4062             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
4063 0         0 return $ENV{'USERPROFILE'};
4064             }
4065              
4066             # Some Windows use something like $ENV{'HOME'}
4067             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
4068 0         0 return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
4069             }
4070              
4071 0         0 return undef;
4072             }
4073              
4074             #
4075             # via File::HomeDir::Unix 1.00
4076             #
4077             sub my_home {
4078 0     0 0 0 my $home;
4079              
4080 0 0 0     0 if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
    0 0        
4081 0         0 $home = $ENV{'HOME'};
4082             }
4083              
4084             # This is from the original code, but I'm guessing
4085             # it means "login directory" and exists on some Unixes.
4086             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
4087 0         0 $home = $ENV{'LOGDIR'};
4088             }
4089              
4090             ### More-desperate methods
4091              
4092             # Light desperation on any (Unixish) platform
4093             else {
4094 0         0 $home = CORE::eval q{ (getpwuid($<))[7] };
4095             }
4096              
4097             # On Unix in general, a non-existant home means "no home"
4098             # For example, "nobody"-like users might use /nonexistant
4099 0 0 0     0 if (defined $home and ! -d($home)) {
4100 0         0 $home = undef;
4101             }
4102 0         0 return $home;
4103             }
4104              
4105             #
4106             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
4107             #
4108             sub Eoldutf8::PREMATCH {
4109 0     0 0 0 return $`;
4110             }
4111              
4112             #
4113             # ${^MATCH}, $MATCH, $& the string that matched
4114             #
4115             sub Eoldutf8::MATCH {
4116 0     0 0 0 return $&;
4117             }
4118              
4119             #
4120             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
4121             #
4122             sub Eoldutf8::POSTMATCH {
4123 0     0 0 0 return $';
4124             }
4125              
4126             #
4127             # old UTF-8 character to order (with parameter)
4128             #
4129             sub OldUTF8::ord(;$) {
4130              
4131 0 0   0 1 0 local $_ = shift if @_;
4132              
4133 0 0       0 if (/\A ($q_char) /oxms) {
4134 0         0 my @ord = unpack 'C*', $1;
4135 0         0 my $ord = 0;
4136 0         0 while (my $o = shift @ord) {
4137 0         0 $ord = $ord * 0x100 + $o;
4138             }
4139 0         0 return $ord;
4140             }
4141             else {
4142 0         0 return CORE::ord $_;
4143             }
4144             }
4145              
4146             #
4147             # old UTF-8 character to order (without parameter)
4148             #
4149             sub OldUTF8::ord_() {
4150              
4151 0 0   0 0 0 if (/\A ($q_char) /oxms) {
4152 0         0 my @ord = unpack 'C*', $1;
4153 0         0 my $ord = 0;
4154 0         0 while (my $o = shift @ord) {
4155 0         0 $ord = $ord * 0x100 + $o;
4156             }
4157 0         0 return $ord;
4158             }
4159             else {
4160 0         0 return CORE::ord $_;
4161             }
4162             }
4163              
4164             #
4165             # old UTF-8 reverse
4166             #
4167             sub OldUTF8::reverse(@) {
4168              
4169 0 0   0 0 0 if (wantarray) {
4170 0         0 return CORE::reverse @_;
4171             }
4172             else {
4173              
4174             # One of us once cornered Larry in an elevator and asked him what
4175             # problem he was solving with this, but he looked as far off into
4176             # the distance as he could in an elevator and said, "It seemed like
4177             # a good idea at the time."
4178              
4179 0         0 return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
4180             }
4181             }
4182              
4183             #
4184             # old UTF-8 getc (with parameter, without parameter)
4185             #
4186             sub OldUTF8::getc(;*@) {
4187              
4188 0     0 0 0 my($package) = caller;
4189 0 0       0 my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
4190 0 0 0     0 croak 'Too many arguments for OldUTF8::getc' if @_ and not wantarray;
4191              
4192 0         0 my @length = sort { $a <=> $b } keys %range_tr;
  0         0  
4193 0         0 my $getc = '';
4194 0         0 for my $length ($length[0] .. $length[-1]) {
4195 0         0 $getc .= CORE::getc($fh);
4196 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
4197 0 0       0 if ($getc =~ /\A ${Eoldutf8::dot_s} \z/oxms) {
4198 0 0       0 return wantarray ? ($getc,@_) : $getc;
4199             }
4200             }
4201             }
4202 0 0       0 return wantarray ? ($getc,@_) : $getc;
4203             }
4204              
4205             #
4206             # old UTF-8 length by character
4207             #
4208             sub OldUTF8::length(;$) {
4209              
4210 0 0   0 1 0 local $_ = shift if @_;
4211              
4212 0         0 local @_ = /\G ($q_char) /oxmsg;
4213 0         0 return scalar @_;
4214             }
4215              
4216             #
4217             # old UTF-8 substr by character
4218             #
4219             BEGIN {
4220              
4221             # P.232 The lvalue Attribute
4222             # in Chapter 6: Subroutines
4223             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4224              
4225             # P.336 The lvalue Attribute
4226             # in Chapter 7: Subroutines
4227             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4228              
4229             # P.144 8.4 Lvalue subroutines
4230             # in Chapter 8: perlsub: Perl subroutines
4231             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
4232              
4233 302 50 0 302 1 197987 CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
  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  
4234             # vv----------------------*******
4235             sub OldUTF8::substr($$;$$) %s {
4236              
4237             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
4238              
4239             # If the substring is beyond either end of the string, substr() returns the undefined
4240             # value and produces a warning. When used as an lvalue, specifying a substring that
4241             # is entirely outside the string raises an exception.
4242             # http://perldoc.perl.org/functions/substr.html
4243              
4244             # A return with no argument returns the scalar value undef in scalar context,
4245             # an empty list () in list context, and (naturally) nothing at all in void
4246             # context.
4247              
4248             my $offset = $_[1];
4249             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
4250             return;
4251             }
4252              
4253             # substr($string,$offset,$length,$replacement)
4254             if (@_ == 4) {
4255             my(undef,undef,$length,$replacement) = @_;
4256             my $substr = join '', splice(@char, $offset, $length, $replacement);
4257             $_[0] = join '', @char;
4258              
4259             # return $substr; this doesn't work, don't say "return"
4260             $substr;
4261             }
4262              
4263             # substr($string,$offset,$length)
4264             elsif (@_ == 3) {
4265             my(undef,undef,$length) = @_;
4266             my $octet_offset = 0;
4267             my $octet_length = 0;
4268             if ($offset == 0) {
4269             $octet_offset = 0;
4270             }
4271             elsif ($offset > 0) {
4272             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
4273             }
4274             else {
4275             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
4276             }
4277             if ($length == 0) {
4278             $octet_length = 0;
4279             }
4280             elsif ($length > 0) {
4281             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
4282             }
4283             else {
4284             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
4285             }
4286             CORE::substr($_[0], $octet_offset, $octet_length);
4287             }
4288              
4289             # substr($string,$offset)
4290             else {
4291             my $octet_offset = 0;
4292             if ($offset == 0) {
4293             $octet_offset = 0;
4294             }
4295             elsif ($offset > 0) {
4296             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
4297             }
4298             else {
4299             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
4300             }
4301             CORE::substr($_[0], $octet_offset);
4302             }
4303             }
4304             END
4305             }
4306              
4307             #
4308             # old UTF-8 index by character
4309             #
4310             sub OldUTF8::index($$;$) {
4311              
4312 0     0 1 0 my $index;
4313 0 0       0 if (@_ == 3) {
4314 0         0 $index = Eoldutf8::index($_[0], $_[1], CORE::length(OldUTF8::substr($_[0], 0, $_[2])));
4315             }
4316             else {
4317 0         0 $index = Eoldutf8::index($_[0], $_[1]);
4318             }
4319              
4320 0 0       0 if ($index == -1) {
4321 0         0 return -1;
4322             }
4323             else {
4324 0         0 return OldUTF8::length(CORE::substr $_[0], 0, $index);
4325             }
4326             }
4327              
4328             #
4329             # old UTF-8 rindex by character
4330             #
4331             sub OldUTF8::rindex($$;$) {
4332              
4333 0     0 1 0 my $rindex;
4334 0 0       0 if (@_ == 3) {
4335 0         0 $rindex = Eoldutf8::rindex($_[0], $_[1], CORE::length(OldUTF8::substr($_[0], 0, $_[2])));
4336             }
4337             else {
4338 0         0 $rindex = Eoldutf8::rindex($_[0], $_[1]);
4339             }
4340              
4341 0 0       0 if ($rindex == -1) {
4342 0         0 return -1;
4343             }
4344             else {
4345 0         0 return OldUTF8::length(CORE::substr $_[0], 0, $rindex);
4346             }
4347             }
4348              
4349             # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
4350             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
4351 302     302   21293 BEGIN { CORE::eval q{ use vars qw($slash) } } $slash = 'm//';
  302     302   2008  
  302         486  
  302         20204  
4352              
4353             # ord() to ord() or OldUTF8::ord()
4354 302     302   16746 BEGIN { CORE::eval q{ use vars qw($function_ord) } } $function_ord = 'ord';
  302     302   1273  
  302         462  
  302         16527  
4355              
4356             # ord to ord or OldUTF8::ord_
4357 302     302   15819 BEGIN { CORE::eval q{ use vars qw($function_ord_) } } $function_ord_ = 'ord';
  302     302   1175  
  302         429  
  302         16625  
4358              
4359             # reverse to reverse or OldUTF8::reverse
4360 302     302   15473 BEGIN { CORE::eval q{ use vars qw($function_reverse) } } $function_reverse = 'reverse';
  302     302   1208  
  302         436  
  302         16858  
4361              
4362             # getc to getc or OldUTF8::getc
4363 302     302   14772 BEGIN { CORE::eval q{ use vars qw($function_getc) } } $function_getc = 'getc';
  302     302   1141  
  302         444  
  302         17818  
4364              
4365             # P.1023 Appendix W.9 Multibyte Anchoring
4366             # of ISBN 1-56592-224-7 CJKV Information Processing
4367              
4368             my $anchor = '';
4369              
4370 302     302   15344 BEGIN { CORE::eval q{ use vars qw($nest) } }
  302     302   1455  
  302         442  
  302         15110244  
4371              
4372             # regexp of nested parens in qqXX
4373              
4374             # P.340 Matching Nested Constructs with Embedded Code
4375             # in Chapter 7: Perl
4376             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
4377              
4378             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
4379             [^\x80-\xFF\\()] |
4380             \( (?{$nest++}) |
4381             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4382             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4383             \\ [^\x80-\xFFc] |
4384             \\c[\x40-\x5F] |
4385             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4386             [\x00-\xFF]
4387             }xms;
4388              
4389             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
4390             [^\x80-\xFF\\{}] |
4391             \{ (?{$nest++}) |
4392             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4393             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4394             \\ [^\x80-\xFFc] |
4395             \\c[\x40-\x5F] |
4396             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4397             [\x00-\xFF]
4398             }xms;
4399              
4400             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
4401             [^\x80-\xFF\\\[\]] |
4402             \[ (?{$nest++}) |
4403             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4404             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4405             \\ [^\x80-\xFFc] |
4406             \\c[\x40-\x5F] |
4407             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4408             [\x00-\xFF]
4409             }xms;
4410              
4411             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
4412             [^\x80-\xFF\\<>] |
4413             \< (?{$nest++}) |
4414             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4415             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4416             \\ [^\x80-\xFFc] |
4417             \\c[\x40-\x5F] |
4418             \\ (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4419             [\x00-\xFF]
4420             }xms;
4421              
4422             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
4423             (?: ::)? (?:
4424             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
4425             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
4426             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
4427             ))
4428             }xms;
4429              
4430             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
4431             (?: ::)? (?:
4432             (?>[0-9]+) |
4433             [^\x80-\xFFa-zA-Z_0-9\[\]] |
4434             ^[A-Z] |
4435             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
4436             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
4437             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
4438             ))
4439             }xms;
4440              
4441             my $qq_substr = qr{(?> Char::substr | OldUTF8::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
4442             }xms;
4443              
4444             # regexp of nested parens in qXX
4445             my $q_paren = qr{(?{local $nest=0}) (?>(?:
4446             [^\x80-\xFF()] |
4447             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4448             \( (?{$nest++}) |
4449             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4450             [\x00-\xFF]
4451             }xms;
4452              
4453             my $q_brace = qr{(?{local $nest=0}) (?>(?:
4454             [^\x80-\xFF\{\}] |
4455             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4456             \{ (?{$nest++}) |
4457             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4458             [\x00-\xFF]
4459             }xms;
4460              
4461             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
4462             [^\x80-\xFF\[\]] |
4463             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4464             \[ (?{$nest++}) |
4465             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4466             [\x00-\xFF]
4467             }xms;
4468              
4469             my $q_angle = qr{(?{local $nest=0}) (?>(?:
4470             [^\x80-\xFF<>] |
4471             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
4472             \< (?{$nest++}) |
4473             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
4474             [\x00-\xFF]
4475             }xms;
4476              
4477             my $matched = '';
4478             my $s_matched = '';
4479              
4480             my $tr_variable = ''; # variable of tr///
4481             my $sub_variable = ''; # variable of s///
4482             my $bind_operator = ''; # =~ or !~
4483              
4484             my @heredoc = (); # here document
4485             my @heredoc_delimiter = ();
4486             my $here_script = ''; # here script
4487              
4488             #
4489             # escape old UTF-8 script
4490             #
4491             sub OldUTF8::escape(;$) {
4492 302 50   302 0 826 local($_) = $_[0] if @_;
4493              
4494             # P.359 The Study Function
4495             # in Chapter 7: Perl
4496             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
4497              
4498 302         470 study $_; # Yes, I studied study yesterday.
4499              
4500             # while all script
4501              
4502             # 6.14. Matching from Where the Last Pattern Left Off
4503             # in Chapter 6. Pattern Matching
4504             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
4505             # (and so on)
4506              
4507             # one member of Tag-team
4508             #
4509             # P.128 Start of match (or end of previous match): \G
4510             # P.130 Advanced Use of \G with Perl
4511             # in Chapter 3: Overview of Regular Expression Features and Flavors
4512             # P.255 Use leading anchors
4513             # P.256 Expose ^ and \G at the front expressions
4514             # in Chapter 6: Crafting an Efficient Expression
4515             # P.315 "Tag-team" matching with /gc
4516             # in Chapter 7: Perl
4517             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
4518              
4519 302         442 my $e_script = '';
4520 302         1090 while (not /\G \z/oxgc) { # member
4521 129591         137860 $e_script .= OldUTF8::escape_token();
4522             }
4523              
4524 302         3274 return $e_script;
4525             }
4526              
4527             #
4528             # escape old UTF-8 token of script
4529             #
4530             sub OldUTF8::escape_token {
4531              
4532             # \n output here document
4533              
4534 129591     129591 0 93193 my $ignore_modules = join('|', qw(
4535             utf8
4536             bytes
4537             charnames
4538             I18N::Japanese
4539             I18N::Collate
4540             I18N::JExt
4541             File::DosGlob
4542             Wild
4543             Wildcard
4544             Japanese
4545             ));
4546              
4547             # another member of Tag-team
4548             #
4549             # P.315 "Tag-team" matching with /gc
4550             # in Chapter 7: Perl
4551             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
4552              
4553 129591 100 100     11639644 if (/\G ( \n ) /oxgc) { # another member (and so on)
    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          
    50          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    100          
    100          
    50          
4554 21374         15936 my $heredoc = '';
4555 21374 100       32206 if (scalar(@heredoc_delimiter) >= 1) {
4556 167         167 $slash = 'm//';
4557              
4558 167         250 $heredoc = join '', @heredoc;
4559 167         221 @heredoc = ();
4560              
4561             # skip here document
4562 167         237 for my $heredoc_delimiter (@heredoc_delimiter) {
4563 175         1012 /\G .*? \n $heredoc_delimiter \n/xmsgc;
4564             }
4565 167         203 @heredoc_delimiter = ();
4566              
4567 167         166 $here_script = '';
4568             }
4569 21374         50414 return "\n" . $heredoc;
4570             }
4571              
4572             # ignore space, comment
4573 33781         78701 elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
4574              
4575             # if (, elsif (, unless (, while (, until (, given (, and when (
4576              
4577             # given, when
4578              
4579             # P.225 The given Statement
4580             # in Chapter 15: Smart Matching and given-when
4581             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4582              
4583             # P.133 The given Statement
4584             # in Chapter 4: Statements and Declarations
4585             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4586              
4587             elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
4588 2370         2782 $slash = 'm//';
4589 2370         5904 return $1;
4590             }
4591              
4592             # scalar variable ($scalar = ...) =~ tr///;
4593             # scalar variable ($scalar = ...) =~ s///;
4594              
4595             # state
4596              
4597             # P.68 Persistent, Private Variables
4598             # in Chapter 4: Subroutines
4599             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4600              
4601             # P.160 Persistent Lexically Scoped Variables: state
4602             # in Chapter 4: Statements and Declarations
4603             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4604              
4605             # (and so on)
4606              
4607             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
4608 138         288 my $e_string = e_string($1);
4609              
4610 138 50       4744 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
    50          
4611 0         0 $tr_variable = $e_string . e_string($1);
4612 0         0 $bind_operator = $2;
4613 0         0 $slash = 'm//';
4614 0         0 return '';
4615             }
4616             elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
4617 0         0 $sub_variable = $e_string . e_string($1);
4618 0         0 $bind_operator = $2;
4619 0         0 $slash = 'm//';
4620 0         0 return '';
4621             }
4622             else {
4623 138         177 $slash = 'div';
4624 138         487 return $e_string;
4625             }
4626             }
4627              
4628             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
4629             elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4630 4         7 $slash = 'div';
4631 4         11 return q{Eoldutf8::PREMATCH()};
4632             }
4633              
4634             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
4635             elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4636 28         44 $slash = 'div';
4637 28         76 return q{Eoldutf8::MATCH()};
4638             }
4639              
4640             # $', ${'} --> $', ${'}
4641             elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
4642 1         3 $slash = 'div';
4643 1         4 return $1;
4644             }
4645              
4646             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
4647             elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4648 3         5 $slash = 'div';
4649 3         13 return q{Eoldutf8::POSTMATCH()};
4650             }
4651              
4652             # scalar variable $scalar =~ tr///;
4653             # scalar variable $scalar =~ s///;
4654             # substr() =~ tr///;
4655             # substr() =~ s///;
4656             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
4657 2251         3791 my $scalar = e_string($1);
4658              
4659 2251 100       7451 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
    100          
4660 9         10 $tr_variable = $scalar;
4661 9         13 $bind_operator = $1;
4662 9         10 $slash = 'm//';
4663 9         21 return '';
4664             }
4665             elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
4666 95         154 $sub_variable = $scalar;
4667 95         157 $bind_operator = $1;
4668 95         107 $slash = 'm//';
4669 95         259 return '';
4670             }
4671             else {
4672 2147         1993 $slash = 'div';
4673 2147         4920 return $scalar;
4674             }
4675             }
4676              
4677             # end of statement
4678             elsif (/\G ( [,;] ) /oxgc) {
4679 8473         8003 $slash = 'm//';
4680              
4681             # clear tr/// variable
4682 8473         6493 $tr_variable = '';
4683              
4684             # clear s/// variable
4685 8473         5940 $sub_variable = '';
4686              
4687 8473         5784 $bind_operator = '';
4688              
4689 8473         23522 return $1;
4690             }
4691              
4692             # bareword
4693             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
4694 0         0 return $1;
4695             }
4696              
4697             # $0 --> $0
4698             elsif (/\G ( \$ 0 ) /oxmsgc) {
4699 2         4 $slash = 'div';
4700 2         10 return $1;
4701             }
4702             elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
4703 0         0 $slash = 'div';
4704 0         0 return $1;
4705             }
4706              
4707             # $$ --> $$
4708             elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
4709 1         3 $slash = 'div';
4710 1         6 return $1;
4711             }
4712              
4713             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
4714             # $1, $2, $3 --> $1, $2, $3 otherwise
4715             elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
4716 57         83 $slash = 'div';
4717 57         127 return e_capture($1);
4718             }
4719             elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
4720 0         0 $slash = 'div';
4721 0         0 return e_capture($1);
4722             }
4723              
4724             # $$foo[ ... ] --> $ $foo->[ ... ]
4725             elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
4726 0         0 $slash = 'div';
4727 0         0 return e_capture($1.'->'.$2);
4728             }
4729              
4730             # $$foo{ ... } --> $ $foo->{ ... }
4731             elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
4732 0         0 $slash = 'div';
4733 0         0 return e_capture($1.'->'.$2);
4734             }
4735              
4736             # $$foo
4737             elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
4738 0         0 $slash = 'div';
4739 0         0 return e_capture($1);
4740             }
4741              
4742             # ${ foo }
4743             elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
4744 0         0 $slash = 'div';
4745 0         0 return '${' . $1 . '}';
4746             }
4747              
4748             # ${ ... }
4749             elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
4750 0         0 $slash = 'div';
4751 0         0 return e_capture($1);
4752             }
4753              
4754             # variable or function
4755             # $ @ % & * $ #
4756             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) {
4757 27         30 $slash = 'div';
4758 27         75 return $1;
4759             }
4760             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
4761             # $ @ # \ ' " / ? ( ) [ ] < >
4762             elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
4763 88         119 $slash = 'div';
4764 88         269 return $1;
4765             }
4766              
4767             # while ()
4768             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
4769 0         0 return $1;
4770             }
4771              
4772             # while () --- glob
4773              
4774             # avoid "Error: Runtime exception" of perl version 5.005_03
4775              
4776             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) {
4777 0         0 return 'while ($_ = Eoldutf8::glob("' . $1 . '"))';
4778             }
4779              
4780             # while (glob)
4781             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
4782 0         0 return 'while ($_ = Eoldutf8::glob_)';
4783             }
4784              
4785             # while (glob(WILDCARD))
4786             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
4787 0         0 return 'while ($_ = Eoldutf8::glob';
4788             }
4789              
4790             # doit if, doit unless, doit while, doit until, doit for, doit when
4791 394         644 elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
  394         1218  
4792              
4793             # subroutines of package Eoldutf8
4794 19         27 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  19         61  
4795 0         0 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
4796 13         14 elsif (/\G \b OldUTF8::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  13         32  
4797 0         0 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  0         0  
4798 114         106 elsif (/\G \b OldUTF8::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval OldUTF8::escape'; }
  114         255  
4799 2         1 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         6  
4800 2         3 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::chop'; }
  2         6  
4801 2         2 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  2         5  
4802 0         0 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  0         0  
4803 2         4 elsif (/\G \b OldUTF8::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'OldUTF8::index'; }
  2         4  
4804 2         3 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::index'; }
  2         4  
4805 2         3 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  2         5  
4806 0         0 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  0         0  
4807 2         3 elsif (/\G \b OldUTF8::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'OldUTF8::rindex'; }
  2         5  
4808 2         3 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::rindex'; }
  2         4  
4809 1         1 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lc'; }
  1         3  
4810 0         0 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lcfirst'; }
  0         0  
4811 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::uc'; }
  0         0  
4812 0         0 elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::ucfirst'; }
  0         0  
4813 7         9 elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::fc'; }
  7         21  
4814              
4815             # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
4816 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
4817 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4818 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4819 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4820 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4821 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
4822 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  
4823              
4824 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
4825 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4826 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4827 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4828 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4829 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4830 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
4831              
4832             elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
4833 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
4834 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
4835 0         0 elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
  0         0  
4836 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  0         0  
4837              
4838 2         3 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  2         5  
4839 2         4 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         5  
4840 36         43 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::chr'; }
  36         94  
4841 2         4 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  2         5  
4842 2         3 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  2         7  
4843 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eoldutf8::glob'; }
  0         0  
4844 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lc_'; }
  0         0  
4845 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::lcfirst_'; }
  0         0  
4846 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::uc_'; }
  0         0  
4847 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::ucfirst_'; }
  0         0  
4848 0         0 elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::fc_'; }
  0         0  
4849 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
4850              
4851 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
4852 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
4853 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::chr_'; }
  0         0  
4854 0         0 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
4855 2         3 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  2         6  
4856 0         0 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eoldutf8::glob_'; }
  0         0  
4857 4         7 elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
  4         14  
4858 8         13 elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
  8         25  
4859             # split
4860             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
4861 120         169 $slash = 'm//';
4862              
4863 120         138 my $e = '';
4864 120         410 while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
4865 117         401 $e .= $1;
4866             }
4867              
4868             # end of split
4869 120 100       11444 if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Eoldutf8::split' . $e; }
  3 100       15  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
4870              
4871             # split scalar value
4872 1         3 elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Eoldutf8::split' . $e . e_string($1); }
4873              
4874             # split literal space
4875 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Eoldutf8::split' . $e . qq {qq$1 $2}; }
4876 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4877 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4878 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4879 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4880 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; }
4881 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Eoldutf8::split' . $e . qq {q$1 $2}; }
4882 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4883 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4884 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4885 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4886 0         0 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eoldutf8::split' . $e . qq {$1q$2 $3}; }
4887 13         52 elsif (/\G ' [ ] ' /oxgc) { return 'Eoldutf8::split' . $e . qq {' '}; }
4888 2         12 elsif (/\G " [ ] " /oxgc) { return 'Eoldutf8::split' . $e . qq {" "}; }
4889              
4890             # split qq//
4891             elsif (/\G \b (qq) \b /oxgc) {
4892 0 0       0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
  0         0  
4893             else {
4894 0         0 while (not /\G \z/oxgc) {
4895 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4896 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
4897 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
4898 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
4899 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
4900 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
4901 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
4902             }
4903 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4904             }
4905             }
4906              
4907             # split qr//
4908             elsif (/\G \b (qr) \b /oxgc) {
4909 12 50       551 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
  0         0  
4910             else {
4911 12         56 while (not /\G \z/oxgc) {
4912 12 50       4297 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    50          
    50          
    50          
4913 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
4914 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
4915 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
4916 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
4917 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
4918 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
4919 12         58 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
4920             }
4921 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4922             }
4923             }
4924              
4925             # split q//
4926             elsif (/\G \b (q) \b /oxgc) {
4927 0 0       0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
  0         0  
4928             else {
4929 0         0 while (not /\G \z/oxgc) {
4930 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4931 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
4932 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
4933 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
4934 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
4935 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
4936 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
4937             }
4938 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4939             }
4940             }
4941              
4942             # split m//
4943             elsif (/\G \b (m) \b /oxgc) {
4944 24 50       687 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
  0         0  
4945             else {
4946 24         84 while (not /\G \z/oxgc) {
4947 24 50       5225 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    50          
    50          
    50          
4948 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
4949 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
4950 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
4951 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
4952 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
4953 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
4954 24         105 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
4955             }
4956 0         0 die __FILE__, ": Search pattern not terminated\n";
4957             }
4958             }
4959              
4960             # split ''
4961             elsif (/\G (\') /oxgc) {
4962 0         0 my $q_string = '';
4963 0         0 while (not /\G \z/oxgc) {
4964 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
4965 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
4966 0         0 elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
4967 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4968             }
4969 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4970             }
4971              
4972             # split ""
4973             elsif (/\G (\") /oxgc) {
4974 0         0 my $qq_string = '';
4975 0         0 while (not /\G \z/oxgc) {
4976 0 0       0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
4977 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
4978 0         0 elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
4979 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
4980             }
4981 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4982             }
4983              
4984             # split //
4985             elsif (/\G (\/) /oxgc) {
4986 65         100 my $regexp = '';
4987 65         189 while (not /\G \z/oxgc) {
4988 434 50       2293 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
  0 50       0  
    100          
    50          
4989 0         0 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
4990 65         270 elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
4991 369         739 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4992             }
4993 0         0 die __FILE__, ": Search pattern not terminated\n";
4994             }
4995             }
4996              
4997             # tr/// or y///
4998              
4999             # about [cdsrbB]* (/B modifier)
5000             #
5001             # P.559 appendix C
5002             # of ISBN 4-89052-384-7 Programming perl
5003             # (Japanese title is: Perl puroguramingu)
5004              
5005             elsif (/\G \b ( tr | y ) \b /oxgc) {
5006 11         18 my $ope = $1;
5007              
5008             # $1 $2 $3 $4 $5 $6
5009 11 50       190 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
5010 0         0 my @tr = ($tr_variable,$2);
5011 0         0 return e_tr(@tr,'',$4,$6);
5012             }
5013             else {
5014 11         15 my $e = '';
5015 11         28 while (not /\G \z/oxgc) {
5016 11 50       910 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    50          
5017             elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
5018 0         0 my @tr = ($tr_variable,$2);
5019 0         0 while (not /\G \z/oxgc) {
5020 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
5021 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
5022 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
5023 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
5024 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
5025 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
5026             }
5027 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
5028             }
5029             elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
5030 0         0 my @tr = ($tr_variable,$2);
5031 0         0 while (not /\G \z/oxgc) {
5032 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
5033 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
5034 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
5035 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
5036 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
5037 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
5038             }
5039 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
5040             }
5041             elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
5042 0         0 my @tr = ($tr_variable,$2);
5043 0         0 while (not /\G \z/oxgc) {
5044 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
5045 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
5046 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
5047 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
5048 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
5049 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
5050             }
5051 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
5052             }
5053             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
5054 0         0 my @tr = ($tr_variable,$2);
5055 0         0 while (not /\G \z/oxgc) {
5056 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
5057 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
5058 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
5059 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
5060 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
5061 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
5062             }
5063 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
5064             }
5065             # $1 $2 $3 $4 $5 $6
5066             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
5067 11         34 my @tr = ($tr_variable,$2);
5068 11         23 return e_tr(@tr,'',$4,$6);
5069             }
5070             }
5071 0         0 die __FILE__, ": Transliteration pattern not terminated\n";
5072             }
5073             }
5074              
5075             # qq//
5076             elsif (/\G \b (qq) \b /oxgc) {
5077 3772         5350 my $ope = $1;
5078              
5079             # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
5080 3772 100       5108 if (/\G (\#) /oxgc) { # qq# #
5081 40         35 my $qq_string = '';
5082 40         77 while (not /\G \z/oxgc) {
5083 1948 100       4890 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  80 50       126  
    100          
    50          
5084 0         0 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
5085 40         63 elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
5086 1828         2707 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5087             }
5088 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5089             }
5090              
5091             else {
5092 3732         3688 my $e = '';
5093 3732         7230 while (not /\G \z/oxgc) {
5094 3732 50       11861 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    100          
    50          
    100          
    50          
5095              
5096             # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
5097             elsif (/\G (\() /oxgc) { # qq ( )
5098 0         0 my $qq_string = '';
5099 0         0 local $nest = 1;
5100 0         0 while (not /\G \z/oxgc) {
5101 0 0       0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
    0          
5102 0         0 elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
5103 0         0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
5104             elsif (/\G (\)) /oxgc) {
5105 0 0       0 if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
  0         0  
5106 0         0 else { $qq_string .= $1; }
5107             }
5108 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5109             }
5110 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5111             }
5112              
5113             # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
5114             elsif (/\G (\{) /oxgc) { # qq { }
5115 3674         2917 my $qq_string = '';
5116 3674         3843 local $nest = 1;
5117 3674         6266 while (not /\G \z/oxgc) {
5118 154550 100       461966 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  792 50       1395  
    100          
    100          
    50          
5119 0         0 elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
5120 1334         1364 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  1334         1948  
5121             elsif (/\G (\}) /oxgc) {
5122 5008 100       5857 if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
  3674         6207  
5123 1334         2267 else { $qq_string .= $1; }
5124             }
5125 147416         232462 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5126             }
5127 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5128             }
5129              
5130             # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
5131             elsif (/\G (\[) /oxgc) { # qq [ ]
5132 0         0 my $qq_string = '';
5133 0         0 local $nest = 1;
5134 0         0 while (not /\G \z/oxgc) {
5135 0 0       0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
    0          
5136 0         0 elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
5137 0         0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
5138             elsif (/\G (\]) /oxgc) {
5139 0 0       0 if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
  0         0  
5140 0         0 else { $qq_string .= $1; }
5141             }
5142 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5143             }
5144 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5145             }
5146              
5147             # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
5148             elsif (/\G (\<) /oxgc) { # qq < >
5149 38         42 my $qq_string = '';
5150 38         56 local $nest = 1;
5151 38         86 while (not /\G \z/oxgc) {
5152 1418 100       4847 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  22 50       46  
    50          
    100          
    50          
5153 0         0 elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
5154 0         0 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
5155             elsif (/\G (\>) /oxgc) {
5156 38 50       70 if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
  38         81  
5157 0         0 else { $qq_string .= $1; }
5158             }
5159 1358         2135 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5160             }
5161 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5162             }
5163              
5164             # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
5165             elsif (/\G (\S) /oxgc) { # qq * *
5166 20         18 my $delimiter = $1;
5167 20         16 my $qq_string = '';
5168 20         30 while (not /\G \z/oxgc) {
5169 840 50       2148 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 50       0  
    100          
    50          
5170 0         0 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
5171 20         27 elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
5172 820         1241 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
5173             }
5174 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5175             }
5176             }
5177 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5178             }
5179             }
5180              
5181             # qr//
5182             elsif (/\G \b (qr) \b /oxgc) {
5183 36         52 my $ope = $1;
5184 36 50       389 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
5185 0         0 return e_qr($ope,$1,$3,$2,$4);
5186             }
5187             else {
5188 36         40 my $e = '';
5189 36         81 while (not /\G \z/oxgc) {
5190 36 50       2665 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    100          
    50          
    50          
    100          
    50          
    50          
5191 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
5192 1         5 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
5193 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
5194 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
5195 2         7 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
5196 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
5197 33         79 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
5198             }
5199 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5200             }
5201             }
5202              
5203             # qw//
5204             elsif (/\G \b (qw) \b /oxgc) {
5205 34         62 my $ope = $1;
5206 34 50       136 if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
5207 0         0 return e_qw($ope,$1,$3,$2);
5208             }
5209             else {
5210 34         40 my $e = '';
5211 34         91 while (not /\G \z/oxgc) {
5212 34 50       193 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5213              
5214 34         98 elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
5215 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
5216              
5217 0         0 elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
5218 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
5219              
5220 0         0 elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
5221 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
5222              
5223 0         0 elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
5224 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
5225              
5226 0         0 elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
5227 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
5228             }
5229 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5230             }
5231             }
5232              
5233             # qx//
5234             elsif (/\G \b (qx) \b /oxgc) {
5235 2         4 my $ope = $1;
5236 2 50       45 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
5237 0         0 return e_qq($ope,$1,$3,$2);
5238             }
5239             else {
5240 2         5 my $e = '';
5241 2         7 while (not /\G \z/oxgc) {
5242 2 50       144 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    0          
    0          
    0          
    0          
5243 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
5244 2         8 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
5245 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
5246 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
5247 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
5248 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
5249             }
5250 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5251             }
5252             }
5253              
5254             # q//
5255             elsif (/\G \b (q) \b /oxgc) {
5256 362         768 my $ope = $1;
5257              
5258             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
5259              
5260             # avoid "Error: Runtime exception" of perl version 5.005_03
5261             # (and so on)
5262              
5263 362 50       998 if (/\G (\#) /oxgc) { # q# #
5264 0         0 my $q_string = '';
5265 0         0 while (not /\G \z/oxgc) {
5266 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
5267 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
5268 0         0 elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
5269 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5270             }
5271 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5272             }
5273              
5274             else {
5275 362         597 my $e = '';
5276 362         1162 while (not /\G \z/oxgc) {
5277 362 50       2637 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    100          
    50          
    100          
    50          
5278              
5279             # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
5280             elsif (/\G (\() /oxgc) { # q ( )
5281 0         0 my $q_string = '';
5282 0         0 local $nest = 1;
5283 0         0 while (not /\G \z/oxgc) {
5284 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
5285 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
5286 0         0 elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
5287 0         0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  0         0  
5288             elsif (/\G (\)) /oxgc) {
5289 0 0       0 if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
  0         0  
5290 0         0 else { $q_string .= $1; }
5291             }
5292 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5293             }
5294 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5295             }
5296              
5297             # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
5298             elsif (/\G (\{) /oxgc) { # q { }
5299 356         556 my $q_string = '';
5300 356         627 local $nest = 1;
5301 356         1015 while (not /\G \z/oxgc) {
5302 5038 50       27016 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 50       0  
    50          
    100          
    100          
    50          
5303 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
5304 0         0 elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
5305 114         157 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  114         194  
5306             elsif (/\G (\}) /oxgc) {
5307 470 100       942 if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
  356         1074  
5308 114         197 else { $q_string .= $1; }
5309             }
5310 4454         7852 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5311             }
5312 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5313             }
5314              
5315             # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
5316             elsif (/\G (\[) /oxgc) { # q [ ]
5317 0         0 my $q_string = '';
5318 0         0 local $nest = 1;
5319 0         0 while (not /\G \z/oxgc) {
5320 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
5321 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
5322 0         0 elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
5323 0         0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
5324             elsif (/\G (\]) /oxgc) {
5325 0 0       0 if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
  0         0  
5326 0         0 else { $q_string .= $1; }
5327             }
5328 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5329             }
5330 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5331             }
5332              
5333             # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
5334             elsif (/\G (\<) /oxgc) { # q < >
5335 5         18 my $q_string = '';
5336 5         16 local $nest = 1;
5337 5         18 while (not /\G \z/oxgc) {
5338 82 50       416 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 50       0  
    50          
    50          
    100          
    50          
5339 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
5340 0         0 elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
5341 0         0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
5342             elsif (/\G (\>) /oxgc) {
5343 5 50       16 if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
  5         14  
5344 0         0 else { $q_string .= $1; }
5345             }
5346 77         128 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5347             }
5348 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5349             }
5350              
5351             # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
5352             elsif (/\G (\S) /oxgc) { # q * *
5353 1         2 my $delimiter = $1;
5354 1         2 my $q_string = '';
5355 1         3 while (not /\G \z/oxgc) {
5356 14 50       90 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 50       0  
    100          
    50          
5357 0         0 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
5358 1         4 elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
5359 13         67 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5360             }
5361 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5362             }
5363             }
5364 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5365             }
5366             }
5367              
5368             # m//
5369             elsif (/\G \b (m) \b /oxgc) {
5370 269         415 my $ope = $1;
5371 269 50       2411 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
5372 0         0 return e_qr($ope,$1,$3,$2,$4);
5373             }
5374             else {
5375 269         268 my $e = '';
5376 269         639 while (not /\G \z/oxgc) {
5377 269 50       18703 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
5378 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
5379 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
5380 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
5381 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
5382 18         53 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
5383 13         38 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
5384 0         0 elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
5385 238         627 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
5386             }
5387 0         0 die __FILE__, ": Search pattern not terminated\n";
5388             }
5389             }
5390              
5391             # s///
5392              
5393             # about [cegimosxpradlunbB]* (/cg modifier)
5394             #
5395             # P.67 Pattern-Matching Operators
5396             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
5397              
5398             elsif (/\G \b (s) \b /oxgc) {
5399 132         261 my $ope = $1;
5400              
5401             # $1 $2 $3 $4 $5 $6
5402 132 100       4672 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
5403 1         5 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5404             }
5405             else {
5406 131         188 my $e = '';
5407 131         408 while (not /\G \z/oxgc) {
5408 131 50       29549 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
5409             elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
5410 0         0 my @s = ($1,$2,$3);
5411 0         0 while (not /\G \z/oxgc) {
5412 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5413             # $1 $2 $3 $4
5414 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5415 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5416 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5417 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5418 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5419 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5420 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5421 0         0 elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5422 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5423             }
5424 0         0 die __FILE__, ": Substitution replacement not terminated\n";
5425             }
5426             elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
5427 0         0 my @s = ($1,$2,$3);
5428 0         0 while (not /\G \z/oxgc) {
5429 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5430             # $1 $2 $3 $4
5431 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5432 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5433 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5434 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5435 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5436 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5437 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5438 0         0 elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5439 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5440             }
5441 0         0 die __FILE__, ": Substitution replacement not terminated\n";
5442             }
5443             elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
5444 0         0 my @s = ($1,$2,$3);
5445 0         0 while (not /\G \z/oxgc) {
5446 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
5447             # $1 $2 $3 $4
5448 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5449 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5450 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5451 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5452 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5453 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5454 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5455             }
5456 0         0 die __FILE__, ": Substitution replacement not terminated\n";
5457             }
5458             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
5459 0         0 my @s = ($1,$2,$3);
5460 0         0 while (not /\G \z/oxgc) {
5461 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
5462             # $1 $2 $3 $4
5463 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5464 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5465 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5466 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5467 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5468 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5469 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5470 0         0 elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5471 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
5472             }
5473 0         0 die __FILE__, ": Substitution replacement not terminated\n";
5474             }
5475             # $1 $2 $3 $4 $5 $6
5476             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
5477 22         65 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5478             }
5479             # $1 $2 $3 $4 $5 $6
5480             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
5481 2         10 return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
5482             }
5483             # $1 $2 $3 $4 $5 $6
5484             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
5485 0         0 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5486             }
5487             # $1 $2 $3 $4 $5 $6
5488             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
5489 107         428 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
5490             }
5491             }
5492 0         0 die __FILE__, ": Substitution pattern not terminated\n";
5493             }
5494             }
5495              
5496             # require ignore module
5497 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
5498 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "# require$1\n$2"; }
5499 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
5500              
5501             # use strict; --> use strict; no strict qw(refs);
5502 42         316 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
5503 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
5504 0         0 elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
5505              
5506             # use 5.12.0; --> use 5.12.0; no strict qw(refs);
5507             elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
5508 3 50 33     46 if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
      33        
5509 0         0 return "use $1; no strict qw(refs);";
5510             }
5511             else {
5512 3         18 return "use $1;";
5513             }
5514             }
5515             elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
5516 0 0 0     0 if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
      0        
5517 0         0 return "use $1; no strict qw(refs);";
5518             }
5519             else {
5520 0         0 return "use $1;";
5521             }
5522             }
5523              
5524             # ignore use module
5525 2         13 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
5526 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "# use$1\n$2"; }
5527 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
5528              
5529             # ignore no module
5530 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
5531 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xFF#]) /oxmsgc) { return "# no$1\n$2"; }
5532 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
5533              
5534             # use else
5535 0         0 elsif (/\G \b use \b /oxmsgc) { return "use"; }
5536              
5537             # use else
5538 2         10 elsif (/\G \b no \b /oxmsgc) { return "no"; }
5539              
5540             # ''
5541             elsif (/\G (?
5542 1582         2180 my $q_string = '';
5543 1582         3273 while (not /\G \z/oxgc) {
5544 10552 100       35691 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  4 100       12  
    100          
    50          
5545 48         72 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
5546 1582         2860 elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
5547 8918         15640 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
5548             }
5549 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5550             }
5551              
5552             # ""
5553             elsif (/\G (\") /oxgc) {
5554 4932         5766 my $qq_string = '';
5555 4932         10588 while (not /\G \z/oxgc) {
5556 78117 100       210962 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  109 100       215  
    100          
    50          
5557 12         21 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
5558 4932         8708 elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
5559 73064         118206 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
5560             }
5561 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5562             }
5563              
5564             # ``
5565             elsif (/\G (\`) /oxgc) {
5566 1         2 my $qx_string = '';
5567 1         3 while (not /\G \z/oxgc) {
5568 19 50       94 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
  0 50       0  
    100          
    50          
5569 0         0 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
5570 1         3 elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
5571 18         28 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
5572             }
5573 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5574             }
5575              
5576             # // --- not divide operator (num / num), not defined-or
5577             elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
5578 1068         1400 my $regexp = '';
5579 1068         2438 while (not /\G \z/oxgc) {
5580 10229 100       33445 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
  1 50       3  
    100          
    50          
5581 0         0 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
5582 1068         2424 elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
5583 9160         15614 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
5584             }
5585 0         0 die __FILE__, ": Search pattern not terminated\n";
5586             }
5587              
5588             # ?? --- not conditional operator (condition ? then : else)
5589             elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
5590 18         21 my $regexp = '';
5591 18         36 while (not /\G \z/oxgc) {
5592 82 50       345 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
  0 50       0  
    100          
    50          
5593 0         0 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
5594 18         39 elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
5595 64         123 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
5596             }
5597 0         0 die __FILE__, ": Search pattern not terminated\n";
5598             }
5599              
5600             # <<>> (a safer ARGV)
5601 0         0 elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
  0         0  
5602              
5603             # << (bit shift) --- not here document
5604 0         0 elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
  0         0  
5605              
5606             # <<'HEREDOC'
5607             elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
5608 80         81 $slash = 'm//';
5609 80         111 my $here_quote = $1;
5610 80         89 my $delimiter = $2;
5611              
5612             # get here document
5613 80 100       128 if ($here_script eq '') {
5614 77         250 $here_script = CORE::substr $_, pos $_;
5615 77         326 $here_script =~ s/.*?\n//oxm;
5616             }
5617 80 50       543 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5618 80         186 push @heredoc, $1 . qq{\n$delimiter\n};
5619 80         103 push @heredoc_delimiter, $delimiter;
5620             }
5621             else {
5622 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5623             }
5624 80         252 return $here_quote;
5625             }
5626              
5627             # <<\HEREDOC
5628              
5629             # P.66 2.6.6. "Here" Documents
5630             # in Chapter 2: Bits and Pieces
5631             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5632              
5633             # P.73 "Here" Documents
5634             # in Chapter 2: Bits and Pieces
5635             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5636              
5637             elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
5638 2         3 $slash = 'm//';
5639 2         3 my $here_quote = $1;
5640 2         3 my $delimiter = $2;
5641              
5642             # get here document
5643 2 100       4 if ($here_script eq '') {
5644 1         5 $here_script = CORE::substr $_, pos $_;
5645 1         5 $here_script =~ s/.*?\n//oxm;
5646             }
5647 2 50       23 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5648 2         6 push @heredoc, $1 . qq{\n$delimiter\n};
5649 2         3 push @heredoc_delimiter, $delimiter;
5650             }
5651             else {
5652 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5653             }
5654 2         7 return $here_quote;
5655             }
5656              
5657             # <<"HEREDOC"
5658             elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
5659 39         68 $slash = 'm//';
5660 39         70 my $here_quote = $1;
5661 39         65 my $delimiter = $2;
5662              
5663             # get here document
5664 39 100       452 if ($here_script eq '') {
5665 38         210 $here_script = CORE::substr $_, pos $_;
5666 38         186 $here_script =~ s/.*?\n//oxm;
5667             }
5668 39 50       434 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5669 39         352 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5670 39         95 push @heredoc_delimiter, $delimiter;
5671             }
5672             else {
5673 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5674             }
5675 39         212 return $here_quote;
5676             }
5677              
5678             # <
5679             elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
5680 54         90 $slash = 'm//';
5681 54         92 my $here_quote = $1;
5682 54         73 my $delimiter = $2;
5683              
5684             # get here document
5685 54 100       156 if ($here_script eq '') {
5686 51         262 $here_script = CORE::substr $_, pos $_;
5687 51         256 $here_script =~ s/.*?\n//oxm;
5688             }
5689 54 50       702 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5690 54         137 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5691 54         94 push @heredoc_delimiter, $delimiter;
5692             }
5693             else {
5694 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5695             }
5696 54         204 return $here_quote;
5697             }
5698              
5699             # <<`HEREDOC`
5700             elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
5701 0         0 $slash = 'm//';
5702 0         0 my $here_quote = $1;
5703 0         0 my $delimiter = $2;
5704              
5705             # get here document
5706 0 0       0 if ($here_script eq '') {
5707 0         0 $here_script = CORE::substr $_, pos $_;
5708 0         0 $here_script =~ s/.*?\n//oxm;
5709             }
5710 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5711 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5712 0         0 push @heredoc_delimiter, $delimiter;
5713             }
5714             else {
5715 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5716             }
5717 0         0 return $here_quote;
5718             }
5719              
5720             # <<= <=> <= < operator
5721             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
5722 11         42 return $1;
5723             }
5724              
5725             #
5726             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
5727 0         0 return $1;
5728             }
5729              
5730             # --- glob
5731              
5732             # avoid "Error: Runtime exception" of perl version 5.005_03
5733              
5734             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) {
5735 0         0 return 'Eoldutf8::glob("' . $1 . '")';
5736             }
5737              
5738             # __DATA__
5739 0         0 elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
5740              
5741             # __END__
5742 302         1734 elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
5743              
5744             # \cD Control-D
5745              
5746             # P.68 2.6.8. Other Literal Tokens
5747             # in Chapter 2: Bits and Pieces
5748             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5749              
5750             # P.76 Other Literal Tokens
5751             # in Chapter 2: Bits and Pieces
5752             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5753              
5754 0         0 elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
5755              
5756             # \cZ Control-Z
5757 0         0 elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
5758              
5759             # any operator before div
5760             elsif (/\G (
5761             -- | \+\+ |
5762             [\)\}\]]
5763              
5764 8299         8895 ) /oxgc) { $slash = 'div'; return $1; }
  8299         29207  
5765              
5766             # yada-yada or triple-dot operator
5767             elsif (/\G (
5768             \.\.\.
5769              
5770 7         7 ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
  7         18  
5771              
5772             # any operator before m//
5773              
5774             # //, //= (defined-or)
5775              
5776             # P.164 Logical Operators
5777             # in Chapter 10: More Control Structures
5778             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
5779              
5780             # P.119 C-Style Logical (Short-Circuit) Operators
5781             # in Chapter 3: Unary and Binary Operators
5782             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5783              
5784             # (and so on)
5785              
5786             # ~~
5787              
5788             # P.221 The Smart Match Operator
5789             # in Chapter 15: Smart Matching and given-when
5790             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
5791              
5792             # P.112 Smartmatch Operator
5793             # in Chapter 3: Unary and Binary Operators
5794             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5795              
5796             # (and so on)
5797              
5798             elsif (/\G ((?>
5799              
5800             !~~ | !~ | != | ! |
5801             %= | % |
5802             &&= | && | &= | &\.= | &\. | & |
5803             -= | -> | - |
5804             :(?>\s*)= |
5805             : |
5806             <<>> |
5807             <<= | <=> | <= | < |
5808             == | => | =~ | = |
5809             >>= | >> | >= | > |
5810             \*\*= | \*\* | \*= | \* |
5811             \+= | \+ |
5812             \.\. | \.= | \. |
5813             \/\/= | \/\/ |
5814             \/= | \/ |
5815             \? |
5816             \\ |
5817             \^= | \^\.= | \^\. | \^ |
5818             \b x= |
5819             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
5820             ~~ | ~\. | ~ |
5821             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
5822             \b(?: print )\b |
5823              
5824             [,;\(\{\[]
5825              
5826 15664         16136 )) /oxgc) { $slash = 'm//'; return $1; }
  15664         54038  
5827              
5828             # other any character
5829 23525         22627 elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
  23525         83787  
5830              
5831             # system error
5832             else {
5833 0         0 die __FILE__, ": Oops, this shouldn't happen!\n";
5834             }
5835             }
5836              
5837             # escape old UTF-8 string
5838             sub e_string {
5839 2444     2444 0 3814 my($string) = @_;
5840 2444         2239 my $e_string = '';
5841              
5842 2444         2508 local $slash = 'm//';
5843              
5844             # P.1024 Appendix W.10 Multibyte Processing
5845             # of ISBN 1-56592-224-7 CJKV Information Processing
5846             # (and so on)
5847              
5848 2444         25226 my @char = $string =~ / \G (?>[^\x80-\xFF\\]|\\$q_char|$q_char) /oxmsg;
5849              
5850             # without { ... }
5851 2444 100 66     9918 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
5852 2405 50       4215 if ($string !~ /<
5853 2405         5096 return $string;
5854             }
5855             }
5856              
5857             E_STRING_LOOP:
5858 39         97 while ($string !~ /\G \z/oxgc) {
5859 293 50       20679 if (0) {
    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          
    100          
    50          
    100          
    50          
5860             }
5861              
5862             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Eoldutf8::PREMATCH()]}
5863 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
5864 0         0 $e_string .= q{Eoldutf8::PREMATCH()};
5865 0         0 $slash = 'div';
5866             }
5867              
5868             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Eoldutf8::MATCH()]}
5869             elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
5870 0         0 $e_string .= q{Eoldutf8::MATCH()};
5871 0         0 $slash = 'div';
5872             }
5873              
5874             # $', ${'} --> $', ${'}
5875             elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
5876 0         0 $e_string .= $1;
5877 0         0 $slash = 'div';
5878             }
5879              
5880             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Eoldutf8::POSTMATCH()]}
5881             elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
5882 0         0 $e_string .= q{Eoldutf8::POSTMATCH()};
5883 0         0 $slash = 'div';
5884             }
5885              
5886             # bareword
5887             elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
5888 0         0 $e_string .= $1;
5889 0         0 $slash = 'div';
5890             }
5891              
5892             # $0 --> $0
5893             elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
5894 0         0 $e_string .= $1;
5895 0         0 $slash = 'div';
5896             }
5897             elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
5898 0         0 $e_string .= $1;
5899 0         0 $slash = 'div';
5900             }
5901              
5902             # $$ --> $$
5903             elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
5904 0         0 $e_string .= $1;
5905 0         0 $slash = 'div';
5906             }
5907              
5908             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5909             # $1, $2, $3 --> $1, $2, $3 otherwise
5910             elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
5911 0         0 $e_string .= e_capture($1);
5912 0         0 $slash = 'div';
5913             }
5914             elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
5915 0         0 $e_string .= e_capture($1);
5916 0         0 $slash = 'div';
5917             }
5918              
5919             # $$foo[ ... ] --> $ $foo->[ ... ]
5920             elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
5921 0         0 $e_string .= e_capture($1.'->'.$2);
5922 0         0 $slash = 'div';
5923             }
5924              
5925             # $$foo{ ... } --> $ $foo->{ ... }
5926             elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
5927 0         0 $e_string .= e_capture($1.'->'.$2);
5928 0         0 $slash = 'div';
5929             }
5930              
5931             # $$foo
5932             elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
5933 0         0 $e_string .= e_capture($1);
5934 0         0 $slash = 'div';
5935             }
5936              
5937             # ${ foo }
5938             elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
5939 0         0 $e_string .= '${' . $1 . '}';
5940 0         0 $slash = 'div';
5941             }
5942              
5943             # ${ ... }
5944             elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
5945 3         7 $e_string .= e_capture($1);
5946 3         13 $slash = 'div';
5947             }
5948              
5949             # variable or function
5950             # $ @ % & * $ #
5951             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) {
5952 1         2 $e_string .= $1;
5953 1         4 $slash = 'div';
5954             }
5955             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
5956             # $ @ # \ ' " / ? ( ) [ ] < >
5957             elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
5958 0         0 $e_string .= $1;
5959 0         0 $slash = 'div';
5960             }
5961              
5962             # subroutines of package Eoldutf8
5963 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
5964 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
5965 0         0 elsif ($string =~ /\G \b OldUTF8::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
5966 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
5967 0         0 elsif ($string =~ /\G \b OldUTF8::eval \b /oxgc) { $e_string .= 'eval OldUTF8::escape'; $slash = 'm//'; }
  0         0  
5968 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
5969 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Eoldutf8::chop'; $slash = 'm//'; }
  0         0  
5970 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
5971 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
5972 0         0 elsif ($string =~ /\G \b OldUTF8::index \b /oxgc) { $e_string .= 'OldUTF8::index'; $slash = 'm//'; }
  0         0  
5973 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Eoldutf8::index'; $slash = 'm//'; }
  0         0  
5974 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
5975 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
5976 0         0 elsif ($string =~ /\G \b OldUTF8::rindex \b /oxgc) { $e_string .= 'OldUTF8::rindex'; $slash = 'm//'; }
  0         0  
5977 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Eoldutf8::rindex'; $slash = 'm//'; }
  0         0  
5978 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::lc'; $slash = 'm//'; }
  0         0  
5979 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::lcfirst'; $slash = 'm//'; }
  0         0  
5980 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::uc'; $slash = 'm//'; }
  0         0  
5981 0         0 elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::ucfirst'; $slash = 'm//'; }
  0         0  
5982 0         0 elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::fc'; $slash = 'm//'; }
  0         0  
5983              
5984             # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
5985 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
5986 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  
5987 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  
5988 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  
5989 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  
5990 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
5991 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  
5992              
5993 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
5994 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  
5995 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  
5996 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  
5997 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  
5998 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
5999 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
6000              
6001             elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
6002 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
6003 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
6004 0         0 elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
  0         0  
6005 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
6006              
6007 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
6008 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
6009 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::chr'; $slash = 'm//'; }
  0         0  
6010 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
6011 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
6012 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eoldutf8::glob'; $slash = 'm//'; }
  0         0  
6013 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Eoldutf8::lc_'; $slash = 'm//'; }
  0         0  
6014 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Eoldutf8::lcfirst_'; $slash = 'm//'; }
  0         0  
6015 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Eoldutf8::uc_'; $slash = 'm//'; }
  0         0  
6016 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Eoldutf8::ucfirst_'; $slash = 'm//'; }
  0         0  
6017 0         0 elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Eoldutf8::fc_'; $slash = 'm//'; }
  0         0  
6018 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
6019              
6020 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
6021 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
6022 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Eoldutf8::chr_'; $slash = 'm//'; }
  0         0  
6023 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
6024 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
6025 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Eoldutf8::glob_'; $slash = 'm//'; }
  0         0  
6026 0         0 elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
  0         0  
6027 0         0 elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
  0         0  
6028             # split
6029             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
6030 0         0 $slash = 'm//';
6031              
6032 0         0 my $e = '';
6033 0         0 while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
6034 0         0 $e .= $1;
6035             }
6036              
6037             # end of split
6038 0 0       0 if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Eoldutf8::split' . $e; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
6039              
6040             # split scalar value
6041 0         0 elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . e_string($1); next E_STRING_LOOP; }
  0         0  
6042              
6043             # split literal space
6044 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
6045 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6046 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6047 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6048 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
6049 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  
6050 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
6051 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6052 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6053 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6054 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
6055 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  
6056 0         0 elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {' '}; next E_STRING_LOOP; }
  0         0  
6057 0         0 elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Eoldutf8::split' . $e . qq {" "}; next E_STRING_LOOP; }
  0         0  
6058              
6059             # split qq//
6060             elsif ($string =~ /\G \b (qq) \b /oxgc) {
6061 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
  0         0  
  0         0  
6062             else {
6063 0         0 while ($string !~ /\G \z/oxgc) {
6064 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6065 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  
6066 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  
6067 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  
6068 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  
6069 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
  0         0  
6070 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 * *
  0         0  
6071             }
6072 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6073             }
6074             }
6075              
6076             # split qr//
6077             elsif ($string =~ /\G \b (qr) \b /oxgc) {
6078 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
  0         0  
  0         0  
6079             else {
6080 0         0 while ($string !~ /\G \z/oxgc) {
6081 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
6082 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  
6083 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  
6084 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  
6085 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  
6086 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  
6087 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
  0         0  
6088 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 * *
  0         0  
6089             }
6090 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6091             }
6092             }
6093              
6094             # split q//
6095             elsif ($string =~ /\G \b (q) \b /oxgc) {
6096 0 0       0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
  0         0  
  0         0  
6097             else {
6098 0         0 while ($string !~ /\G \z/oxgc) {
6099 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6100 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  
6101 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  
6102 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  
6103 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  
6104 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
  0         0  
6105 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 * *
  0         0  
6106             }
6107 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6108             }
6109             }
6110              
6111             # split m//
6112             elsif ($string =~ /\G \b (m) \b /oxgc) {
6113 0 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 # #
  0         0  
  0         0  
6114             else {
6115 0         0 while ($string !~ /\G \z/oxgc) {
6116 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
6117 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  
6118 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  
6119 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  
6120 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  
6121 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  
6122 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
  0         0  
6123 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 * *
  0         0  
6124             }
6125 0         0 die __FILE__, ": Search pattern not terminated\n";
6126             }
6127             }
6128              
6129             # split ''
6130             elsif ($string =~ /\G (\') /oxgc) {
6131 0         0 my $q_string = '';
6132 0         0 while ($string !~ /\G \z/oxgc) {
6133 0 0       0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
6134 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
6135 0         0 elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
  0         0  
6136 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
6137             }
6138 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6139             }
6140              
6141             # split ""
6142             elsif ($string =~ /\G (\") /oxgc) {
6143 0         0 my $qq_string = '';
6144 0         0 while ($string !~ /\G \z/oxgc) {
6145 0 0       0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
6146 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
6147 0         0 elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
  0         0  
6148 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
6149             }
6150 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6151             }
6152              
6153             # split //
6154             elsif ($string =~ /\G (\/) /oxgc) {
6155 0         0 my $regexp = '';
6156 0         0 while ($string !~ /\G \z/oxgc) {
6157 0 0       0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0 0       0  
    0          
    0          
6158 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
6159 0         0 elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
  0         0  
6160 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
6161             }
6162 0         0 die __FILE__, ": Search pattern not terminated\n";
6163             }
6164             }
6165              
6166             # qq//
6167             elsif ($string =~ /\G \b (qq) \b /oxgc) {
6168 0         0 my $ope = $1;
6169 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
6170 0         0 $e_string .= e_qq($ope,$1,$3,$2);
6171             }
6172             else {
6173 0         0 my $e = '';
6174 0         0 while ($string !~ /\G \z/oxgc) {
6175 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
6176 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
6177 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
6178 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
6179 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
  0         0  
6180 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
  0         0  
6181             }
6182 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6183             }
6184             }
6185              
6186             # qx//
6187             elsif ($string =~ /\G \b (qx) \b /oxgc) {
6188 0         0 my $ope = $1;
6189 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
6190 0         0 $e_string .= e_qq($ope,$1,$3,$2);
6191             }
6192             else {
6193 0         0 my $e = '';
6194 0         0 while ($string !~ /\G \z/oxgc) {
6195 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6196 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
6197 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
6198 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
6199 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
6200 0         0 elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
  0         0  
6201 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
  0         0  
6202             }
6203 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6204             }
6205             }
6206              
6207             # q//
6208             elsif ($string =~ /\G \b (q) \b /oxgc) {
6209 0         0 my $ope = $1;
6210 0 0       0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
6211 0         0 $e_string .= e_q($ope,$1,$3,$2);
6212             }
6213             else {
6214 0         0 my $e = '';
6215 0         0 while ($string !~ /\G \z/oxgc) {
6216 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
6217 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
6218 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
6219 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
6220 0         0 elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
  0         0  
6221 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 * *
  0         0  
6222             }
6223 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6224             }
6225             }
6226              
6227             # ''
6228 12         33 elsif ($string =~ /\G (?
6229              
6230             # ""
6231 6         21 elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
6232              
6233             # ``
6234 0         0 elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
6235              
6236             # <<>> (a safer ARGV)
6237 0         0 elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
6238              
6239             # <<= <=> <= < operator
6240 0         0 elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
6241              
6242             #
6243 0         0 elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
6244              
6245             # --- glob
6246             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
6247 0         0 $e_string .= 'Eoldutf8::glob("' . $1 . '")';
6248             }
6249              
6250             # << (bit shift) --- not here document
6251 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; $e_string .= $1; }
  0         0  
6252              
6253             # <<'HEREDOC'
6254             elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
6255 0         0 $slash = 'm//';
6256 0         0 my $here_quote = $1;
6257 0         0 my $delimiter = $2;
6258              
6259             # get here document
6260 0 0       0 if ($here_script eq '') {
6261 0         0 $here_script = CORE::substr $_, pos $_;
6262 0         0 $here_script =~ s/.*?\n//oxm;
6263             }
6264 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6265 0         0 push @heredoc, $1 . qq{\n$delimiter\n};
6266 0         0 push @heredoc_delimiter, $delimiter;
6267             }
6268             else {
6269 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6270             }
6271 0         0 $e_string .= $here_quote;
6272             }
6273              
6274             # <<\HEREDOC
6275             elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
6276 0         0 $slash = 'm//';
6277 0         0 my $here_quote = $1;
6278 0         0 my $delimiter = $2;
6279              
6280             # get here document
6281 0 0       0 if ($here_script eq '') {
6282 0         0 $here_script = CORE::substr $_, pos $_;
6283 0         0 $here_script =~ s/.*?\n//oxm;
6284             }
6285 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6286 0         0 push @heredoc, $1 . qq{\n$delimiter\n};
6287 0         0 push @heredoc_delimiter, $delimiter;
6288             }
6289             else {
6290 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6291             }
6292 0         0 $e_string .= $here_quote;
6293             }
6294              
6295             # <<"HEREDOC"
6296             elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
6297 0         0 $slash = 'm//';
6298 0         0 my $here_quote = $1;
6299 0         0 my $delimiter = $2;
6300              
6301             # get here document
6302 0 0       0 if ($here_script eq '') {
6303 0         0 $here_script = CORE::substr $_, pos $_;
6304 0         0 $here_script =~ s/.*?\n//oxm;
6305             }
6306 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6307 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
6308 0         0 push @heredoc_delimiter, $delimiter;
6309             }
6310             else {
6311 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6312             }
6313 0         0 $e_string .= $here_quote;
6314             }
6315              
6316             # <
6317             elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
6318 0         0 $slash = 'm//';
6319 0         0 my $here_quote = $1;
6320 0         0 my $delimiter = $2;
6321              
6322             # get here document
6323 0 0       0 if ($here_script eq '') {
6324 0         0 $here_script = CORE::substr $_, pos $_;
6325 0         0 $here_script =~ s/.*?\n//oxm;
6326             }
6327 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6328 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
6329 0         0 push @heredoc_delimiter, $delimiter;
6330             }
6331             else {
6332 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6333             }
6334 0         0 $e_string .= $here_quote;
6335             }
6336              
6337             # <<`HEREDOC`
6338             elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
6339 0         0 $slash = 'm//';
6340 0         0 my $here_quote = $1;
6341 0         0 my $delimiter = $2;
6342              
6343             # get here document
6344 0 0       0 if ($here_script eq '') {
6345 0         0 $here_script = CORE::substr $_, pos $_;
6346 0         0 $here_script =~ s/.*?\n//oxm;
6347             }
6348 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
6349 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
6350 0         0 push @heredoc_delimiter, $delimiter;
6351             }
6352             else {
6353 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
6354             }
6355 0         0 $e_string .= $here_quote;
6356             }
6357              
6358             # any operator before div
6359             elsif ($string =~ /\G (
6360             -- | \+\+ |
6361             [\)\}\]]
6362              
6363 40         49 ) /oxgc) { $slash = 'div'; $e_string .= $1; }
  40         109  
6364              
6365             # yada-yada or triple-dot operator
6366             elsif ($string =~ /\G (
6367             \.\.\.
6368              
6369 0         0 ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
  0         0  
6370              
6371             # any operator before m//
6372             elsif ($string =~ /\G ((?>
6373              
6374             !~~ | !~ | != | ! |
6375             %= | % |
6376             &&= | && | &= | &\.= | &\. | & |
6377             -= | -> | - |
6378             :(?>\s*)= |
6379             : |
6380             <<>> |
6381             <<= | <=> | <= | < |
6382             == | => | =~ | = |
6383             >>= | >> | >= | > |
6384             \*\*= | \*\* | \*= | \* |
6385             \+= | \+ |
6386             \.\. | \.= | \. |
6387             \/\/= | \/\/ |
6388             \/= | \/ |
6389             \? |
6390             \\ |
6391             \^= | \^\.= | \^\. | \^ |
6392             \b x= |
6393             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
6394             ~~ | ~\. | ~ |
6395             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
6396             \b(?: print )\b |
6397              
6398             [,;\(\{\[]
6399              
6400 50         54 )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
  50         137  
6401              
6402             # other any character
6403 181         563 elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
6404              
6405             # system error
6406             else {
6407 0         0 die __FILE__, ": Oops, this shouldn't happen!\n";
6408             }
6409             }
6410              
6411 39         122 return $e_string;
6412             }
6413              
6414             #
6415             # character class
6416             #
6417             sub character_class {
6418 2930     2930 0 3166 my($char,$modifier) = @_;
6419              
6420 2930 100       3596 if ($char eq '.') {
6421 115 100       211 if ($modifier =~ /s/) {
6422 23         57 return '${Eoldutf8::dot_s}';
6423             }
6424             else {
6425 92         191 return '${Eoldutf8::dot}';
6426             }
6427             }
6428             else {
6429 2815         3712 return Eoldutf8::classic_character_class($char);
6430             }
6431             }
6432              
6433             #
6434             # escape capture ($1, $2, $3, ...)
6435             #
6436             sub e_capture {
6437              
6438 469     469 0 1835 return join '', '${', $_[0], '}';
6439             }
6440              
6441             #
6442             # escape transliteration (tr/// or y///)
6443             #
6444             sub e_tr {
6445 11     11 0 27 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
6446 11         11 my $e_tr = '';
6447 11   100     28 $modifier ||= '';
6448              
6449 11         13 $slash = 'div';
6450              
6451             # quote character class 1
6452 11         20 $charclass = q_tr($charclass);
6453              
6454             # quote character class 2
6455 11         20 $charclass2 = q_tr($charclass2);
6456              
6457             # /b /B modifier
6458 11 50       23 if ($modifier =~ tr/bB//d) {
6459 0 0       0 if ($variable eq '') {
6460 0         0 $e_tr = qq{tr$charclass$e$charclass2$modifier};
6461             }
6462             else {
6463 0         0 $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
6464             }
6465             }
6466             else {
6467 11 100       22 if ($variable eq '') {
6468 2         7 $e_tr = qq{Eoldutf8::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
6469             }
6470             else {
6471 9         26 $e_tr = qq{Eoldutf8::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
6472             }
6473             }
6474              
6475             # clear tr/// variable
6476 11         10 $tr_variable = '';
6477 11         11 $bind_operator = '';
6478              
6479 11         61 return $e_tr;
6480             }
6481              
6482             #
6483             # quote for escape transliteration (tr/// or y///)
6484             #
6485             sub q_tr {
6486 22     22 0 20 my($charclass) = @_;
6487              
6488             # quote character class
6489 22 50       37 if ($charclass !~ /'/oxms) {
    0          
    0          
    0          
    0          
    0          
6490 22         29 return e_q('', "'", "'", $charclass); # --> q' '
6491             }
6492             elsif ($charclass !~ /\//oxms) {
6493 0         0 return e_q('q', '/', '/', $charclass); # --> q/ /
6494             }
6495             elsif ($charclass !~ /\#/oxms) {
6496 0         0 return e_q('q', '#', '#', $charclass); # --> q# #
6497             }
6498             elsif ($charclass !~ /[\<\>]/oxms) {
6499 0         0 return e_q('q', '<', '>', $charclass); # --> q< >
6500             }
6501             elsif ($charclass !~ /[\(\)]/oxms) {
6502 0         0 return e_q('q', '(', ')', $charclass); # --> q( )
6503             }
6504             elsif ($charclass !~ /[\{\}]/oxms) {
6505 0         0 return e_q('q', '{', '}', $charclass); # --> q{ }
6506             }
6507             else {
6508 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6509 0 0       0 if ($charclass !~ /\Q$char\E/xms) {
6510 0         0 return e_q('q', $char, $char, $charclass);
6511             }
6512             }
6513             }
6514              
6515 0         0 return e_q('q', '{', '}', $charclass);
6516             }
6517              
6518             #
6519             # escape q string (q//, '')
6520             #
6521             sub e_q {
6522 1978     1978 0 3155 my($ope,$delimiter,$end_delimiter,$string) = @_;
6523              
6524 1978         2017 $slash = 'div';
6525              
6526 1978         8695 return join '', $ope, $delimiter, $string, $end_delimiter;
6527             }
6528              
6529             #
6530             # escape qq string (qq//, "", qx//, ``)
6531             #
6532             sub e_qq {
6533 8828     8828 0 12312 my($ope,$delimiter,$end_delimiter,$string) = @_;
6534              
6535 8828         7592 $slash = 'div';
6536              
6537 8828         6836 my $left_e = 0;
6538 8828         5979 my $right_e = 0;
6539              
6540             # split regexp
6541 8828         255451 my @char = $string =~ /\G((?>
6542             [^\x80-\xFF\\\$]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
6543             \\x\{ (?>[0-9A-Fa-f]+) \} |
6544             \\o\{ (?>[0-7]+) \} |
6545             \\N\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
6546             \\ $q_char |
6547             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6548             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6549             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6550             \$ (?>\s* [0-9]+) |
6551             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6552             \$ \$ (?![\w\{]) |
6553             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6554             $q_char
6555             ))/oxmsg;
6556              
6557 8828         26258 for (my $i=0; $i <= $#char; $i++) {
6558              
6559             # "\L\u" --> "\u\L"
6560 218545 50 66     773594 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
6561 0         0 @char[$i,$i+1] = @char[$i+1,$i];
6562             }
6563              
6564             # "\U\l" --> "\l\U"
6565             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6566 0         0 @char[$i,$i+1] = @char[$i+1,$i];
6567             }
6568              
6569             # octal escape sequence
6570             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6571 1         3 $char[$i] = Eoldutf8::octchr($1);
6572             }
6573              
6574             # hexadecimal escape sequence
6575             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6576 1         4 $char[$i] = Eoldutf8::hexchr($1);
6577             }
6578              
6579             # \N{CHARNAME} --> N{CHARNAME}
6580             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
6581 0         0 $char[$i] = $1;
6582             }
6583              
6584 218545 100       2072752 if (0) {
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
6585             }
6586              
6587             # \F
6588             #
6589             # P.69 Table 2-6. Translation escapes
6590             # in Chapter 2: Bits and Pieces
6591             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6592             # (and so on)
6593              
6594             # \u \l \U \L \F \Q \E
6595 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
6596 602 50       1247 if ($right_e < $left_e) {
6597 0         0 $char[$i] = '\\' . $char[$i];
6598             }
6599             }
6600             elsif ($char[$i] eq '\u') {
6601              
6602             # "STRING @{[ LIST EXPR ]} MORE STRING"
6603              
6604             # P.257 Other Tricks You Can Do with Hard References
6605             # in Chapter 8: References
6606             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
6607              
6608             # P.353 Other Tricks You Can Do with Hard References
6609             # in Chapter 8: References
6610             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6611              
6612             # (and so on)
6613              
6614 0         0 $char[$i] = '@{[Eoldutf8::ucfirst qq<';
6615 0         0 $left_e++;
6616             }
6617             elsif ($char[$i] eq '\l') {
6618 0         0 $char[$i] = '@{[Eoldutf8::lcfirst qq<';
6619 0         0 $left_e++;
6620             }
6621             elsif ($char[$i] eq '\U') {
6622 0         0 $char[$i] = '@{[Eoldutf8::uc qq<';
6623 0         0 $left_e++;
6624             }
6625             elsif ($char[$i] eq '\L') {
6626 6         6 $char[$i] = '@{[Eoldutf8::lc qq<';
6627 6         12 $left_e++;
6628             }
6629             elsif ($char[$i] eq '\F') {
6630 23         19 $char[$i] = '@{[Eoldutf8::fc qq<';
6631 23         34 $left_e++;
6632             }
6633             elsif ($char[$i] eq '\Q') {
6634 0         0 $char[$i] = '@{[CORE::quotemeta qq<';
6635 0         0 $left_e++;
6636             }
6637             elsif ($char[$i] eq '\E') {
6638 26 50       36 if ($right_e < $left_e) {
6639 26         24 $char[$i] = '>]}';
6640 26         38 $right_e++;
6641             }
6642             else {
6643 0         0 $char[$i] = '';
6644             }
6645             }
6646             elsif ($char[$i] eq '\Q') {
6647 0         0 while (1) {
6648 0 0       0 if (++$i > $#char) {
6649 0         0 last;
6650             }
6651 0 0       0 if ($char[$i] eq '\E') {
6652 0         0 last;
6653             }
6654             }
6655             }
6656             elsif ($char[$i] eq '\E') {
6657             }
6658              
6659             # $0 --> $0
6660             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6661             }
6662             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6663             }
6664              
6665             # $$ --> $$
6666             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6667             }
6668              
6669             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6670             # $1, $2, $3 --> $1, $2, $3 otherwise
6671             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6672 409         736 $char[$i] = e_capture($1);
6673             }
6674             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6675 0         0 $char[$i] = e_capture($1);
6676             }
6677              
6678             # $$foo[ ... ] --> $ $foo->[ ... ]
6679             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
6680 0         0 $char[$i] = e_capture($1.'->'.$2);
6681             }
6682              
6683             # $$foo{ ... } --> $ $foo->{ ... }
6684             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
6685 0         0 $char[$i] = e_capture($1.'->'.$2);
6686             }
6687              
6688             # $$foo
6689             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6690 0         0 $char[$i] = e_capture($1);
6691             }
6692              
6693             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
6694             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6695 44         93 $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
6696             }
6697              
6698             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
6699             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6700 45         97 $char[$i] = '@{[Eoldutf8::MATCH()]}';
6701             }
6702              
6703             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
6704             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6705 33         91 $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
6706             }
6707              
6708             # ${ foo } --> ${ foo }
6709             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
6710             }
6711              
6712             # ${ ... }
6713             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6714 0         0 $char[$i] = e_capture($1);
6715             }
6716             }
6717              
6718             # return string
6719 8828 100       12376 if ($left_e > $right_e) {
6720 3         20 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
6721             }
6722 8825         59908 return join '', $ope, $delimiter, @char, $end_delimiter;
6723             }
6724              
6725             #
6726             # escape qw string (qw//)
6727             #
6728             sub e_qw {
6729 34     34 0 125 my($ope,$delimiter,$end_delimiter,$string) = @_;
6730              
6731 34         43 $slash = 'div';
6732              
6733             # choice again delimiter
6734 34         327 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
  856         888  
6735 34 50       165 if (not $octet{$end_delimiter}) {
    0          
    0          
    0          
    0          
6736 34         197 return join '', $ope, $delimiter, $string, $end_delimiter;
6737             }
6738             elsif (not $octet{')'}) {
6739 0         0 return join '', $ope, '(', $string, ')';
6740             }
6741             elsif (not $octet{'}'}) {
6742 0         0 return join '', $ope, '{', $string, '}';
6743             }
6744             elsif (not $octet{']'}) {
6745 0         0 return join '', $ope, '[', $string, ']';
6746             }
6747             elsif (not $octet{'>'}) {
6748 0         0 return join '', $ope, '<', $string, '>';
6749             }
6750             else {
6751 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6752 0 0       0 if (not $octet{$char}) {
6753 0         0 return join '', $ope, $char, $string, $char;
6754             }
6755             }
6756             }
6757              
6758             # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
6759 0         0 my @string = CORE::split(/\s+/, $string);
6760 0         0 for my $string (@string) {
6761 0         0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
6762 0         0 for my $octet (@octet) {
6763 0 0       0 if ($octet =~ /\A (['\\]) \z/oxms) {
6764 0         0 $octet = '\\' . $1;
6765             }
6766             }
6767 0         0 $string = join '', @octet;
6768             }
6769 0         0 return join '', '(', (join ', ', map { "'$_'" } @string), ')';
  0         0  
6770             }
6771              
6772             #
6773             # escape here document (<<"HEREDOC", <
6774             #
6775             sub e_heredoc {
6776 93     93 0 187 my($string) = @_;
6777              
6778 93         107 $slash = 'm//';
6779              
6780 93         297 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
6781              
6782 93         107 my $left_e = 0;
6783 93         79 my $right_e = 0;
6784              
6785             # split regexp
6786 93         10197 my @char = $string =~ /\G((?>
6787             [^\x80-\xFF\\\$]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
6788             \\x\{ (?>[0-9A-Fa-f]+) \} |
6789             \\o\{ (?>[0-7]+) \} |
6790             \\N\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
6791             \\ $q_char |
6792             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6793             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6794             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6795             \$ (?>\s* [0-9]+) |
6796             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6797             \$ \$ (?![\w\{]) |
6798             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6799             $q_char
6800             ))/oxmsg;
6801              
6802 93         513 for (my $i=0; $i <= $#char; $i++) {
6803              
6804             # "\L\u" --> "\u\L"
6805 3088 50 66     10605 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
6806 0         0 @char[$i,$i+1] = @char[$i+1,$i];
6807             }
6808              
6809             # "\U\l" --> "\l\U"
6810             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6811 0         0 @char[$i,$i+1] = @char[$i+1,$i];
6812             }
6813              
6814             # octal escape sequence
6815             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6816 1         3 $char[$i] = Eoldutf8::octchr($1);
6817             }
6818              
6819             # hexadecimal escape sequence
6820             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6821 1         2 $char[$i] = Eoldutf8::hexchr($1);
6822             }
6823              
6824             # \N{CHARNAME} --> N{CHARNAME}
6825             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
6826 0         0 $char[$i] = $1;
6827             }
6828              
6829 3088 100       31368 if (0) {
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
6830             }
6831              
6832             # \u \l \U \L \F \Q \E
6833 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
6834 72 50       140 if ($right_e < $left_e) {
6835 0         0 $char[$i] = '\\' . $char[$i];
6836             }
6837             }
6838             elsif ($char[$i] eq '\u') {
6839 0         0 $char[$i] = '@{[Eoldutf8::ucfirst qq<';
6840 0         0 $left_e++;
6841             }
6842             elsif ($char[$i] eq '\l') {
6843 0         0 $char[$i] = '@{[Eoldutf8::lcfirst qq<';
6844 0         0 $left_e++;
6845             }
6846             elsif ($char[$i] eq '\U') {
6847 0         0 $char[$i] = '@{[Eoldutf8::uc qq<';
6848 0         0 $left_e++;
6849             }
6850             elsif ($char[$i] eq '\L') {
6851 6         6 $char[$i] = '@{[Eoldutf8::lc qq<';
6852 6         11 $left_e++;
6853             }
6854             elsif ($char[$i] eq '\F') {
6855 0         0 $char[$i] = '@{[Eoldutf8::fc qq<';
6856 0         0 $left_e++;
6857             }
6858             elsif ($char[$i] eq '\Q') {
6859 0         0 $char[$i] = '@{[CORE::quotemeta qq<';
6860 0         0 $left_e++;
6861             }
6862             elsif ($char[$i] eq '\E') {
6863 3 50       6 if ($right_e < $left_e) {
6864 3         1 $char[$i] = '>]}';
6865 3         7 $right_e++;
6866             }
6867             else {
6868 0         0 $char[$i] = '';
6869             }
6870             }
6871             elsif ($char[$i] eq '\Q') {
6872 0         0 while (1) {
6873 0 0       0 if (++$i > $#char) {
6874 0         0 last;
6875             }
6876 0 0       0 if ($char[$i] eq '\E') {
6877 0         0 last;
6878             }
6879             }
6880             }
6881             elsif ($char[$i] eq '\E') {
6882             }
6883              
6884             # $0 --> $0
6885             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6886             }
6887             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6888             }
6889              
6890             # $$ --> $$
6891             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6892             }
6893              
6894             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6895             # $1, $2, $3 --> $1, $2, $3 otherwise
6896             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6897 0         0 $char[$i] = e_capture($1);
6898             }
6899             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6900 0         0 $char[$i] = e_capture($1);
6901             }
6902              
6903             # $$foo[ ... ] --> $ $foo->[ ... ]
6904             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
6905 0         0 $char[$i] = e_capture($1.'->'.$2);
6906             }
6907              
6908             # $$foo{ ... } --> $ $foo->{ ... }
6909             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
6910 0         0 $char[$i] = e_capture($1.'->'.$2);
6911             }
6912              
6913             # $$foo
6914             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6915 0         0 $char[$i] = e_capture($1);
6916             }
6917              
6918             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
6919             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6920 8         40 $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
6921             }
6922              
6923             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
6924             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6925 8         37 $char[$i] = '@{[Eoldutf8::MATCH()]}';
6926             }
6927              
6928             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
6929             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6930 6         36 $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
6931             }
6932              
6933             # ${ foo } --> ${ foo }
6934             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
6935             }
6936              
6937             # ${ ... }
6938             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6939 0         0 $char[$i] = e_capture($1);
6940             }
6941             }
6942              
6943             # return string
6944 93 100       210 if ($left_e > $right_e) {
6945 3         20 return join '', @char, '>]}' x ($left_e - $right_e);
6946             }
6947 90         680 return join '', @char;
6948             }
6949              
6950             #
6951             # escape regexp (m//, qr//)
6952             #
6953             sub e_qr {
6954 1376     1376 0 2928 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6955 1376   100     3750 $modifier ||= '';
6956              
6957 1376         1714 $modifier =~ tr/p//d;
6958 1376 50       2858 if ($modifier =~ /([adlu])/oxms) {
6959 0         0 my $line = 0;
6960 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6961 0 0       0 if ($filename ne __FILE__) {
6962 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6963 0         0 last;
6964             }
6965             }
6966 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
6967             }
6968              
6969 1376         1475 $slash = 'div';
6970              
6971             # literal null string pattern
6972 1376 100       3391 if ($string eq '') {
    100          
6973 8         9 $modifier =~ tr/bB//d;
6974 8         6 $modifier =~ tr/i//d;
6975 8         36 return join '', $ope, $delimiter, $end_delimiter, $modifier;
6976             }
6977              
6978             # /b /B modifier
6979             elsif ($modifier =~ tr/bB//d) {
6980              
6981             # choice again delimiter
6982 25 50       99 if ($delimiter =~ / [\@:] /oxms) {
6983 0         0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
6984 0         0 my %octet = map {$_ => 1} @char;
  0         0  
6985 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
6986 0         0 $delimiter = '(';
6987 0         0 $end_delimiter = ')';
6988             }
6989             elsif (not $octet{'}'}) {
6990 0         0 $delimiter = '{';
6991 0         0 $end_delimiter = '}';
6992             }
6993             elsif (not $octet{']'}) {
6994 0         0 $delimiter = '[';
6995 0         0 $end_delimiter = ']';
6996             }
6997             elsif (not $octet{'>'}) {
6998 0         0 $delimiter = '<';
6999 0         0 $end_delimiter = '>';
7000             }
7001             else {
7002 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7003 0 0       0 if (not $octet{$char}) {
7004 0         0 $delimiter = $char;
7005 0         0 $end_delimiter = $char;
7006 0         0 last;
7007             }
7008             }
7009             }
7010             }
7011              
7012 25 100 100     190 if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7013 4         31 return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
7014             }
7015             else {
7016 21         125 return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
7017             }
7018             }
7019              
7020 1343 100       2364 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7021 1343         4106 my $metachar = qr/[\@\\|[\]{^]/oxms;
7022              
7023             # split regexp
7024 1343         117900 my @char = $string =~ /\G((?>
7025             [^\x80-\xFF\\\$\@\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
7026             \\x (?>[0-9A-Fa-f]{1,2}) |
7027             \\ (?>[0-7]{2,3}) |
7028             \\c [\x40-\x5F] |
7029             \\x\{ (?>[0-9A-Fa-f]+) \} |
7030             \\o\{ (?>[0-7]+) \} |
7031             \\[bBNpP]\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
7032             \\ $q_char |
7033             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7034             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7035             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7036             [\$\@] $qq_variable |
7037             \$ (?>\s* [0-9]+) |
7038             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7039             \$ \$ (?![\w\{]) |
7040             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7041             \[\^ |
7042             \[\: (?>[a-z]+) :\] |
7043             \[\:\^ (?>[a-z]+) :\] |
7044             \(\? |
7045             $q_char
7046             ))/oxmsg;
7047              
7048             # choice again delimiter
7049 1343 50       5615 if ($delimiter =~ / [\@:] /oxms) {
7050 0         0 my %octet = map {$_ => 1} @char;
  0         0  
7051 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
7052 0         0 $delimiter = '(';
7053 0         0 $end_delimiter = ')';
7054             }
7055             elsif (not $octet{'}'}) {
7056 0         0 $delimiter = '{';
7057 0         0 $end_delimiter = '}';
7058             }
7059             elsif (not $octet{']'}) {
7060 0         0 $delimiter = '[';
7061 0         0 $end_delimiter = ']';
7062             }
7063             elsif (not $octet{'>'}) {
7064 0         0 $delimiter = '<';
7065 0         0 $end_delimiter = '>';
7066             }
7067             else {
7068 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7069 0 0       0 if (not $octet{$char}) {
7070 0         0 $delimiter = $char;
7071 0         0 $end_delimiter = $char;
7072 0         0 last;
7073             }
7074             }
7075             }
7076             }
7077              
7078 1343         1352 my $left_e = 0;
7079 1343         1281 my $right_e = 0;
7080 1343         2994 for (my $i=0; $i <= $#char; $i++) {
7081              
7082             # "\L\u" --> "\u\L"
7083 3226 50 66     17895 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 66        
    100          
    100          
    100          
    100          
7084 0         0 @char[$i,$i+1] = @char[$i+1,$i];
7085             }
7086              
7087             # "\U\l" --> "\l\U"
7088             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7089 0         0 @char[$i,$i+1] = @char[$i+1,$i];
7090             }
7091              
7092             # octal escape sequence
7093             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7094 1         3 $char[$i] = Eoldutf8::octchr($1);
7095             }
7096              
7097             # hexadecimal escape sequence
7098             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7099 1         2 $char[$i] = Eoldutf8::hexchr($1);
7100             }
7101              
7102             # \b{...} --> b\{...}
7103             # \B{...} --> B\{...}
7104             # \N{CHARNAME} --> N\{CHARNAME}
7105             # \p{PROPERTY} --> p\{PROPERTY}
7106             # \P{PROPERTY} --> P\{PROPERTY}
7107             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
7108 6         23 $char[$i] = $1 . '\\' . $2;
7109             }
7110              
7111             # \p, \P, \X --> p, P, X
7112             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7113 4         15 $char[$i] = $1;
7114             }
7115              
7116 3226 100 100     8954 if (0) {
    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          
7117             }
7118              
7119             # join separated multiple-octet
7120 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7121 6 50 33     83 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)) {
    50 33        
    50 33        
      33        
      66        
      33        
7122 0         0 $char[$i] .= join '', splice @char, $i+1, 3;
7123             }
7124             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)) {
7125 0         0 $char[$i] .= join '', splice @char, $i+1, 2;
7126             }
7127             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)) {
7128 0         0 $char[$i] .= join '', splice @char, $i+1, 1;
7129             }
7130             }
7131              
7132             # open character class [...]
7133             elsif ($char[$i] eq '[') {
7134 598         562 my $left = $i;
7135              
7136             # [] make die "Unmatched [] in regexp ...\n"
7137             # (and so on)
7138              
7139 598 100       1272 if ($char[$i+1] eq ']') {
7140 3         4 $i++;
7141             }
7142              
7143 598         501 while (1) {
7144 2607 50       3067 if (++$i > $#char) {
7145 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7146             }
7147 2607 100       3411 if ($char[$i] eq ']') {
7148 598         517 my $right = $i;
7149              
7150             # [...]
7151 598 100       2792 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7152 90         146 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);
  270         309  
7153             }
7154             else {
7155 508         1582 splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
7156             }
7157              
7158 598         719 $i = $left;
7159 598         1475 last;
7160             }
7161             }
7162             }
7163              
7164             # open character class [^...]
7165             elsif ($char[$i] eq '[^') {
7166 328         311 my $left = $i;
7167              
7168             # [^] make die "Unmatched [] in regexp ...\n"
7169             # (and so on)
7170              
7171 328 100       669 if ($char[$i+1] eq ']') {
7172 5         5 $i++;
7173             }
7174              
7175 328         248 while (1) {
7176 1447 50       1666 if (++$i > $#char) {
7177 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7178             }
7179 1447 100       1864 if ($char[$i] eq ']') {
7180 328         258 my $right = $i;
7181              
7182             # [^...]
7183 328 100       1357 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7184 90         161 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);
  270         303  
7185             }
7186             else {
7187 238         723 splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7188             }
7189              
7190 328         386 $i = $left;
7191 328         762 last;
7192             }
7193             }
7194             }
7195              
7196             # rewrite character class or escape character
7197             elsif (my $char = character_class($char[$i],$modifier)) {
7198 215         676 $char[$i] = $char;
7199             }
7200              
7201             # /i modifier
7202             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
7203 44 50       63 if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
7204 44         65 $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
7205             }
7206             else {
7207 0         0 $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
7208             }
7209             }
7210              
7211             # \u \l \U \L \F \Q \E
7212             elsif ($char[$i] =~ /\A [<>] \z/oxms) {
7213 1 50       6 if ($right_e < $left_e) {
7214 0         0 $char[$i] = '\\' . $char[$i];
7215             }
7216             }
7217             elsif ($char[$i] eq '\u') {
7218 0         0 $char[$i] = '@{[Eoldutf8::ucfirst qq<';
7219 0         0 $left_e++;
7220             }
7221             elsif ($char[$i] eq '\l') {
7222 0         0 $char[$i] = '@{[Eoldutf8::lcfirst qq<';
7223 0         0 $left_e++;
7224             }
7225             elsif ($char[$i] eq '\U') {
7226 1         2 $char[$i] = '@{[Eoldutf8::uc qq<';
7227 1         4 $left_e++;
7228             }
7229             elsif ($char[$i] eq '\L') {
7230 1         3 $char[$i] = '@{[Eoldutf8::lc qq<';
7231 1         4 $left_e++;
7232             }
7233             elsif ($char[$i] eq '\F') {
7234 16         17 $char[$i] = '@{[Eoldutf8::fc qq<';
7235 16         57 $left_e++;
7236             }
7237             elsif ($char[$i] eq '\Q') {
7238 20         22 $char[$i] = '@{[CORE::quotemeta qq<';
7239 20         68 $left_e++;
7240             }
7241             elsif ($char[$i] eq '\E') {
7242 38 50       57 if ($right_e < $left_e) {
7243 38         49 $char[$i] = '>]}';
7244 38         118 $right_e++;
7245             }
7246             else {
7247 0         0 $char[$i] = '';
7248             }
7249             }
7250             elsif ($char[$i] eq '\Q') {
7251 0         0 while (1) {
7252 0 0       0 if (++$i > $#char) {
7253 0         0 last;
7254             }
7255 0 0       0 if ($char[$i] eq '\E') {
7256 0         0 last;
7257             }
7258             }
7259             }
7260             elsif ($char[$i] eq '\E') {
7261             }
7262              
7263             # $0 --> $0
7264             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7265 0 0       0 if ($ignorecase) {
7266 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7267             }
7268             }
7269             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7270 0 0       0 if ($ignorecase) {
7271 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7272             }
7273             }
7274              
7275             # $$ --> $$
7276             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7277             }
7278              
7279             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7280             # $1, $2, $3 --> $1, $2, $3 otherwise
7281             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7282 0         0 $char[$i] = e_capture($1);
7283 0 0       0 if ($ignorecase) {
7284 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7285             }
7286             }
7287             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7288 0         0 $char[$i] = e_capture($1);
7289 0 0       0 if ($ignorecase) {
7290 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7291             }
7292             }
7293              
7294             # $$foo[ ... ] --> $ $foo->[ ... ]
7295             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
7296 0         0 $char[$i] = e_capture($1.'->'.$2);
7297 0 0       0 if ($ignorecase) {
7298 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7299             }
7300             }
7301              
7302             # $$foo{ ... } --> $ $foo->{ ... }
7303             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
7304 0         0 $char[$i] = e_capture($1.'->'.$2);
7305 0 0       0 if ($ignorecase) {
7306 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7307             }
7308             }
7309              
7310             # $$foo
7311             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7312 0         0 $char[$i] = e_capture($1);
7313 0 0       0 if ($ignorecase) {
7314 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7315             }
7316             }
7317              
7318             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
7319             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7320 8 50       16 if ($ignorecase) {
7321 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::PREMATCH())]}';
7322             }
7323             else {
7324 8         31 $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
7325             }
7326             }
7327              
7328             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
7329             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7330 8 50       17 if ($ignorecase) {
7331 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::MATCH())]}';
7332             }
7333             else {
7334 8         29 $char[$i] = '@{[Eoldutf8::MATCH()]}';
7335             }
7336             }
7337              
7338             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
7339             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7340 6 50       14 if ($ignorecase) {
7341 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::POSTMATCH())]}';
7342             }
7343             else {
7344 6         32 $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
7345             }
7346             }
7347              
7348             # ${ foo }
7349             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
7350 0 0       0 if ($ignorecase) {
7351 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7352             }
7353             }
7354              
7355             # ${ ... }
7356             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7357 0         0 $char[$i] = e_capture($1);
7358 0 0       0 if ($ignorecase) {
7359 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7360             }
7361             }
7362              
7363             # $scalar or @array
7364             elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7365 42         102 $char[$i] = e_string($char[$i]);
7366 42 100       193 if ($ignorecase) {
7367 9         38 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7368             }
7369             }
7370              
7371             # quote character before ? + * {
7372             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7373 188 100 66     1365 if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
    50          
7374             }
7375             elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7376 0         0 my $char = $char[$i-1];
7377 0 0       0 if ($char[$i] eq '{') {
7378 0         0 die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
7379             }
7380             else {
7381 0         0 die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
7382             }
7383             }
7384             else {
7385 187         1001 $char[$i-1] = '(?:' . $char[$i-1] . ')';
7386             }
7387             }
7388             }
7389              
7390             # make regexp string
7391 1343         1609 $modifier =~ tr/i//d;
7392 1343 50       2324 if ($left_e > $right_e) {
7393 0 0 0     0 if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7394 0         0 return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
7395             }
7396             else {
7397 0         0 return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
7398             }
7399             }
7400 1343 100 100     6603 if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
7401 32         216 return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
7402             }
7403             else {
7404 1311         9276 return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7405             }
7406             }
7407              
7408             #
7409             # double quote stuff
7410             #
7411             sub qq_stuff {
7412 540     540 0 490 my($delimiter,$end_delimiter,$stuff) = @_;
7413              
7414             # scalar variable or array variable
7415 540 100       931 if ($stuff =~ /\A [\$\@] /oxms) {
7416 300         845 return $stuff;
7417             }
7418              
7419             # quote by delimiter
7420 240         429 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
  320         664  
7421 240         450 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7422 240 50       348 next if $char eq $delimiter;
7423 240 50       291 next if $char eq $end_delimiter;
7424 240 50       375 if (not $octet{$char}) {
7425 240         812 return join '', 'qq', $char, $stuff, $char;
7426             }
7427             }
7428 0         0 return join '', 'qq', '<', $stuff, '>';
7429             }
7430              
7431             #
7432             # escape regexp (m'', qr'', and m''b, qr''b)
7433             #
7434             sub e_qr_q {
7435 15     15 0 39 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7436 15   100     59 $modifier ||= '';
7437              
7438 15         17 $modifier =~ tr/p//d;
7439 15 50       34 if ($modifier =~ /([adlu])/oxms) {
7440 0         0 my $line = 0;
7441 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7442 0 0       0 if ($filename ne __FILE__) {
7443 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7444 0         0 last;
7445             }
7446             }
7447 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
7448             }
7449              
7450 15         22 $slash = 'div';
7451              
7452             # literal null string pattern
7453 15 100       36 if ($string eq '') {
    100          
7454 8         9 $modifier =~ tr/bB//d;
7455 8         8 $modifier =~ tr/i//d;
7456 8         32 return join '', $ope, $delimiter, $end_delimiter, $modifier;
7457             }
7458              
7459             # with /b /B modifier
7460             elsif ($modifier =~ tr/bB//d) {
7461 3         7 return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
7462             }
7463              
7464             # without /b /B modifier
7465             else {
7466 4         12 return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
7467             }
7468             }
7469              
7470             #
7471             # escape regexp (m'', qr'')
7472             #
7473             sub e_qr_qt {
7474 4     4 0 10 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7475              
7476 4 50       12 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7477              
7478             # split regexp
7479 4         259 my @char = $string =~ /\G((?>
7480             [^\x80-\xFF\\\[\$\@\/] |
7481             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
7482             \[\^ |
7483             \[\: (?>[a-z]+) \:\] |
7484             \[\:\^ (?>[a-z]+) \:\] |
7485             [\$\@\/] |
7486             \\ (?:$q_char) |
7487             (?:$q_char)
7488             ))/oxmsg;
7489              
7490             # unescape character
7491 4         23 for (my $i=0; $i <= $#char; $i++) {
7492 5 50 33     37 if (0) {
    50 33        
    50 66        
    50          
    50          
    50          
7493             }
7494              
7495             # open character class [...]
7496 0         0 elsif ($char[$i] eq '[') {
7497 0         0 my $left = $i;
7498 0 0       0 if ($char[$i+1] eq ']') {
7499 0         0 $i++;
7500             }
7501 0         0 while (1) {
7502 0 0       0 if (++$i > $#char) {
7503 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7504             }
7505 0 0       0 if ($char[$i] eq ']') {
7506 0         0 my $right = $i;
7507              
7508             # [...]
7509 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
7510              
7511 0         0 $i = $left;
7512 0         0 last;
7513             }
7514             }
7515             }
7516              
7517             # open character class [^...]
7518             elsif ($char[$i] eq '[^') {
7519 0         0 my $left = $i;
7520 0 0       0 if ($char[$i+1] eq ']') {
7521 0         0 $i++;
7522             }
7523 0         0 while (1) {
7524 0 0       0 if (++$i > $#char) {
7525 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7526             }
7527 0 0       0 if ($char[$i] eq ']') {
7528 0         0 my $right = $i;
7529              
7530             # [^...]
7531 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7532              
7533 0         0 $i = $left;
7534 0         0 last;
7535             }
7536             }
7537             }
7538              
7539             # escape $ @ / and \
7540             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7541 0         0 $char[$i] = '\\' . $char[$i];
7542             }
7543              
7544             # rewrite character class or escape character
7545             elsif (my $char = character_class($char[$i],$modifier)) {
7546 0         0 $char[$i] = $char;
7547             }
7548              
7549             # /i modifier
7550             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
7551 0 0       0 if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
7552 0         0 $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
7553             }
7554             else {
7555 0         0 $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
7556             }
7557             }
7558              
7559             # quote character before ? + * {
7560             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7561 0 0       0 if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7562             }
7563             else {
7564 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
7565             }
7566             }
7567             }
7568              
7569 4         6 $delimiter = '/';
7570 4         5 $end_delimiter = '/';
7571              
7572 4         7 $modifier =~ tr/i//d;
7573 4         36 return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7574             }
7575              
7576             #
7577             # escape regexp (m''b, qr''b)
7578             #
7579             sub e_qr_qb {
7580 3     3 0 5 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7581              
7582             # split regexp
7583 3         13 my @char = $string =~ /\G ((?>[^\\]|\\\\|[\x00-\xFF])) /oxmsg;
7584              
7585             # unescape character
7586 3         9 for (my $i=0; $i <= $#char; $i++) {
7587 9 50       27 if (0) {
    50          
7588             }
7589              
7590             # remain \\
7591 0         0 elsif ($char[$i] eq '\\\\') {
7592             }
7593              
7594             # escape $ @ / and \
7595             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7596 0         0 $char[$i] = '\\' . $char[$i];
7597             }
7598             }
7599              
7600 3         4 $delimiter = '/';
7601 3         3 $end_delimiter = '/';
7602 3         16 return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7603             }
7604              
7605             #
7606             # escape regexp (s/here//)
7607             #
7608             sub e_s1 {
7609 110     110 0 206 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7610 110   100     388 $modifier ||= '';
7611              
7612 110         131 $modifier =~ tr/p//d;
7613 110 50       276 if ($modifier =~ /([adlu])/oxms) {
7614 0         0 my $line = 0;
7615 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7616 0 0       0 if ($filename ne __FILE__) {
7617 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7618 0         0 last;
7619             }
7620             }
7621 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
7622             }
7623              
7624 110         162 $slash = 'div';
7625              
7626             # literal null string pattern
7627 110 100       386 if ($string eq '') {
    100          
7628 8         7 $modifier =~ tr/bB//d;
7629 8         6 $modifier =~ tr/i//d;
7630 8         43 return join '', $ope, $delimiter, $end_delimiter, $modifier;
7631             }
7632              
7633             # /b /B modifier
7634             elsif ($modifier =~ tr/bB//d) {
7635              
7636             # choice again delimiter
7637 1 50       9 if ($delimiter =~ / [\@:] /oxms) {
7638 0         0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
7639 0         0 my %octet = map {$_ => 1} @char;
  0         0  
7640 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
7641 0         0 $delimiter = '(';
7642 0         0 $end_delimiter = ')';
7643             }
7644             elsif (not $octet{'}'}) {
7645 0         0 $delimiter = '{';
7646 0         0 $end_delimiter = '}';
7647             }
7648             elsif (not $octet{']'}) {
7649 0         0 $delimiter = '[';
7650 0         0 $end_delimiter = ']';
7651             }
7652             elsif (not $octet{'>'}) {
7653 0         0 $delimiter = '<';
7654 0         0 $end_delimiter = '>';
7655             }
7656             else {
7657 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7658 0 0       0 if (not $octet{$char}) {
7659 0         0 $delimiter = $char;
7660 0         0 $end_delimiter = $char;
7661 0         0 last;
7662             }
7663             }
7664             }
7665             }
7666              
7667 1         2 my $prematch = '';
7668 1         17 return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
7669             }
7670              
7671 101 100       237 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7672 101         402 my $metachar = qr/[\@\\|[\]{^]/oxms;
7673              
7674             # split regexp
7675 101         38454 my @char = $string =~ /\G((?>
7676             [^\x80-\xFF\\\$\@\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
7677             \\ (?>[1-9][0-9]*) |
7678             \\g (?>\s*) (?>[1-9][0-9]*) |
7679             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
7680             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
7681             \\x (?>[0-9A-Fa-f]{1,2}) |
7682             \\ (?>[0-7]{2,3}) |
7683             \\c [\x40-\x5F] |
7684             \\x\{ (?>[0-9A-Fa-f]+) \} |
7685             \\o\{ (?>[0-7]+) \} |
7686             \\[bBNpP]\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
7687             \\ $q_char |
7688             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7689             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7690             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7691             [\$\@] $qq_variable |
7692             \$ (?>\s* [0-9]+) |
7693             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7694             \$ \$ (?![\w\{]) |
7695             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7696             \[\^ |
7697             \[\: (?>[a-z]+) :\] |
7698             \[\:\^ (?>[a-z]+) :\] |
7699             \(\? |
7700             $q_char
7701             ))/oxmsg;
7702              
7703             # choice again delimiter
7704 101 50       1165 if ($delimiter =~ / [\@:] /oxms) {
7705 0         0 my %octet = map {$_ => 1} @char;
  0         0  
7706 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
7707 0         0 $delimiter = '(';
7708 0         0 $end_delimiter = ')';
7709             }
7710             elsif (not $octet{'}'}) {
7711 0         0 $delimiter = '{';
7712 0         0 $end_delimiter = '}';
7713             }
7714             elsif (not $octet{']'}) {
7715 0         0 $delimiter = '[';
7716 0         0 $end_delimiter = ']';
7717             }
7718             elsif (not $octet{'>'}) {
7719 0         0 $delimiter = '<';
7720 0         0 $end_delimiter = '>';
7721             }
7722             else {
7723 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
7724 0 0       0 if (not $octet{$char}) {
7725 0         0 $delimiter = $char;
7726 0         0 $end_delimiter = $char;
7727 0         0 last;
7728             }
7729             }
7730             }
7731             }
7732              
7733             # count '('
7734 101         169 my $parens = grep { $_ eq '(' } @char;
  425         585  
7735              
7736 101         144 my $left_e = 0;
7737 101         135 my $right_e = 0;
7738 101         362 for (my $i=0; $i <= $#char; $i++) {
7739              
7740             # "\L\u" --> "\u\L"
7741 346 50 33     2269 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
    50          
7742 0         0 @char[$i,$i+1] = @char[$i+1,$i];
7743             }
7744              
7745             # "\U\l" --> "\l\U"
7746             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7747 0         0 @char[$i,$i+1] = @char[$i+1,$i];
7748             }
7749              
7750             # octal escape sequence
7751             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7752 1         3 $char[$i] = Eoldutf8::octchr($1);
7753             }
7754              
7755             # hexadecimal escape sequence
7756             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7757 1         2 $char[$i] = Eoldutf8::hexchr($1);
7758             }
7759              
7760             # \b{...} --> b\{...}
7761             # \B{...} --> B\{...}
7762             # \N{CHARNAME} --> N\{CHARNAME}
7763             # \p{PROPERTY} --> p\{PROPERTY}
7764             # \P{PROPERTY} --> P\{PROPERTY}
7765             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
7766 0         0 $char[$i] = $1 . '\\' . $2;
7767             }
7768              
7769             # \p, \P, \X --> p, P, X
7770             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7771 0         0 $char[$i] = $1;
7772             }
7773              
7774 346 50 66     1268 if (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          
7775             }
7776              
7777             # join separated multiple-octet
7778 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7779 0 0 0     0 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)) {
    0 0        
    0 0        
      0        
      0        
      0        
7780 0         0 $char[$i] .= join '', splice @char, $i+1, 3;
7781             }
7782             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)) {
7783 0         0 $char[$i] .= join '', splice @char, $i+1, 2;
7784             }
7785             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)) {
7786 0         0 $char[$i] .= join '', splice @char, $i+1, 1;
7787             }
7788             }
7789              
7790             # open character class [...]
7791             elsif ($char[$i] eq '[') {
7792 20         26 my $left = $i;
7793 20 50       83 if ($char[$i+1] eq ']') {
7794 0         0 $i++;
7795             }
7796 20         22 while (1) {
7797 79 50       113 if (++$i > $#char) {
7798 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7799             }
7800 79 100       132 if ($char[$i] eq ']') {
7801 20         40 my $right = $i;
7802              
7803             # [...]
7804 20 50       134 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7805 0         0 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);
  0         0  
7806             }
7807             else {
7808 20         129 splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
7809             }
7810              
7811 20         41 $i = $left;
7812 20         82 last;
7813             }
7814             }
7815             }
7816              
7817             # open character class [^...]
7818             elsif ($char[$i] eq '[^') {
7819 0         0 my $left = $i;
7820 0 0       0 if ($char[$i+1] eq ']') {
7821 0         0 $i++;
7822             }
7823 0         0 while (1) {
7824 0 0       0 if (++$i > $#char) {
7825 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7826             }
7827 0 0       0 if ($char[$i] eq ']') {
7828 0         0 my $right = $i;
7829              
7830             # [^...]
7831 0 0       0 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7832 0         0 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);
  0         0  
7833             }
7834             else {
7835 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7836             }
7837              
7838 0         0 $i = $left;
7839 0         0 last;
7840             }
7841             }
7842             }
7843              
7844             # rewrite character class or escape character
7845             elsif (my $char = character_class($char[$i],$modifier)) {
7846 11         32 $char[$i] = $char;
7847             }
7848              
7849             # /i modifier
7850             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
7851 3 50       4 if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
7852 3         5 $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
7853             }
7854             else {
7855 0         0 $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
7856             }
7857             }
7858              
7859             # \u \l \U \L \F \Q \E
7860             elsif ($char[$i] =~ /\A [<>] \z/oxms) {
7861 8 50       31 if ($right_e < $left_e) {
7862 0         0 $char[$i] = '\\' . $char[$i];
7863             }
7864             }
7865             elsif ($char[$i] eq '\u') {
7866 0         0 $char[$i] = '@{[Eoldutf8::ucfirst qq<';
7867 0         0 $left_e++;
7868             }
7869             elsif ($char[$i] eq '\l') {
7870 0         0 $char[$i] = '@{[Eoldutf8::lcfirst qq<';
7871 0         0 $left_e++;
7872             }
7873             elsif ($char[$i] eq '\U') {
7874 0         0 $char[$i] = '@{[Eoldutf8::uc qq<';
7875 0         0 $left_e++;
7876             }
7877             elsif ($char[$i] eq '\L') {
7878 0         0 $char[$i] = '@{[Eoldutf8::lc qq<';
7879 0         0 $left_e++;
7880             }
7881             elsif ($char[$i] eq '\F') {
7882 0         0 $char[$i] = '@{[Eoldutf8::fc qq<';
7883 0         0 $left_e++;
7884             }
7885             elsif ($char[$i] eq '\Q') {
7886 5         4 $char[$i] = '@{[CORE::quotemeta qq<';
7887 5         16 $left_e++;
7888             }
7889             elsif ($char[$i] eq '\E') {
7890 5 50       7 if ($right_e < $left_e) {
7891 5         4 $char[$i] = '>]}';
7892 5         15 $right_e++;
7893             }
7894             else {
7895 0         0 $char[$i] = '';
7896             }
7897             }
7898             elsif ($char[$i] eq '\Q') {
7899 0         0 while (1) {
7900 0 0       0 if (++$i > $#char) {
7901 0         0 last;
7902             }
7903 0 0       0 if ($char[$i] eq '\E') {
7904 0         0 last;
7905             }
7906             }
7907             }
7908             elsif ($char[$i] eq '\E') {
7909             }
7910              
7911             # \0 --> \0
7912             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
7913             }
7914              
7915             # \g{N}, \g{-N}
7916              
7917             # P.108 Using Simple Patterns
7918             # in Chapter 7: In the World of Regular Expressions
7919             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
7920              
7921             # P.221 Capturing
7922             # in Chapter 5: Pattern Matching
7923             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7924              
7925             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
7926             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7927             }
7928              
7929             # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
7930             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7931             }
7932              
7933             # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
7934             elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
7935             }
7936              
7937             # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
7938             elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
7939             }
7940              
7941             # $0 --> $0
7942             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7943 0 0       0 if ($ignorecase) {
7944 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7945             }
7946             }
7947             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7948 0 0       0 if ($ignorecase) {
7949 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7950             }
7951             }
7952              
7953             # $$ --> $$
7954             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7955             }
7956              
7957             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7958             # $1, $2, $3 --> $1, $2, $3 otherwise
7959             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7960 0         0 $char[$i] = e_capture($1);
7961 0 0       0 if ($ignorecase) {
7962 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7963             }
7964             }
7965             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7966 0         0 $char[$i] = e_capture($1);
7967 0 0       0 if ($ignorecase) {
7968 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7969             }
7970             }
7971              
7972             # $$foo[ ... ] --> $ $foo->[ ... ]
7973             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
7974 0         0 $char[$i] = e_capture($1.'->'.$2);
7975 0 0       0 if ($ignorecase) {
7976 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7977             }
7978             }
7979              
7980             # $$foo{ ... } --> $ $foo->{ ... }
7981             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
7982 0         0 $char[$i] = e_capture($1.'->'.$2);
7983 0 0       0 if ($ignorecase) {
7984 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7985             }
7986             }
7987              
7988             # $$foo
7989             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7990 0         0 $char[$i] = e_capture($1);
7991 0 0       0 if ($ignorecase) {
7992 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
7993             }
7994             }
7995              
7996             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
7997             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7998 4 50       12 if ($ignorecase) {
7999 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::PREMATCH())]}';
8000             }
8001             else {
8002 4         21 $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
8003             }
8004             }
8005              
8006             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
8007             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
8008 4 50       25 if ($ignorecase) {
8009 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::MATCH())]}';
8010             }
8011             else {
8012 4         47 $char[$i] = '@{[Eoldutf8::MATCH()]}';
8013             }
8014             }
8015              
8016             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
8017             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
8018 3 50       9 if ($ignorecase) {
8019 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::POSTMATCH())]}';
8020             }
8021             else {
8022 3         18 $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
8023             }
8024             }
8025              
8026             # ${ foo }
8027             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
8028 0 0       0 if ($ignorecase) {
8029 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8030             }
8031             }
8032              
8033             # ${ ... }
8034             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
8035 0         0 $char[$i] = e_capture($1);
8036 0 0       0 if ($ignorecase) {
8037 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8038             }
8039             }
8040              
8041             # $scalar or @array
8042             elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
8043 9         20 $char[$i] = e_string($char[$i]);
8044 9 50       66 if ($ignorecase) {
8045 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8046             }
8047             }
8048              
8049             # quote character before ? + * {
8050             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8051 23 50       96 if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
8052             }
8053             else {
8054 23         161 $char[$i-1] = '(?:' . $char[$i-1] . ')';
8055             }
8056             }
8057             }
8058              
8059             # make regexp string
8060 101         169 my $prematch = '';
8061 101         149 $modifier =~ tr/i//d;
8062 101 50       367 if ($left_e > $right_e) {
8063 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
8064             }
8065 101         1176 return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
8066             }
8067              
8068             #
8069             # escape regexp (s'here'' or s'here''b)
8070             #
8071             sub e_s1_q {
8072 22     22 0 42 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8073 22   100     65 $modifier ||= '';
8074              
8075 22         24 $modifier =~ tr/p//d;
8076 22 50       46 if ($modifier =~ /([adlu])/oxms) {
8077 0         0 my $line = 0;
8078 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8079 0 0       0 if ($filename ne __FILE__) {
8080 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8081 0         0 last;
8082             }
8083             }
8084 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
8085             }
8086              
8087 22         26 $slash = 'div';
8088              
8089             # literal null string pattern
8090 22 100       60 if ($string eq '') {
    100          
8091 8         4 $modifier =~ tr/bB//d;
8092 8         7 $modifier =~ tr/i//d;
8093 8         46 return join '', $ope, $delimiter, $end_delimiter, $modifier;
8094             }
8095              
8096             # with /b /B modifier
8097             elsif ($modifier =~ tr/bB//d) {
8098 1         5 return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
8099             }
8100              
8101             # without /b /B modifier
8102             else {
8103 13         26 return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
8104             }
8105             }
8106              
8107             #
8108             # escape regexp (s'here'')
8109             #
8110             sub e_s1_qt {
8111 13     13 0 21 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8112              
8113 13 50       26 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
8114              
8115             # split regexp
8116 13         390 my @char = $string =~ /\G((?>
8117             [^\x80-\xFF\\\[\$\@\/] |
8118             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
8119             \[\^ |
8120             \[\: (?>[a-z]+) \:\] |
8121             \[\:\^ (?>[a-z]+) \:\] |
8122             [\$\@\/] |
8123             \\ (?:$q_char) |
8124             (?:$q_char)
8125             ))/oxmsg;
8126              
8127             # unescape character
8128 13         49 for (my $i=0; $i <= $#char; $i++) {
8129 25 50 33     148 if (0) {
    50 33        
    50 66        
    100          
    50          
    50          
8130             }
8131              
8132             # open character class [...]
8133 0         0 elsif ($char[$i] eq '[') {
8134 0         0 my $left = $i;
8135 0 0       0 if ($char[$i+1] eq ']') {
8136 0         0 $i++;
8137             }
8138 0         0 while (1) {
8139 0 0       0 if (++$i > $#char) {
8140 0         0 die __FILE__, ": Unmatched [] in regexp\n";
8141             }
8142 0 0       0 if ($char[$i] eq ']') {
8143 0         0 my $right = $i;
8144              
8145             # [...]
8146 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
8147              
8148 0         0 $i = $left;
8149 0         0 last;
8150             }
8151             }
8152             }
8153              
8154             # open character class [^...]
8155             elsif ($char[$i] eq '[^') {
8156 0         0 my $left = $i;
8157 0 0       0 if ($char[$i+1] eq ']') {
8158 0         0 $i++;
8159             }
8160 0         0 while (1) {
8161 0 0       0 if (++$i > $#char) {
8162 0         0 die __FILE__, ": Unmatched [] in regexp\n";
8163             }
8164 0 0       0 if ($char[$i] eq ']') {
8165 0         0 my $right = $i;
8166              
8167             # [^...]
8168 0         0 splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
8169              
8170 0         0 $i = $left;
8171 0         0 last;
8172             }
8173             }
8174             }
8175              
8176             # escape $ @ / and \
8177             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
8178 0         0 $char[$i] = '\\' . $char[$i];
8179             }
8180              
8181             # rewrite character class or escape character
8182             elsif (my $char = character_class($char[$i],$modifier)) {
8183 6         20 $char[$i] = $char;
8184             }
8185              
8186             # /i modifier
8187             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
8188 0 0       0 if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
8189 0         0 $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
8190             }
8191             else {
8192 0         0 $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
8193             }
8194             }
8195              
8196             # quote character before ? + * {
8197             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8198 0 0       0 if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
8199             }
8200             else {
8201 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
8202             }
8203             }
8204             }
8205              
8206 13         15 $modifier =~ tr/i//d;
8207 13         14 $delimiter = '/';
8208 13         15 $end_delimiter = '/';
8209 13         14 my $prematch = '';
8210 13         99 return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
8211             }
8212              
8213             #
8214             # escape regexp (s'here''b)
8215             #
8216             sub e_s1_qb {
8217 1     1 0 3 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8218              
8219             # split regexp
8220 1         7 my @char = $string =~ /\G (?>[^\\]|\\\\|[\x00-\xFF]) /oxmsg;
8221              
8222             # unescape character
8223 1         38 for (my $i=0; $i <= $#char; $i++) {
8224 3 50       20 if (0) {
    50          
8225             }
8226              
8227             # remain \\
8228 0         0 elsif ($char[$i] eq '\\\\') {
8229             }
8230              
8231             # escape $ @ / and \
8232             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
8233 0         0 $char[$i] = '\\' . $char[$i];
8234             }
8235             }
8236              
8237 1         3 $delimiter = '/';
8238 1         2 $end_delimiter = '/';
8239 1         2 my $prematch = '';
8240 1         16 return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
8241             }
8242              
8243             #
8244             # escape regexp (s''here')
8245             #
8246             sub e_s2_q {
8247 17     17 0 24 my($ope,$delimiter,$end_delimiter,$string) = @_;
8248              
8249 17         20 $slash = 'div';
8250              
8251 17         247 my @char = $string =~ / \G (?>[^\x80-\xFF\\]|\\\\|$q_char) /oxmsg;
8252 17         56 for (my $i=0; $i <= $#char; $i++) {
8253 9 100       32 if (0) {
    100          
8254             }
8255              
8256             # not escape \\
8257 0         0 elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
8258             }
8259              
8260             # escape $ @ / and \
8261             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
8262 5         12 $char[$i] = '\\' . $char[$i];
8263             }
8264             }
8265              
8266 17         50 return join '', $ope, $delimiter, @char, $end_delimiter;
8267             }
8268              
8269             #
8270             # escape regexp (s/here/and here/modifier)
8271             #
8272             sub e_sub {
8273 132     132 0 587 my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
8274 132   100     454 $modifier ||= '';
8275              
8276 132         205 $modifier =~ tr/p//d;
8277 132 50       387 if ($modifier =~ /([adlu])/oxms) {
8278 0         0 my $line = 0;
8279 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8280 0 0       0 if ($filename ne __FILE__) {
8281 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8282 0         0 last;
8283             }
8284             }
8285 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
8286             }
8287              
8288 132 100       327 if ($variable eq '') {
8289 37         38 $variable = '$_';
8290 37         38 $bind_operator = ' =~ ';
8291             }
8292              
8293 132         167 $slash = 'div';
8294              
8295             # P.128 Start of match (or end of previous match): \G
8296             # P.130 Advanced Use of \G with Perl
8297             # in Chapter 3: Overview of Regular Expression Features and Flavors
8298             # P.312 Iterative Matching: Scalar Context, with /g
8299             # in Chapter 7: Perl
8300             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
8301              
8302             # P.181 Where You Left Off: The \G Assertion
8303             # in Chapter 5: Pattern Matching
8304             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
8305              
8306             # P.220 Where You Left Off: The \G Assertion
8307             # in Chapter 5: Pattern Matching
8308             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
8309              
8310 132         165 my $e_modifier = $modifier =~ tr/e//d;
8311 132         168 my $r_modifier = $modifier =~ tr/r//d;
8312              
8313 132         149 my $my = '';
8314 132 50       301 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
8315 0         0 $my = $variable;
8316 0         0 $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
8317 0         0 $variable =~ s/ = .+ \z//oxms;
8318             }
8319              
8320 132         280 (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
8321 132         195 $variable_basename =~ s/ \s+ \z//oxms;
8322              
8323             # quote replacement string
8324 132         145 my $e_replacement = '';
8325 132 100       266 if ($e_modifier >= 1) {
8326 17         35 $e_replacement = e_qq('', '', '', $replacement);
8327 17         27 $e_modifier--;
8328             }
8329             else {
8330 115 100       222 if ($delimiter2 eq "'") {
8331 17         42 $e_replacement = e_s2_q('qq', '/', '/', $replacement);
8332             }
8333             else {
8334 98         208 $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
8335             }
8336             }
8337              
8338 132         175 my $sub = '';
8339              
8340             # with /r
8341 132 100       275 if ($r_modifier) {
8342 8 100       16 if (0) {
8343             }
8344              
8345             # s///gr without multibyte anchoring
8346 0         0 elsif ($modifier =~ /g/oxms) {
8347 4 50       13 $sub = sprintf(
8348             # 1 2 3 4 5
8349             q,
8350              
8351             $variable, # 1
8352             ($delimiter1 eq "'") ? # 2
8353             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8354             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8355             $s_matched, # 3
8356             $e_replacement, # 4
8357             '$OldUTF8::re_r=CORE::eval $OldUTF8::re_r; ' x $e_modifier, # 5
8358             );
8359             }
8360              
8361             # s///r
8362             else {
8363              
8364 4         6 my $prematch = q{$`};
8365              
8366 4 50       15 $sub = sprintf(
8367             # 1 2 3 4 5 6 7
8368             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $OldUTF8::re_r=%s; %s"%s$OldUTF8::re_r$'" } : %s>,
8369              
8370             $variable, # 1
8371             ($delimiter1 eq "'") ? # 2
8372             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8373             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8374             $s_matched, # 3
8375             $e_replacement, # 4
8376             '$OldUTF8::re_r=CORE::eval $OldUTF8::re_r; ' x $e_modifier, # 5
8377             $prematch, # 6
8378             $variable, # 7
8379             );
8380             }
8381              
8382             # $var !~ s///r doesn't make sense
8383 8 50       21 if ($bind_operator =~ / !~ /oxms) {
8384 0         0 $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
8385             }
8386             }
8387              
8388             # without /r
8389             else {
8390 124 100       258 if (0) {
8391             }
8392              
8393             # s///g without multibyte anchoring
8394 0         0 elsif ($modifier =~ /g/oxms) {
8395 29 100       127 $sub = sprintf(
    100          
8396             # 1 2 3 4 5 6 7 8
8397             q,
8398              
8399             $variable, # 1
8400             ($delimiter1 eq "'") ? # 2
8401             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8402             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8403             $s_matched, # 3
8404             $e_replacement, # 4
8405             '$OldUTF8::re_r=CORE::eval $OldUTF8::re_r; ' x $e_modifier, # 5
8406             $variable, # 6
8407             $variable, # 7
8408             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
8409             );
8410             }
8411              
8412             # s///
8413             else {
8414              
8415 95         121 my $prematch = q{$`};
8416              
8417 95 100       515 $sub = sprintf(
    100          
8418              
8419             ($bind_operator =~ / =~ /oxms) ?
8420              
8421             # 1 2 3 4 5 6 7 8
8422             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $OldUTF8::re_r=%s; %s%s="%s$OldUTF8::re_r$'"; 1 } : undef> :
8423              
8424             # 1 2 3 4 5 6 7 8
8425             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $OldUTF8::re_r=%s; %s%s="%s$OldUTF8::re_r$'"; undef }>,
8426              
8427             $variable, # 1
8428             $bind_operator, # 2
8429             ($delimiter1 eq "'") ? # 3
8430             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
8431             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
8432             $s_matched, # 4
8433             $e_replacement, # 5
8434             '$OldUTF8::re_r=CORE::eval $OldUTF8::re_r; ' x $e_modifier, # 6
8435             $variable, # 7
8436             $prematch, # 8
8437             );
8438             }
8439             }
8440              
8441             # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
8442 132 50       332 if ($my ne '') {
8443 0         0 $sub = "($my, $sub)[1]";
8444             }
8445              
8446             # clear s/// variable
8447 132         184 $sub_variable = '';
8448 132         145 $bind_operator = '';
8449              
8450 132         1391 return $sub;
8451             }
8452              
8453             #
8454             # escape regexp of split qr//
8455             #
8456             sub e_split {
8457 101     101 0 260 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8458 101   100     351 $modifier ||= '';
8459              
8460 101         130 $modifier =~ tr/p//d;
8461 101 50       235 if ($modifier =~ /([adlu])/oxms) {
8462 0         0 my $line = 0;
8463 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8464 0 0       0 if ($filename ne __FILE__) {
8465 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8466 0         0 last;
8467             }
8468             }
8469 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
8470             }
8471              
8472 101         126 $slash = 'div';
8473              
8474             # /b /B modifier
8475 101 50       204 if ($modifier =~ tr/bB//d) {
8476 0         0 return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
8477             }
8478              
8479 101 50       199 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
8480 101         339 my $metachar = qr/[\@\\|[\]{^]/oxms;
8481              
8482             # split regexp
8483 101         15910 my @char = $string =~ /\G((?>
8484             [^\x80-\xFF\\\$\@\[\(]|(?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
8485             \\x (?>[0-9A-Fa-f]{1,2}) |
8486             \\ (?>[0-7]{2,3}) |
8487             \\c [\x40-\x5F] |
8488             \\x\{ (?>[0-9A-Fa-f]+) \} |
8489             \\o\{ (?>[0-7]+) \} |
8490             \\[bBNpP]\{ (?>[^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} |
8491             \\ $q_char |
8492             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
8493             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
8494             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
8495             [\$\@] $qq_variable |
8496             \$ (?>\s* [0-9]+) |
8497             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
8498             \$ \$ (?![\w\{]) |
8499             \$ (?>\s*) \$ (?>\s*) $qq_variable |
8500             \[\^ |
8501             \[\: (?>[a-z]+) :\] |
8502             \[\:\^ (?>[a-z]+) :\] |
8503             \(\? |
8504             $q_char
8505             ))/oxmsg;
8506              
8507 101         525 my $left_e = 0;
8508 101         109 my $right_e = 0;
8509 101         300 for (my $i=0; $i <= $#char; $i++) {
8510              
8511             # "\L\u" --> "\u\L"
8512 284 50 33     1747 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
    50          
8513 0         0 @char[$i,$i+1] = @char[$i+1,$i];
8514             }
8515              
8516             # "\U\l" --> "\l\U"
8517             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
8518 0         0 @char[$i,$i+1] = @char[$i+1,$i];
8519             }
8520              
8521             # octal escape sequence
8522             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
8523 1         4 $char[$i] = Eoldutf8::octchr($1);
8524             }
8525              
8526             # hexadecimal escape sequence
8527             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
8528 1         58 $char[$i] = Eoldutf8::hexchr($1);
8529             }
8530              
8531             # \b{...} --> b\{...}
8532             # \B{...} --> B\{...}
8533             # \N{CHARNAME} --> N\{CHARNAME}
8534             # \p{PROPERTY} --> p\{PROPERTY}
8535             # \P{PROPERTY} --> P\{PROPERTY}
8536             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xFF0-9\}][^\x80-\xFF\}]*) \} ) \z/oxms) {
8537 0         0 $char[$i] = $1 . '\\' . $2;
8538             }
8539              
8540             # \p, \P, \X --> p, P, X
8541             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
8542 0         0 $char[$i] = $1;
8543             }
8544              
8545 284 50 100     975 if (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          
8546             }
8547              
8548             # join separated multiple-octet
8549 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
8550 0 0 0     0 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)) {
    0 0        
    0 0        
      0        
      0        
      0        
8551 0         0 $char[$i] .= join '', splice @char, $i+1, 3;
8552             }
8553             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)) {
8554 0         0 $char[$i] .= join '', splice @char, $i+1, 2;
8555             }
8556             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)) {
8557 0         0 $char[$i] .= join '', splice @char, $i+1, 1;
8558             }
8559             }
8560              
8561             # open character class [...]
8562             elsif ($char[$i] eq '[') {
8563 3         6 my $left = $i;
8564 3 50       9 if ($char[$i+1] eq ']') {
8565 0         0 $i++;
8566             }
8567 3         3 while (1) {
8568 7 50       10 if (++$i > $#char) {
8569 0         0 die __FILE__, ": Unmatched [] in regexp\n";
8570             }
8571 7 100       13 if ($char[$i] eq ']') {
8572 3         3 my $right = $i;
8573              
8574             # [...]
8575 3 50       19 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
8576 0         0 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);
  0         0  
8577             }
8578             else {
8579 3         15 splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
8580             }
8581              
8582 3         3 $i = $left;
8583 3         10 last;
8584             }
8585             }
8586             }
8587              
8588             # open character class [^...]
8589             elsif ($char[$i] eq '[^') {
8590 1         1 my $left = $i;
8591 1 50       3 if ($char[$i+1] eq ']') {
8592 0         0 $i++;
8593             }
8594 1         1 while (1) {
8595 2 50       4 if (++$i > $#char) {
8596 0         0 die __FILE__, ": Unmatched [] in regexp\n";
8597             }
8598 2 100       5 if ($char[$i] eq ']') {
8599 1         2 my $right = $i;
8600              
8601             # [^...]
8602 1 50       6 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
8603 0         0 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);
  0         0  
8604             }
8605             else {
8606 1         6 splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
8607             }
8608              
8609 1         2 $i = $left;
8610 1         3 last;
8611             }
8612             }
8613             }
8614              
8615             # rewrite character class or escape character
8616             elsif (my $char = character_class($char[$i],$modifier)) {
8617 5         23 $char[$i] = $char;
8618             }
8619              
8620             # P.794 29.2.161. split
8621             # in Chapter 29: Functions
8622             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
8623              
8624             # P.951 split
8625             # in Chapter 27: Functions
8626             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
8627              
8628             # said "The //m modifier is assumed when you split on the pattern /^/",
8629             # but perl5.008 is not so. Therefore, this software adds //m.
8630             # (and so on)
8631              
8632             # split(m/^/) --> split(m/^/m)
8633             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
8634 11         63 $modifier .= 'm';
8635             }
8636              
8637             # /i modifier
8638             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
8639 0 0       0 if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
8640 0         0 $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
8641             }
8642             else {
8643 0         0 $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
8644             }
8645             }
8646              
8647             # \u \l \U \L \F \Q \E
8648             elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
8649 2 50       9 if ($right_e < $left_e) {
8650 0         0 $char[$i] = '\\' . $char[$i];
8651             }
8652             }
8653             elsif ($char[$i] eq '\u') {
8654 0         0 $char[$i] = '@{[Eoldutf8::ucfirst qq<';
8655 0         0 $left_e++;
8656             }
8657             elsif ($char[$i] eq '\l') {
8658 0         0 $char[$i] = '@{[Eoldutf8::lcfirst qq<';
8659 0         0 $left_e++;
8660             }
8661             elsif ($char[$i] eq '\U') {
8662 0         0 $char[$i] = '@{[Eoldutf8::uc qq<';
8663 0         0 $left_e++;
8664             }
8665             elsif ($char[$i] eq '\L') {
8666 0         0 $char[$i] = '@{[Eoldutf8::lc qq<';
8667 0         0 $left_e++;
8668             }
8669             elsif ($char[$i] eq '\F') {
8670 0         0 $char[$i] = '@{[Eoldutf8::fc qq<';
8671 0         0 $left_e++;
8672             }
8673             elsif ($char[$i] eq '\Q') {
8674 0         0 $char[$i] = '@{[CORE::quotemeta qq<';
8675 0         0 $left_e++;
8676             }
8677             elsif ($char[$i] eq '\E') {
8678 0 0       0 if ($right_e < $left_e) {
8679 0         0 $char[$i] = '>]}';
8680 0         0 $right_e++;
8681             }
8682             else {
8683 0         0 $char[$i] = '';
8684             }
8685             }
8686             elsif ($char[$i] eq '\Q') {
8687 0         0 while (1) {
8688 0 0       0 if (++$i > $#char) {
8689 0         0 last;
8690             }
8691 0 0       0 if ($char[$i] eq '\E') {
8692 0         0 last;
8693             }
8694             }
8695             }
8696             elsif ($char[$i] eq '\E') {
8697             }
8698              
8699             # $0 --> $0
8700             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
8701 0 0       0 if ($ignorecase) {
8702 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8703             }
8704             }
8705             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
8706 0 0       0 if ($ignorecase) {
8707 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8708             }
8709             }
8710              
8711             # $$ --> $$
8712             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
8713             }
8714              
8715             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
8716             # $1, $2, $3 --> $1, $2, $3 otherwise
8717             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
8718 0         0 $char[$i] = e_capture($1);
8719 0 0       0 if ($ignorecase) {
8720 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8721             }
8722             }
8723             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
8724 0         0 $char[$i] = e_capture($1);
8725 0 0       0 if ($ignorecase) {
8726 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8727             }
8728             }
8729              
8730             # $$foo[ ... ] --> $ $foo->[ ... ]
8731             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
8732 0         0 $char[$i] = e_capture($1.'->'.$2);
8733 0 0       0 if ($ignorecase) {
8734 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8735             }
8736             }
8737              
8738             # $$foo{ ... } --> $ $foo->{ ... }
8739             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
8740 0         0 $char[$i] = e_capture($1.'->'.$2);
8741 0 0       0 if ($ignorecase) {
8742 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8743             }
8744             }
8745              
8746             # $$foo
8747             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
8748 0         0 $char[$i] = e_capture($1);
8749 0 0       0 if ($ignorecase) {
8750 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8751             }
8752             }
8753              
8754             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eoldutf8::PREMATCH()
8755             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
8756 12 50       17 if ($ignorecase) {
8757 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::PREMATCH())]}';
8758             }
8759             else {
8760 12         104 $char[$i] = '@{[Eoldutf8::PREMATCH()]}';
8761             }
8762             }
8763              
8764             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eoldutf8::MATCH()
8765             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
8766 12 50       25 if ($ignorecase) {
8767 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::MATCH())]}';
8768             }
8769             else {
8770 12         76 $char[$i] = '@{[Eoldutf8::MATCH()]}';
8771             }
8772             }
8773              
8774             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eoldutf8::POSTMATCH()
8775             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
8776 9 50       23 if ($ignorecase) {
8777 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(Eoldutf8::POSTMATCH())]}';
8778             }
8779             else {
8780 9         64 $char[$i] = '@{[Eoldutf8::POSTMATCH()]}';
8781             }
8782             }
8783              
8784             # ${ foo }
8785             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
8786 0 0       0 if ($ignorecase) {
8787 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $1 . ')]}';
8788             }
8789             }
8790              
8791             # ${ ... }
8792             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
8793 0         0 $char[$i] = e_capture($1);
8794 0 0       0 if ($ignorecase) {
8795 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8796             }
8797             }
8798              
8799             # $scalar or @array
8800             elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
8801 3         6 $char[$i] = e_string($char[$i]);
8802 3 50       21 if ($ignorecase) {
8803 0         0 $char[$i] = '@{[Eoldutf8::ignorecase(' . $char[$i] . ')]}';
8804             }
8805             }
8806              
8807             # quote character before ? + * {
8808             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8809 7 100       46 if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
8810             }
8811             else {
8812 4         27 $char[$i-1] = '(?:' . $char[$i-1] . ')';
8813             }
8814             }
8815             }
8816              
8817             # make regexp string
8818 101         129 $modifier =~ tr/i//d;
8819 101 50       219 if ($left_e > $right_e) {
8820 0         0 return join '', 'Eoldutf8::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
8821             }
8822 101         1083 return join '', 'Eoldutf8::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
8823             }
8824              
8825             #
8826             # escape regexp of split qr''
8827             #
8828             sub e_split_q {
8829 0     0 0   my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8830 0   0       $modifier ||= '';
8831              
8832 0           $modifier =~ tr/p//d;
8833 0 0         if ($modifier =~ /([adlu])/oxms) {
8834 0           my $line = 0;
8835 0           for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8836 0 0         if ($filename ne __FILE__) {
8837 0           $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8838 0           last;
8839             }
8840             }
8841 0           die qq{Unsupported modifier "$1" used at line $line.\n};
8842             }
8843              
8844 0           $slash = 'div';
8845              
8846             # /b /B modifier
8847 0 0         if ($modifier =~ tr/bB//d) {
8848 0           return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
8849             }
8850              
8851 0 0         my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
8852              
8853             # split regexp
8854 0           my @char = $string =~ /\G((?>
8855             [^\x80-\xFF\\\[] |
8856             (?:[\xC0-\xDF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF][\x80-\xBF])[\x80-\xBF] |
8857             \[\^ |
8858             \[\: (?>[a-z]+) \:\] |
8859             \[\:\^ (?>[a-z]+) \:\] |
8860             \\ (?:$q_char) |
8861             (?:$q_char)
8862             ))/oxmsg;
8863              
8864             # unescape character
8865 0           for (my $i=0; $i <= $#char; $i++) {
8866 0 0 0       if (0) {
    0 0        
    0 0        
    0 0        
    0          
    0          
8867             }
8868              
8869             # open character class [...]
8870 0           elsif ($char[$i] eq '[') {
8871 0           my $left = $i;
8872 0 0         if ($char[$i+1] eq ']') {
8873 0           $i++;
8874             }
8875 0           while (1) {
8876 0 0         if (++$i > $#char) {
8877 0           die __FILE__, ": Unmatched [] in regexp\n";
8878             }
8879 0 0         if ($char[$i] eq ']') {
8880 0           my $right = $i;
8881              
8882             # [...]
8883 0           splice @char, $left, $right-$left+1, Eoldutf8::charlist_qr(@char[$left+1..$right-1], $modifier);
8884              
8885 0           $i = $left;
8886 0           last;
8887             }
8888             }
8889             }
8890              
8891             # open character class [^...]
8892             elsif ($char[$i] eq '[^') {
8893 0           my $left = $i;
8894 0 0         if ($char[$i+1] eq ']') {
8895 0           $i++;
8896             }
8897 0           while (1) {
8898 0 0         if (++$i > $#char) {
8899 0           die __FILE__, ": Unmatched [] in regexp\n";
8900             }
8901 0 0         if ($char[$i] eq ']') {
8902 0           my $right = $i;
8903              
8904             # [^...]
8905 0           splice @char, $left, $right-$left+1, Eoldutf8::charlist_not_qr(@char[$left+1..$right-1], $modifier);
8906              
8907 0           $i = $left;
8908 0           last;
8909             }
8910             }
8911             }
8912              
8913             # rewrite character class or escape character
8914             elsif (my $char = character_class($char[$i],$modifier)) {
8915 0           $char[$i] = $char;
8916             }
8917              
8918             # split(m/^/) --> split(m/^/m)
8919             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
8920 0           $modifier .= 'm';
8921             }
8922              
8923             # /i modifier
8924             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eoldutf8::uc($char[$i]) ne Eoldutf8::fc($char[$i]))) {
8925 0 0         if (CORE::length(Eoldutf8::fc($char[$i])) == 1) {
8926 0           $char[$i] = '[' . Eoldutf8::uc($char[$i]) . Eoldutf8::fc($char[$i]) . ']';
8927             }
8928             else {
8929 0           $char[$i] = '(?:' . Eoldutf8::uc($char[$i]) . '|' . Eoldutf8::fc($char[$i]) . ')';
8930             }
8931             }
8932              
8933             # quote character before ? + * {
8934             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8935 0 0         if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
8936             }
8937             else {
8938 0           $char[$i-1] = '(?:' . $char[$i-1] . ')';
8939             }
8940             }
8941             }
8942              
8943 0           $modifier =~ tr/i//d;
8944 0           return join '', 'Eoldutf8::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
8945             }
8946              
8947             #
8948             # instead of Carp::carp
8949             #
8950             sub carp {
8951 0     0 0   my($package,$filename,$line) = caller(1);
8952 0           print STDERR "@_ at $filename line $line.\n";
8953             }
8954              
8955             #
8956             # instead of Carp::croak
8957             #
8958             sub croak {
8959 0     0 0   my($package,$filename,$line) = caller(1);
8960 0           print STDERR "@_ at $filename line $line.\n";
8961 0           die "\n";
8962             }
8963              
8964             #
8965             # instead of Carp::cluck
8966             #
8967             sub cluck {
8968 0     0 0   my $i = 0;
8969 0           my @cluck = ();
8970 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
8971 0           push @cluck, "[$i] $filename($line) $package::$subroutine\n";
8972 0           $i++;
8973             }
8974 0           print STDERR CORE::reverse @cluck;
8975 0           print STDERR "\n";
8976 0           carp @_;
8977             }
8978              
8979             #
8980             # instead of Carp::confess
8981             #
8982             sub confess {
8983 0     0 0   my $i = 0;
8984 0           my @confess = ();
8985 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
8986 0           push @confess, "[$i] $filename($line) $package::$subroutine\n";
8987 0           $i++;
8988             }
8989 0           print STDERR CORE::reverse @confess;
8990 0           print STDERR "\n";
8991 0           croak @_;
8992             }
8993              
8994             1;
8995              
8996             __END__