File Coverage

blib/lib/Ewindows1258.pm
Criterion Covered Total %
statement 905 3194 28.3
branch 968 2740 35.3
condition 98 355 27.6
subroutine 52 110 47.2
pod 7 74 9.4
total 2030 6473 31.3


line stmt bran cond sub pod time code
1             package Ewindows1258;
2 204     204   1379 use strict;
  204         2495  
  204         9597  
3             ######################################################################
4             #
5             # Ewindows1258 - Run-time routines for Windows1258.pm
6             #
7             # http://search.cpan.org/dist/Char-Windows1258/
8             #
9             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2019 INABA Hitoshi
10             ######################################################################
11              
12 204     204   2823 use 5.00503; # Galapagos Consensus 1998 for primetools
  204         821  
13             # use 5.008001; # Lancaster Consensus 2013 for toolchains
14              
15             # 12.3. Delaying use Until Runtime
16             # in Chapter 12. Packages, Libraries, and Modules
17             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
18             # (and so on)
19              
20             # Version numbers should be boring
21             # http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/
22             # For the impatient, the disinterested or those who just want to follow
23             # a recipe, my advice for all modules is this:
24             # our $VERSION = "0.001"; # or "0.001_001" for a dev release
25             # $VERSION = eval $VERSION; # No!! because '1.10' makes '1.1'
26              
27 204     204   1053 use vars qw($VERSION);
  204         427  
  204         42026  
28             $VERSION = '1.13';
29             $VERSION = $VERSION;
30              
31             BEGIN {
32 204 50   204   1833 if ($^X =~ / jperl /oxmsi) {
33 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
34             }
35 204         364 if (CORE::ord('A') == 193) {
36             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
37             }
38 204         39101 if (CORE::ord('A') != 0x41) {
39             die __FILE__, ": is not US-ASCII script (must be US-ASCII script).\n";
40             }
41             }
42              
43             BEGIN {
44              
45             # instead of utf8.pm
46 204     204   20028 CORE::eval q{
  204     204   1525  
  204     80   496  
  204         33465  
  0         0  
  0         0  
  0         0  
  0         0  
47             no warnings qw(redefine);
48             *utf8::upgrade = sub { CORE::length $_[0] };
49             *utf8::downgrade = sub { 1 };
50             *utf8::encode = sub { };
51             *utf8::decode = sub { 1 };
52             *utf8::is_utf8 = sub { };
53             *utf8::valid = sub { 1 };
54             };
55 204 50       98639 if ($@) {
56 0         0 *utf8::upgrade = sub { CORE::length $_[0] };
  0         0  
57 0         0 *utf8::downgrade = sub { 1 };
  0         0  
58 0         0 *utf8::encode = sub { };
59 0         0 *utf8::decode = sub { 1 };
  0         0  
60 0         0 *utf8::is_utf8 = sub { };
61 0         0 *utf8::valid = sub { 1 };
  0         0  
62             }
63             }
64              
65             # instead of Symbol.pm
66 0         0 BEGIN {
67             sub gensym () {
68 0     0 0 0 return \do { local *_ };
  0         0  
69             }
70              
71             sub qualify ($$) {
72 0     0 0 0 my($name) = @_;
73              
74 0 0       0 if (ref $name) {
    0          
    0          
    0          
    0          
    0          
    0          
75 0         0 return $name;
76             }
77             elsif (Ewindows1258::index($name,'::') >= 0) {
78 0         0 return $name;
79             }
80             elsif (Ewindows1258::index($name,"'") >= 0) {
81 0         0 return $name;
82             }
83              
84             # special character, "^xyz"
85             elsif ($name =~ /\A \^ [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]+ \z/x) {
86              
87             # RGS 2001-11-05 : translate leading ^X to control-char
88 0         0 $name =~ s{\A \^ ([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]) }{'qq(\c'.$1.')'}xee;
  0         0  
89 0         0 return 'main::' . $name;
90             }
91              
92             # Global names
93             elsif ($name =~ /\A (?: ARGV | ARGVOUT | ENV | INC | SIG | STDERR | STDIN | STDOUT ) \z/x) {
94 0         0 return 'main::' . $name;
95             }
96              
97             # or other
98             elsif ($name =~ /\A [^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] \z/x) {
99 0         0 return 'main::' . $name;
100             }
101              
102             elsif (defined $_[1]) {
103 0         0 return $_[1] . '::' . $name;
104             }
105             else {
106 0         0 return (caller)[0] . '::' . $name;
107             }
108             }
109              
110             sub qualify_to_ref ($;$) {
111 0 0   0 0 0 if (defined $_[1]) {
112 204     204   2561 no strict qw(refs);
  204         379  
  204         15603  
113 0         0 return \*{ qualify $_[0], $_[1] };
  0         0  
114             }
115             else {
116 204     204   1475 no strict qw(refs);
  204     0   605  
  204         43079  
117 0         0 return \*{ qualify $_[0], (caller)[0] };
  0         0  
118             }
119             }
120             }
121              
122             # P.714 29.2.39. flock
123             # in Chapter 29: Functions
124             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
125              
126             # P.863 flock
127             # in Chapter 27: Functions
128             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
129              
130             sub LOCK_SH() {1}
131             sub LOCK_EX() {2}
132             sub LOCK_UN() {8}
133             sub LOCK_NB() {4}
134              
135             # instead of Carp.pm
136             sub carp;
137             sub croak;
138             sub cluck;
139             sub confess;
140              
141             # 6.18. Matching Multiple-Byte Characters
142             # in Chapter 6. Pattern Matching
143             # of ISBN 978-1-56592-243-3 Perl Perl Cookbook.
144             # (and so on)
145              
146             # regexp of character
147             my $your_char = q{[\x00-\xFF]};
148 204     204   1434 use vars qw($qq_char); $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  204         429  
  204         14640  
149 204     204   1426 use vars qw($q_char); $q_char = qr/$your_char/oxms;
  204         427  
  204         404383  
150              
151             #
152             # Windows-1258 character range per length
153             #
154             my %range_tr = ();
155              
156             #
157             # Windows-1258 case conversion
158             #
159             my %lc = ();
160             @lc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
161             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
162             my %uc = ();
163             @uc{qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)} =
164             qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
165             my %fc = ();
166             @fc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
167             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
168              
169             if (0) {
170             }
171              
172             elsif (__PACKAGE__ =~ / \b Ewindows1258 \z/oxms) {
173             %range_tr = (
174             1 => [ [0x00..0xFF],
175             ],
176             );
177              
178             %lc = (%lc,
179             "\x8C" => "\x9C", # LATIN LIGATURE OE
180             "\x9F" => "\xFF", # LATIN LETTER Y WITH DIAERESIS
181             "\xC0" => "\xE0", # LATIN LETTER A WITH GRAVE
182             "\xC1" => "\xE1", # LATIN LETTER A WITH ACUTE
183             "\xC2" => "\xE2", # LATIN LETTER A WITH CIRCUMFLEX
184             "\xC3" => "\xE3", # LATIN LETTER A WITH BREVE
185             "\xC4" => "\xE4", # LATIN LETTER A WITH DIAERESIS
186             "\xC5" => "\xE5", # LATIN LETTER A WITH RING ABOVE
187             "\xC6" => "\xE6", # LATIN LETTER AE
188             "\xC7" => "\xE7", # LATIN LETTER C WITH CEDILLA
189             "\xC8" => "\xE8", # LATIN LETTER E WITH GRAVE
190             "\xC9" => "\xE9", # LATIN LETTER E WITH ACUTE
191             "\xCA" => "\xEA", # LATIN LETTER E WITH CIRCUMFLEX
192             "\xCB" => "\xEB", # LATIN LETTER E WITH DIAERESIS
193             "\xCD" => "\xED", # LATIN LETTER I WITH ACUTE
194             "\xCE" => "\xEE", # LATIN LETTER I WITH CIRCUMFLEX
195             "\xCF" => "\xEF", # LATIN LETTER I WITH DIAERESIS
196             "\xD0" => "\xF0", # LATIN LETTER D WITH STROKE
197             "\xD1" => "\xF1", # LATIN LETTER N WITH TILDE
198             "\xD3" => "\xF3", # LATIN LETTER O WITH ACUTE
199             "\xD4" => "\xF4", # LATIN LETTER O WITH CIRCUMFLEX
200             "\xD5" => "\xF5", # LATIN LETTER O WITH HORN
201             "\xD6" => "\xF6", # LATIN LETTER O WITH DIAERESIS
202             "\xD8" => "\xF8", # LATIN LETTER O WITH STROKE
203             "\xD9" => "\xF9", # LATIN LETTER U WITH GRAVE
204             "\xDA" => "\xFA", # LATIN LETTER U WITH ACUTE
205             "\xDB" => "\xFB", # LATIN LETTER U WITH CIRCUMFLEX
206             "\xDC" => "\xFC", # LATIN LETTER U WITH DIAERESIS
207             "\xDD" => "\xFD", # LATIN LETTER U WITH HORN
208             );
209              
210             %uc = (%uc,
211             "\x9C" => "\x8C", # LATIN LIGATURE OE
212             "\xFF" => "\x9F", # LATIN LETTER Y WITH DIAERESIS
213             "\xE0" => "\xC0", # LATIN LETTER A WITH GRAVE
214             "\xE1" => "\xC1", # LATIN LETTER A WITH ACUTE
215             "\xE2" => "\xC2", # LATIN LETTER A WITH CIRCUMFLEX
216             "\xE3" => "\xC3", # LATIN LETTER A WITH BREVE
217             "\xE4" => "\xC4", # LATIN LETTER A WITH DIAERESIS
218             "\xE5" => "\xC5", # LATIN LETTER A WITH RING ABOVE
219             "\xE6" => "\xC6", # LATIN LETTER AE
220             "\xE7" => "\xC7", # LATIN LETTER C WITH CEDILLA
221             "\xE8" => "\xC8", # LATIN LETTER E WITH GRAVE
222             "\xE9" => "\xC9", # LATIN LETTER E WITH ACUTE
223             "\xEA" => "\xCA", # LATIN LETTER E WITH CIRCUMFLEX
224             "\xEB" => "\xCB", # LATIN LETTER E WITH DIAERESIS
225             "\xED" => "\xCD", # LATIN LETTER I WITH ACUTE
226             "\xEE" => "\xCE", # LATIN LETTER I WITH CIRCUMFLEX
227             "\xEF" => "\xCF", # LATIN LETTER I WITH DIAERESIS
228             "\xF0" => "\xD0", # LATIN LETTER D WITH STROKE
229             "\xF1" => "\xD1", # LATIN LETTER N WITH TILDE
230             "\xF3" => "\xD3", # LATIN LETTER O WITH ACUTE
231             "\xF4" => "\xD4", # LATIN LETTER O WITH CIRCUMFLEX
232             "\xF5" => "\xD5", # LATIN LETTER O WITH HORN
233             "\xF6" => "\xD6", # LATIN LETTER O WITH DIAERESIS
234             "\xF8" => "\xD8", # LATIN LETTER O WITH STROKE
235             "\xF9" => "\xD9", # LATIN LETTER U WITH GRAVE
236             "\xFA" => "\xDA", # LATIN LETTER U WITH ACUTE
237             "\xFB" => "\xDB", # LATIN LETTER U WITH CIRCUMFLEX
238             "\xFC" => "\xDC", # LATIN LETTER U WITH DIAERESIS
239             "\xFD" => "\xDD", # LATIN LETTER U WITH HORN
240             );
241              
242             %fc = (%fc,
243             "\x8C" => "\x9C", # LATIN CAPITAL LIGATURE OE --> LATIN SMALL LIGATURE OE
244             "\x9F" => "\xFF", # LATIN CAPITAL LETTER Y WITH DIAERESIS --> LATIN SMALL LETTER Y WITH DIAERESIS
245             "\xC0" => "\xE0", # LATIN CAPITAL LETTER A WITH GRAVE --> LATIN SMALL LETTER A WITH GRAVE
246             "\xC1" => "\xE1", # LATIN CAPITAL LETTER A WITH ACUTE --> LATIN SMALL LETTER A WITH ACUTE
247             "\xC2" => "\xE2", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX --> LATIN SMALL LETTER A WITH CIRCUMFLEX
248             "\xC3" => "\xE3", # LATIN CAPITAL LETTER A WITH BREVE --> LATIN SMALL LETTER A WITH BREVE
249             "\xC4" => "\xE4", # LATIN CAPITAL LETTER A WITH DIAERESIS --> LATIN SMALL LETTER A WITH DIAERESIS
250             "\xC5" => "\xE5", # LATIN CAPITAL LETTER A WITH RING ABOVE --> LATIN SMALL LETTER A WITH RING ABOVE
251             "\xC6" => "\xE6", # LATIN CAPITAL LETTER AE --> LATIN SMALL LETTER AE
252             "\xC7" => "\xE7", # LATIN CAPITAL LETTER C WITH CEDILLA --> LATIN SMALL LETTER C WITH CEDILLA
253             "\xC8" => "\xE8", # LATIN CAPITAL LETTER E WITH GRAVE --> LATIN SMALL LETTER E WITH GRAVE
254             "\xC9" => "\xE9", # LATIN CAPITAL LETTER E WITH ACUTE --> LATIN SMALL LETTER E WITH ACUTE
255             "\xCA" => "\xEA", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX --> LATIN SMALL LETTER E WITH CIRCUMFLEX
256             "\xCB" => "\xEB", # LATIN CAPITAL LETTER E WITH DIAERESIS --> LATIN SMALL LETTER E WITH DIAERESIS
257             "\xCD" => "\xED", # LATIN CAPITAL LETTER I WITH ACUTE --> LATIN SMALL LETTER I WITH ACUTE
258             "\xCE" => "\xEE", # LATIN CAPITAL LETTER I WITH CIRCUMFLEX --> LATIN SMALL LETTER I WITH CIRCUMFLEX
259             "\xCF" => "\xEF", # LATIN CAPITAL LETTER I WITH DIAERESIS --> LATIN SMALL LETTER I WITH DIAERESIS
260             "\xD0" => "\xF0", # LATIN CAPITAL LETTER D WITH STROKE --> LATIN SMALL LETTER D WITH STROKE
261             "\xD1" => "\xF1", # LATIN CAPITAL LETTER N WITH TILDE --> LATIN SMALL LETTER N WITH TILDE
262             "\xD3" => "\xF3", # LATIN CAPITAL LETTER O WITH ACUTE --> LATIN SMALL LETTER O WITH ACUTE
263             "\xD4" => "\xF4", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX --> LATIN SMALL LETTER O WITH CIRCUMFLEX
264             "\xD5" => "\xF5", # LATIN CAPITAL LETTER O WITH HORN --> LATIN SMALL LETTER O WITH HORN
265             "\xD6" => "\xF6", # LATIN CAPITAL LETTER O WITH DIAERESIS --> LATIN SMALL LETTER O WITH DIAERESIS
266             "\xD8" => "\xF8", # LATIN CAPITAL LETTER O WITH STROKE --> LATIN SMALL LETTER O WITH STROKE
267             "\xD9" => "\xF9", # LATIN CAPITAL LETTER U WITH GRAVE --> LATIN SMALL LETTER U WITH GRAVE
268             "\xDA" => "\xFA", # LATIN CAPITAL LETTER U WITH ACUTE --> LATIN SMALL LETTER U WITH ACUTE
269             "\xDB" => "\xFB", # LATIN CAPITAL LETTER U WITH CIRCUMFLEX --> LATIN SMALL LETTER U WITH CIRCUMFLEX
270             "\xDC" => "\xFC", # LATIN CAPITAL LETTER U WITH DIAERESIS --> LATIN SMALL LETTER U WITH DIAERESIS
271             "\xDD" => "\xFD", # LATIN CAPITAL LETTER U WITH HORN --> LATIN SMALL LETTER U WITH HORN
272             "\xDF" => "\x73\x73", # LATIN SMALL LETTER SHARP S --> LATIN SMALL LETTER S, LATIN SMALL LETTER S
273             );
274             }
275              
276             else {
277             croak "Don't know my package name '@{[__PACKAGE__]}'";
278             }
279              
280             #
281             # @ARGV wildcard globbing
282             #
283             sub import {
284              
285 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
286 0         0 my @argv = ();
287 0         0 for (@ARGV) {
288              
289             # has space
290 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
291 0 0       0 if (my @glob = Ewindows1258::glob(qq{"$_"})) {
292 0         0 push @argv, @glob;
293             }
294             else {
295 0         0 push @argv, $_;
296             }
297             }
298              
299             # has wildcard metachar
300             elsif (/\A (?:$q_char)*? [*?] /oxms) {
301 0 0       0 if (my @glob = Ewindows1258::glob($_)) {
302 0         0 push @argv, @glob;
303             }
304             else {
305 0         0 push @argv, $_;
306             }
307             }
308              
309             # no wildcard globbing
310             else {
311 0         0 push @argv, $_;
312             }
313             }
314 0         0 @ARGV = @argv;
315             }
316              
317 0         0 *Char::ord = \&Windows1258::ord;
318 0         0 *Char::ord_ = \&Windows1258::ord_;
319 0         0 *Char::reverse = \&Windows1258::reverse;
320 0         0 *Char::getc = \&Windows1258::getc;
321 0         0 *Char::length = \&Windows1258::length;
322 0         0 *Char::substr = \&Windows1258::substr;
323 0         0 *Char::index = \&Windows1258::index;
324 0         0 *Char::rindex = \&Windows1258::rindex;
325 0         0 *Char::eval = \&Windows1258::eval;
326 0         0 *Char::escape = \&Windows1258::escape;
327 0         0 *Char::escape_token = \&Windows1258::escape_token;
328 0         0 *Char::escape_script = \&Windows1258::escape_script;
329             }
330              
331             # P.230 Care with Prototypes
332             # in Chapter 6: Subroutines
333             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
334             #
335             # If you aren't careful, you can get yourself into trouble with prototypes.
336             # But if you are careful, you can do a lot of neat things with them. This is
337             # all very powerful, of course, and should only be used in moderation to make
338             # the world a better place.
339              
340             # P.332 Care with Prototypes
341             # in Chapter 7: Subroutines
342             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
343             #
344             # If you aren't careful, you can get yourself into trouble with prototypes.
345             # But if you are careful, you can do a lot of neat things with them. This is
346             # all very powerful, of course, and should only be used in moderation to make
347             # the world a better place.
348              
349             #
350             # Prototypes of subroutines
351             #
352       0     sub unimport {}
353             sub Ewindows1258::split(;$$$);
354             sub Ewindows1258::tr($$$$;$);
355             sub Ewindows1258::chop(@);
356             sub Ewindows1258::index($$;$);
357             sub Ewindows1258::rindex($$;$);
358             sub Ewindows1258::lcfirst(@);
359             sub Ewindows1258::lcfirst_();
360             sub Ewindows1258::lc(@);
361             sub Ewindows1258::lc_();
362             sub Ewindows1258::ucfirst(@);
363             sub Ewindows1258::ucfirst_();
364             sub Ewindows1258::uc(@);
365             sub Ewindows1258::uc_();
366             sub Ewindows1258::fc(@);
367             sub Ewindows1258::fc_();
368             sub Ewindows1258::ignorecase;
369             sub Ewindows1258::classic_character_class;
370             sub Ewindows1258::capture;
371             sub Ewindows1258::chr(;$);
372             sub Ewindows1258::chr_();
373             sub Ewindows1258::glob($);
374             sub Ewindows1258::glob_();
375              
376             sub Windows1258::ord(;$);
377             sub Windows1258::ord_();
378             sub Windows1258::reverse(@);
379             sub Windows1258::getc(;*@);
380             sub Windows1258::length(;$);
381             sub Windows1258::substr($$;$$);
382             sub Windows1258::index($$;$);
383             sub Windows1258::rindex($$;$);
384             sub Windows1258::escape(;$);
385              
386             #
387             # Regexp work
388             #
389 204         16958 use vars qw(
390             $re_a
391             $re_t
392             $re_n
393             $re_r
394 204     204   1968 );
  204         611  
395              
396             #
397             # Character class
398             #
399 204         2170733 use vars qw(
400             $dot
401             $dot_s
402             $eD
403             $eS
404             $eW
405             $eH
406             $eV
407             $eR
408             $eN
409             $not_alnum
410             $not_alpha
411             $not_ascii
412             $not_blank
413             $not_cntrl
414             $not_digit
415             $not_graph
416             $not_lower
417             $not_lower_i
418             $not_print
419             $not_punct
420             $not_space
421             $not_upper
422             $not_upper_i
423             $not_word
424             $not_xdigit
425             $eb
426             $eB
427 204     204   2802 );
  204         475  
428              
429             ${Ewindows1258::dot} = qr{(?>[^\x0A])};
430             ${Ewindows1258::dot_s} = qr{(?>[\x00-\xFF])};
431             ${Ewindows1258::eD} = qr{(?>[^0-9])};
432              
433             # Vertical tabs are now whitespace
434             # \s in a regex now matches a vertical tab in all circumstances.
435             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
436             # ${Ewindows1258::eS} = qr{(?>[^\x09\x0A \x0C\x0D\x20])};
437             # ${Ewindows1258::eS} = qr{(?>[^\x09\x0A\x0B\x0C\x0D\x20])};
438             ${Ewindows1258::eS} = qr{(?>[^\s])};
439              
440             ${Ewindows1258::eW} = qr{(?>[^0-9A-Z_a-z])};
441             ${Ewindows1258::eH} = qr{(?>[^\x09\x20])};
442             ${Ewindows1258::eV} = qr{(?>[^\x0A\x0B\x0C\x0D])};
443             ${Ewindows1258::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
444             ${Ewindows1258::eN} = qr{(?>[^\x0A])};
445             ${Ewindows1258::not_alnum} = qr{(?>[^\x30-\x39\x41-\x5A\x61-\x7A])};
446             ${Ewindows1258::not_alpha} = qr{(?>[^\x41-\x5A\x61-\x7A])};
447             ${Ewindows1258::not_ascii} = qr{(?>[^\x00-\x7F])};
448             ${Ewindows1258::not_blank} = qr{(?>[^\x09\x20])};
449             ${Ewindows1258::not_cntrl} = qr{(?>[^\x00-\x1F\x7F])};
450             ${Ewindows1258::not_digit} = qr{(?>[^\x30-\x39])};
451             ${Ewindows1258::not_graph} = qr{(?>[^\x21-\x7F])};
452             ${Ewindows1258::not_lower} = qr{(?>[^\x61-\x7A])};
453             ${Ewindows1258::not_lower_i} = qr{(?>[^\x41-\x5A\x61-\x7A])}; # Perl 5.16 compatible
454             # ${Ewindows1258::not_lower_i} = qr{(?>[\x00-\xFF])}; # older Perl compatible
455             ${Ewindows1258::not_print} = qr{(?>[^\x20-\x7F])};
456             ${Ewindows1258::not_punct} = qr{(?>[^\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E])};
457             ${Ewindows1258::not_space} = qr{(?>[^\s\x0B])};
458             ${Ewindows1258::not_upper} = qr{(?>[^\x41-\x5A])};
459             ${Ewindows1258::not_upper_i} = qr{(?>[^\x41-\x5A\x61-\x7A])}; # Perl 5.16 compatible
460             # ${Ewindows1258::not_upper_i} = qr{(?>[\x00-\xFF])}; # older Perl compatible
461             ${Ewindows1258::not_word} = qr{(?>[^\x30-\x39\x41-\x5A\x5F\x61-\x7A])};
462             ${Ewindows1258::not_xdigit} = qr{(?>[^\x30-\x39\x41-\x46\x61-\x66])};
463             ${Ewindows1258::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))};
464             ${Ewindows1258::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]))};
465              
466             # avoid: Name "Ewindows1258::foo" used only once: possible typo at here.
467             ${Ewindows1258::dot} = ${Ewindows1258::dot};
468             ${Ewindows1258::dot_s} = ${Ewindows1258::dot_s};
469             ${Ewindows1258::eD} = ${Ewindows1258::eD};
470             ${Ewindows1258::eS} = ${Ewindows1258::eS};
471             ${Ewindows1258::eW} = ${Ewindows1258::eW};
472             ${Ewindows1258::eH} = ${Ewindows1258::eH};
473             ${Ewindows1258::eV} = ${Ewindows1258::eV};
474             ${Ewindows1258::eR} = ${Ewindows1258::eR};
475             ${Ewindows1258::eN} = ${Ewindows1258::eN};
476             ${Ewindows1258::not_alnum} = ${Ewindows1258::not_alnum};
477             ${Ewindows1258::not_alpha} = ${Ewindows1258::not_alpha};
478             ${Ewindows1258::not_ascii} = ${Ewindows1258::not_ascii};
479             ${Ewindows1258::not_blank} = ${Ewindows1258::not_blank};
480             ${Ewindows1258::not_cntrl} = ${Ewindows1258::not_cntrl};
481             ${Ewindows1258::not_digit} = ${Ewindows1258::not_digit};
482             ${Ewindows1258::not_graph} = ${Ewindows1258::not_graph};
483             ${Ewindows1258::not_lower} = ${Ewindows1258::not_lower};
484             ${Ewindows1258::not_lower_i} = ${Ewindows1258::not_lower_i};
485             ${Ewindows1258::not_print} = ${Ewindows1258::not_print};
486             ${Ewindows1258::not_punct} = ${Ewindows1258::not_punct};
487             ${Ewindows1258::not_space} = ${Ewindows1258::not_space};
488             ${Ewindows1258::not_upper} = ${Ewindows1258::not_upper};
489             ${Ewindows1258::not_upper_i} = ${Ewindows1258::not_upper_i};
490             ${Ewindows1258::not_word} = ${Ewindows1258::not_word};
491             ${Ewindows1258::not_xdigit} = ${Ewindows1258::not_xdigit};
492             ${Ewindows1258::eb} = ${Ewindows1258::eb};
493             ${Ewindows1258::eB} = ${Ewindows1258::eB};
494              
495             #
496             # Windows-1258 split
497             #
498             sub Ewindows1258::split(;$$$) {
499              
500             # P.794 29.2.161. split
501             # in Chapter 29: Functions
502             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
503              
504             # P.951 split
505             # in Chapter 27: Functions
506             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
507              
508 0     0 0 0 my $pattern = $_[0];
509 0         0 my $string = $_[1];
510 0         0 my $limit = $_[2];
511              
512             # if $pattern is also omitted or is the literal space, " "
513 0 0       0 if (not defined $pattern) {
514 0         0 $pattern = ' ';
515             }
516              
517             # if $string is omitted, the function splits the $_ string
518 0 0       0 if (not defined $string) {
519 0 0       0 if (defined $_) {
520 0         0 $string = $_;
521             }
522             else {
523 0         0 $string = '';
524             }
525             }
526              
527 0         0 my @split = ();
528              
529             # when string is empty
530 0 0       0 if ($string eq '') {
    0          
531              
532             # resulting list value in list context
533 0 0       0 if (wantarray) {
534 0         0 return @split;
535             }
536              
537             # count of substrings in scalar context
538             else {
539 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
540 0         0 @_ = @split;
541 0         0 return scalar @_;
542             }
543             }
544              
545             # split's first argument is more consistently interpreted
546             #
547             # After some changes earlier in v5.17, split's behavior has been simplified:
548             # if the PATTERN argument evaluates to a string containing one space, it is
549             # treated the way that a literal string containing one space once was.
550             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
551              
552             # if $pattern is also omitted or is the literal space, " ", the function splits
553             # on whitespace, /\s+/, after skipping any leading whitespace
554             # (and so on)
555              
556             elsif ($pattern eq ' ') {
557 0 0       0 if (not defined $limit) {
558 0         0 return CORE::split(' ', $string);
559             }
560             else {
561 0         0 return CORE::split(' ', $string, $limit);
562             }
563             }
564              
565             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
566 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
567              
568             # a pattern capable of matching either the null string or something longer than the
569             # null string will split the value of $string into separate characters wherever it
570             # matches the null string between characters
571             # (and so on)
572              
573 0 0       0 if ('' =~ / \A $pattern \z /xms) {
574 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
575 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
576              
577             # P.1024 Appendix W.10 Multibyte Processing
578             # of ISBN 1-56592-224-7 CJKV Information Processing
579             # (and so on)
580              
581             # the //m modifier is assumed when you split on the pattern /^/
582             # (and so on)
583              
584             # V
585 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
586              
587             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
588             # is included in the resulting list, interspersed with the fields that are ordinarily returned
589             # (and so on)
590              
591 0         0 local $@;
592 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
593 0         0 push @split, CORE::eval('$' . $digit);
594             }
595             }
596             }
597              
598             else {
599 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
600              
601             # V
602 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
603 0         0 local $@;
604 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
605 0         0 push @split, CORE::eval('$' . $digit);
606             }
607             }
608             }
609             }
610              
611             elsif ($limit > 0) {
612 0 0       0 if ('' =~ / \A $pattern \z /xms) {
613 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
614 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
615              
616             # V
617 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
618 0         0 local $@;
619 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
620 0         0 push @split, CORE::eval('$' . $digit);
621             }
622             }
623             }
624             }
625             else {
626 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
627 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
628              
629             # V
630 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
631 0         0 local $@;
632 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
633 0         0 push @split, CORE::eval('$' . $digit);
634             }
635             }
636             }
637             }
638             }
639              
640 0 0       0 if (CORE::length($string) > 0) {
641 0         0 push @split, $string;
642             }
643              
644             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
645 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
646 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
647 0         0 pop @split;
648             }
649             }
650              
651             # resulting list value in list context
652 0 0       0 if (wantarray) {
653 0         0 return @split;
654             }
655              
656             # count of substrings in scalar context
657             else {
658 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
659 0         0 @_ = @split;
660 0         0 return scalar @_;
661             }
662             }
663              
664             #
665             # get last subexpression offsets
666             #
667             sub _last_subexpression_offsets {
668 0     0   0 my $pattern = $_[0];
669              
670             # remove comment
671 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
672              
673 0         0 my $modifier = '';
674 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
675 0         0 $modifier = $1;
676 0         0 $modifier =~ s/-[A-Za-z]*//;
677             }
678              
679             # with /x modifier
680 0         0 my @char = ();
681 0 0       0 if ($modifier =~ /x/oxms) {
682 0         0 @char = $pattern =~ /\G((?>
683             [^\\\#\[\(] |
684             \\ $q_char |
685             \# (?>[^\n]*) $ |
686             \[ (?>(?:[^\\\]]|\\\\|\\\]|$q_char)+) \] |
687             \(\? |
688             $q_char
689             ))/oxmsg;
690             }
691              
692             # without /x modifier
693             else {
694 0         0 @char = $pattern =~ /\G((?>
695             [^\\\[\(] |
696             \\ $q_char |
697             \[ (?>(?:[^\\\]]|\\\\|\\\]|$q_char)+) \] |
698             \(\? |
699             $q_char
700             ))/oxmsg;
701             }
702              
703 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
704             }
705              
706             #
707             # Windows-1258 transliteration (tr///)
708             #
709             sub Ewindows1258::tr($$$$;$) {
710              
711 0     0 0 0 my $bind_operator = $_[1];
712 0         0 my $searchlist = $_[2];
713 0         0 my $replacementlist = $_[3];
714 0   0     0 my $modifier = $_[4] || '';
715              
716 0 0       0 if ($modifier =~ /r/oxms) {
717 0 0       0 if ($bind_operator =~ / !~ /oxms) {
718 0         0 croak "Using !~ with tr///r doesn't make sense";
719             }
720             }
721              
722 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
723 0         0 my @searchlist = _charlist_tr($searchlist);
724 0         0 my @replacementlist = _charlist_tr($replacementlist);
725              
726 0         0 my %tr = ();
727 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
728 0 0       0 if (not exists $tr{$searchlist[$i]}) {
729 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
730 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
731             }
732             elsif ($modifier =~ /d/oxms) {
733 0         0 $tr{$searchlist[$i]} = '';
734             }
735             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
736 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
737             }
738             else {
739 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
740             }
741             }
742             }
743              
744 0         0 my $tr = 0;
745 0         0 my $replaced = '';
746 0 0       0 if ($modifier =~ /c/oxms) {
747 0         0 while (defined(my $char = shift @char)) {
748 0 0       0 if (not exists $tr{$char}) {
749 0 0       0 if (defined $replacementlist[0]) {
750 0         0 $replaced .= $replacementlist[0];
751             }
752 0         0 $tr++;
753 0 0       0 if ($modifier =~ /s/oxms) {
754 0   0     0 while (@char and (not exists $tr{$char[0]})) {
755 0         0 shift @char;
756 0         0 $tr++;
757             }
758             }
759             }
760             else {
761 0         0 $replaced .= $char;
762             }
763             }
764             }
765             else {
766 0         0 while (defined(my $char = shift @char)) {
767 0 0       0 if (exists $tr{$char}) {
768 0         0 $replaced .= $tr{$char};
769 0         0 $tr++;
770 0 0       0 if ($modifier =~ /s/oxms) {
771 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
772 0         0 shift @char;
773 0         0 $tr++;
774             }
775             }
776             }
777             else {
778 0         0 $replaced .= $char;
779             }
780             }
781             }
782              
783 0 0       0 if ($modifier =~ /r/oxms) {
784 0         0 return $replaced;
785             }
786             else {
787 0         0 $_[0] = $replaced;
788 0 0       0 if ($bind_operator =~ / !~ /oxms) {
789 0         0 return not $tr;
790             }
791             else {
792 0         0 return $tr;
793             }
794             }
795             }
796              
797             #
798             # Windows-1258 chop
799             #
800             sub Ewindows1258::chop(@) {
801              
802 0     0 0 0 my $chop;
803 0 0       0 if (@_ == 0) {
804 0         0 my @char = /\G (?>$q_char) /oxmsg;
805 0         0 $chop = pop @char;
806 0         0 $_ = join '', @char;
807             }
808             else {
809 0         0 for (@_) {
810 0         0 my @char = /\G (?>$q_char) /oxmsg;
811 0         0 $chop = pop @char;
812 0         0 $_ = join '', @char;
813             }
814             }
815 0         0 return $chop;
816             }
817              
818             #
819             # Windows-1258 index by octet
820             #
821             sub Ewindows1258::index($$;$) {
822              
823 0     0 1 0 my($str,$substr,$position) = @_;
824 0   0     0 $position ||= 0;
825 0         0 my $pos = 0;
826              
827 0         0 while ($pos < CORE::length($str)) {
828 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
829 0 0       0 if ($pos >= $position) {
830 0         0 return $pos;
831             }
832             }
833 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
834 0         0 $pos += CORE::length($1);
835             }
836             else {
837 0         0 $pos += 1;
838             }
839             }
840 0         0 return -1;
841             }
842              
843             #
844             # Windows-1258 reverse index
845             #
846             sub Ewindows1258::rindex($$;$) {
847              
848 0     0 0 0 my($str,$substr,$position) = @_;
849 0   0     0 $position ||= CORE::length($str) - 1;
850 0         0 my $pos = 0;
851 0         0 my $rindex = -1;
852              
853 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
854 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
855 0         0 $rindex = $pos;
856             }
857 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
858 0         0 $pos += CORE::length($1);
859             }
860             else {
861 0         0 $pos += 1;
862             }
863             }
864 0         0 return $rindex;
865             }
866              
867             #
868             # Windows-1258 lower case first with parameter
869             #
870             sub Ewindows1258::lcfirst(@) {
871 0 0   0 0 0 if (@_) {
872 0         0 my $s = shift @_;
873 0 0 0     0 if (@_ and wantarray) {
874 0         0 return Ewindows1258::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
875             }
876             else {
877 0         0 return Ewindows1258::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
878             }
879             }
880             else {
881 0         0 return Ewindows1258::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
882             }
883             }
884              
885             #
886             # Windows-1258 lower case first without parameter
887             #
888             sub Ewindows1258::lcfirst_() {
889 0     0 0 0 return Ewindows1258::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
890             }
891              
892             #
893             # Windows-1258 lower case with parameter
894             #
895             sub Ewindows1258::lc(@) {
896 0 0   0 0 0 if (@_) {
897 0         0 my $s = shift @_;
898 0 0 0     0 if (@_ and wantarray) {
899 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
900             }
901             else {
902 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
903             }
904             }
905             else {
906 0         0 return Ewindows1258::lc_();
907             }
908             }
909              
910             #
911             # Windows-1258 lower case without parameter
912             #
913             sub Ewindows1258::lc_() {
914 0     0 0 0 my $s = $_;
915 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
916             }
917              
918             #
919             # Windows-1258 upper case first with parameter
920             #
921             sub Ewindows1258::ucfirst(@) {
922 0 0   0 0 0 if (@_) {
923 0         0 my $s = shift @_;
924 0 0 0     0 if (@_ and wantarray) {
925 0         0 return Ewindows1258::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
926             }
927             else {
928 0         0 return Ewindows1258::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
929             }
930             }
931             else {
932 0         0 return Ewindows1258::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
933             }
934             }
935              
936             #
937             # Windows-1258 upper case first without parameter
938             #
939             sub Ewindows1258::ucfirst_() {
940 0     0 0 0 return Ewindows1258::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
941             }
942              
943             #
944             # Windows-1258 upper case with parameter
945             #
946             sub Ewindows1258::uc(@) {
947 0 50   174 0 0 if (@_) {
948 174         290 my $s = shift @_;
949 174 50 33     236 if (@_ and wantarray) {
950 174 0       335 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
951             }
952             else {
953 0 100       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  174         589  
954             }
955             }
956             else {
957 174         690 return Ewindows1258::uc_();
958             }
959             }
960              
961             #
962             # Windows-1258 upper case without parameter
963             #
964             sub Ewindows1258::uc_() {
965 0     0 0 0 my $s = $_;
966 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
967             }
968              
969             #
970             # Windows-1258 fold case with parameter
971             #
972             sub Ewindows1258::fc(@) {
973 0 50   197 0 0 if (@_) {
974 197         331 my $s = shift @_;
975 197 50 33     237 if (@_ and wantarray) {
976 197 0       353 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
977             }
978             else {
979 0 100       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  197         752  
980             }
981             }
982             else {
983 197         1072 return Ewindows1258::fc_();
984             }
985             }
986              
987             #
988             # Windows-1258 fold case without parameter
989             #
990             sub Ewindows1258::fc_() {
991 0     0 0 0 my $s = $_;
992 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
993             }
994              
995             #
996             # Windows-1258 regexp capture
997             #
998             {
999             sub Ewindows1258::capture {
1000 0     0 1 0 return $_[0];
1001             }
1002             }
1003              
1004             #
1005             # Windows-1258 regexp ignore case modifier
1006             #
1007             sub Ewindows1258::ignorecase {
1008              
1009 0     0 0 0 my @string = @_;
1010 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
1011              
1012             # ignore case of $scalar or @array
1013 0         0 for my $string (@string) {
1014              
1015             # split regexp
1016 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
1017              
1018             # unescape character
1019 0         0 for (my $i=0; $i <= $#char; $i++) {
1020 0 0       0 next if not defined $char[$i];
1021              
1022             # open character class [...]
1023 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
1024 0         0 my $left = $i;
1025              
1026             # [] make die "unmatched [] in regexp ...\n"
1027              
1028 0 0       0 if ($char[$i+1] eq ']') {
1029 0         0 $i++;
1030             }
1031              
1032 0         0 while (1) {
1033 0 0       0 if (++$i > $#char) {
1034 0         0 croak "Unmatched [] in regexp";
1035             }
1036 0 0       0 if ($char[$i] eq ']') {
1037 0         0 my $right = $i;
1038 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
1039              
1040             # escape character
1041 0         0 for my $char (@charlist) {
1042 0 0       0 if (0) {
1043             }
1044              
1045 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1046 0         0 $char = '\\' . $char;
1047             }
1048             }
1049              
1050             # [...]
1051 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
1052              
1053 0         0 $i = $left;
1054 0         0 last;
1055             }
1056             }
1057             }
1058              
1059             # open character class [^...]
1060             elsif ($char[$i] eq '[^') {
1061 0         0 my $left = $i;
1062              
1063             # [^] make die "unmatched [] in regexp ...\n"
1064              
1065 0 0       0 if ($char[$i+1] eq ']') {
1066 0         0 $i++;
1067             }
1068              
1069 0         0 while (1) {
1070 0 0       0 if (++$i > $#char) {
1071 0         0 croak "Unmatched [] in regexp";
1072             }
1073 0 0       0 if ($char[$i] eq ']') {
1074 0         0 my $right = $i;
1075 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
1076              
1077             # escape character
1078 0         0 for my $char (@charlist) {
1079 0 0       0 if (0) {
1080             }
1081              
1082 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1083 0         0 $char = '\\' . $char;
1084             }
1085             }
1086              
1087             # [^...]
1088 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
1089              
1090 0         0 $i = $left;
1091 0         0 last;
1092             }
1093             }
1094             }
1095              
1096             # rewrite classic character class or escape character
1097             elsif (my $char = classic_character_class($char[$i])) {
1098 0         0 $char[$i] = $char;
1099             }
1100              
1101             # with /i modifier
1102             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1103 0         0 my $uc = Ewindows1258::uc($char[$i]);
1104 0         0 my $fc = Ewindows1258::fc($char[$i]);
1105 0 0       0 if ($uc ne $fc) {
1106 0 0       0 if (CORE::length($fc) == 1) {
1107 0         0 $char[$i] = '[' . $uc . $fc . ']';
1108             }
1109             else {
1110 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
1111             }
1112             }
1113             }
1114             }
1115              
1116             # characterize
1117 0         0 for (my $i=0; $i <= $#char; $i++) {
1118 0 0       0 next if not defined $char[$i];
1119              
1120 0 0       0 if (0) {
1121             }
1122              
1123             # quote character before ? + * {
1124 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
1125 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
1126 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
1127             }
1128             }
1129             }
1130              
1131 0         0 $string = join '', @char;
1132             }
1133              
1134             # make regexp string
1135 0         0 return @string;
1136             }
1137              
1138             #
1139             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
1140             #
1141             sub Ewindows1258::classic_character_class {
1142 0     1867 0 0 my($char) = @_;
1143              
1144             return {
1145             '\D' => '${Ewindows1258::eD}',
1146             '\S' => '${Ewindows1258::eS}',
1147             '\W' => '${Ewindows1258::eW}',
1148             '\d' => '[0-9]',
1149              
1150             # Before Perl 5.6, \s only matched the five whitespace characters
1151             # tab, newline, form-feed, carriage return, and the space character
1152             # itself, which, taken together, is the character class [\t\n\f\r ].
1153              
1154             # Vertical tabs are now whitespace
1155             # \s in a regex now matches a vertical tab in all circumstances.
1156             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1157             # \t \n \v \f \r space
1158             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1159             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1160             '\s' => '\s',
1161              
1162             '\w' => '[0-9A-Z_a-z]',
1163             '\C' => '[\x00-\xFF]',
1164             '\X' => 'X',
1165              
1166             # \h \v \H \V
1167              
1168             # P.114 Character Class Shortcuts
1169             # in Chapter 7: In the World of Regular Expressions
1170             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
1171              
1172             # P.357 13.2.3 Whitespace
1173             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
1174             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1175             #
1176             # 0x00009 CHARACTER TABULATION h s
1177             # 0x0000a LINE FEED (LF) vs
1178             # 0x0000b LINE TABULATION v
1179             # 0x0000c FORM FEED (FF) vs
1180             # 0x0000d CARRIAGE RETURN (CR) vs
1181             # 0x00020 SPACE h s
1182              
1183             # P.196 Table 5-9. Alphanumeric regex metasymbols
1184             # in Chapter 5. Pattern Matching
1185             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1186              
1187             # (and so on)
1188              
1189             '\H' => '${Ewindows1258::eH}',
1190             '\V' => '${Ewindows1258::eV}',
1191             '\h' => '[\x09\x20]',
1192             '\v' => '[\x0A\x0B\x0C\x0D]',
1193             '\R' => '${Ewindows1258::eR}',
1194              
1195             # \N
1196             #
1197             # http://perldoc.perl.org/perlre.html
1198             # Character Classes and other Special Escapes
1199             # Any character but \n (experimental). Not affected by /s modifier
1200              
1201             '\N' => '${Ewindows1258::eN}',
1202              
1203             # \b \B
1204              
1205             # P.180 Boundaries: The \b and \B Assertions
1206             # in Chapter 5: Pattern Matching
1207             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1208              
1209             # P.219 Boundaries: The \b and \B Assertions
1210             # in Chapter 5: Pattern Matching
1211             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1212              
1213             # \b really means (?:(?<=\w)(?!\w)|(?
1214             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
1215             '\b' => '${Ewindows1258::eb}',
1216              
1217             # \B really means (?:(?<=\w)(?=\w)|(?
1218             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
1219             '\B' => '${Ewindows1258::eB}',
1220              
1221 1867   100     2942 }->{$char} || '';
1222             }
1223              
1224             #
1225             # prepare Windows-1258 characters per length
1226             #
1227              
1228             # 1 octet characters
1229             my @chars1 = ();
1230             sub chars1 {
1231 1867 0   0 0 78146 if (@chars1) {
1232 0         0 return @chars1;
1233             }
1234 0 0       0 if (exists $range_tr{1}) {
1235 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
1236 0         0 while (my @range = splice(@ranges,0,1)) {
1237 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1238 0         0 push @chars1, pack 'C', $oct0;
1239             }
1240             }
1241             }
1242 0         0 return @chars1;
1243             }
1244              
1245             # 2 octets characters
1246             my @chars2 = ();
1247             sub chars2 {
1248 0 0   0 0 0 if (@chars2) {
1249 0         0 return @chars2;
1250             }
1251 0 0       0 if (exists $range_tr{2}) {
1252 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
1253 0         0 while (my @range = splice(@ranges,0,2)) {
1254 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1255 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1256 0         0 push @chars2, pack 'CC', $oct0,$oct1;
1257             }
1258             }
1259             }
1260             }
1261 0         0 return @chars2;
1262             }
1263              
1264             # 3 octets characters
1265             my @chars3 = ();
1266             sub chars3 {
1267 0 0   0 0 0 if (@chars3) {
1268 0         0 return @chars3;
1269             }
1270 0 0       0 if (exists $range_tr{3}) {
1271 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
1272 0         0 while (my @range = splice(@ranges,0,3)) {
1273 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1274 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1275 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1276 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
1277             }
1278             }
1279             }
1280             }
1281             }
1282 0         0 return @chars3;
1283             }
1284              
1285             # 4 octets characters
1286             my @chars4 = ();
1287             sub chars4 {
1288 0 0   0 0 0 if (@chars4) {
1289 0         0 return @chars4;
1290             }
1291 0 0       0 if (exists $range_tr{4}) {
1292 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
1293 0         0 while (my @range = splice(@ranges,0,4)) {
1294 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1295 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1296 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1297 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
1298 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
1299             }
1300             }
1301             }
1302             }
1303             }
1304             }
1305 0         0 return @chars4;
1306             }
1307              
1308             #
1309             # Windows-1258 open character list for tr
1310             #
1311             sub _charlist_tr {
1312              
1313 0     0   0 local $_ = shift @_;
1314              
1315             # unescape character
1316 0         0 my @char = ();
1317 0         0 while (not /\G \z/oxmsgc) {
1318 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
1319 0         0 push @char, '\-';
1320             }
1321             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
1322 0         0 push @char, CORE::chr(oct $1);
1323             }
1324             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
1325 0         0 push @char, CORE::chr(hex $1);
1326             }
1327             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
1328 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
1329             }
1330             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
1331             push @char, {
1332             '\0' => "\0",
1333             '\n' => "\n",
1334             '\r' => "\r",
1335             '\t' => "\t",
1336             '\f' => "\f",
1337             '\b' => "\x08", # \b means backspace in character class
1338             '\a' => "\a",
1339             '\e' => "\e",
1340 0         0 }->{$1};
1341             }
1342             elsif (/\G \\ ($q_char) /oxmsgc) {
1343 0         0 push @char, $1;
1344             }
1345             elsif (/\G ($q_char) /oxmsgc) {
1346 0         0 push @char, $1;
1347             }
1348             }
1349              
1350             # join separated multiple-octet
1351 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
1352              
1353             # unescape '-'
1354 0         0 my @i = ();
1355 0         0 for my $i (0 .. $#char) {
1356 0 0       0 if ($char[$i] eq '\-') {
    0          
1357 0         0 $char[$i] = '-';
1358             }
1359             elsif ($char[$i] eq '-') {
1360 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
1361 0         0 push @i, $i;
1362             }
1363             }
1364             }
1365              
1366             # open character list (reverse for splice)
1367 0         0 for my $i (CORE::reverse @i) {
1368 0         0 my @range = ();
1369              
1370             # range error
1371 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
1372 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1373             }
1374              
1375             # range of multiple-octet code
1376 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
1377 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
1378 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
1379             }
1380             elsif (CORE::length($char[$i+1]) == 2) {
1381 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1382 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
1383             }
1384             elsif (CORE::length($char[$i+1]) == 3) {
1385 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1386 0         0 push @range, chars2();
1387 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1388             }
1389             elsif (CORE::length($char[$i+1]) == 4) {
1390 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1391 0         0 push @range, chars2();
1392 0         0 push @range, chars3();
1393 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1394             }
1395             else {
1396 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1397             }
1398             }
1399             elsif (CORE::length($char[$i-1]) == 2) {
1400 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
1401 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
1402             }
1403             elsif (CORE::length($char[$i+1]) == 3) {
1404 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1405 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1406             }
1407             elsif (CORE::length($char[$i+1]) == 4) {
1408 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1409 0         0 push @range, chars3();
1410 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1411             }
1412             else {
1413 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1414             }
1415             }
1416             elsif (CORE::length($char[$i-1]) == 3) {
1417 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
1418 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
1419             }
1420             elsif (CORE::length($char[$i+1]) == 4) {
1421 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
1422 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1423             }
1424             else {
1425 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1426             }
1427             }
1428             elsif (CORE::length($char[$i-1]) == 4) {
1429 0 0       0 if (CORE::length($char[$i+1]) == 4) {
1430 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
1431             }
1432             else {
1433 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1434             }
1435             }
1436             else {
1437 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1438             }
1439              
1440 0         0 splice @char, $i-1, 3, @range;
1441             }
1442              
1443 0         0 return @char;
1444             }
1445              
1446             #
1447             # Windows-1258 open character class
1448             #
1449             sub _cc {
1450 0 0   0   0 if (scalar(@_) == 0) {
    0          
    0          
1451 0         0 die __FILE__, ": subroutine cc got no parameter.\n";
1452             }
1453             elsif (scalar(@_) == 1) {
1454 0         0 return sprintf('\x%02X',$_[0]);
1455             }
1456             elsif (scalar(@_) == 2) {
1457 0 0       0 if ($_[0] > $_[1]) {
    0          
    0          
1458 0         0 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
1459             }
1460             elsif ($_[0] == $_[1]) {
1461 0         0 return sprintf('\x%02X',$_[0]);
1462             }
1463             elsif (($_[0]+1) == $_[1]) {
1464 0         0 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
1465             }
1466             else {
1467 0         0 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
1468             }
1469             }
1470             else {
1471 0         0 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
1472             }
1473             }
1474              
1475             #
1476             # Windows-1258 octet range
1477             #
1478             sub _octets {
1479 0     182   0 my $length = shift @_;
1480              
1481 182 50       496 if ($length == 1) {
1482 182         557 my($a1) = unpack 'C', $_[0];
1483 182         588 my($z1) = unpack 'C', $_[1];
1484              
1485 182 50       334 if ($a1 > $z1) {
1486 182         417 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
1487             }
1488              
1489 0 50       0 if ($a1 == $z1) {
    50          
1490 182         562 return sprintf('\x%02X',$a1);
1491             }
1492             elsif (($a1+1) == $z1) {
1493 0         0 return sprintf('\x%02X\x%02X',$a1,$z1);
1494             }
1495             else {
1496 0         0 return sprintf('\x%02X-\x%02X',$a1,$z1);
1497             }
1498             }
1499             else {
1500 182         1254 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
1501             }
1502             }
1503              
1504             #
1505             # Windows-1258 range regexp
1506             #
1507             sub _range_regexp {
1508 0     182   0 my($length,$first,$last) = @_;
1509              
1510 182         390 my @range_regexp = ();
1511 182 50       329 if (not exists $range_tr{$length}) {
1512 182         439 return @range_regexp;
1513             }
1514              
1515 0         0 my @ranges = @{ $range_tr{$length} };
  182         270  
1516 182         614 while (my @range = splice(@ranges,0,$length)) {
1517 182         1325 my $min = '';
1518 182         313 my $max = '';
1519 182         234 for (my $i=0; $i < $length; $i++) {
1520 182         527 $min .= pack 'C', $range[$i][0];
1521 182         851 $max .= pack 'C', $range[$i][-1];
1522             }
1523              
1524             # min___max
1525             # FIRST_____________LAST
1526             # (nothing)
1527              
1528 182 50 33     472 if ($max lt $first) {
    50 33        
    50 33        
    50 33        
    50 33        
    0 0        
    0 0        
1529             }
1530              
1531             # **********
1532             # min_________max
1533             # FIRST_____________LAST
1534             # **********
1535              
1536             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
1537 182         2175 push @range_regexp, _octets($length,$first,$max,$min,$max);
1538             }
1539              
1540             # **********************
1541             # min________________max
1542             # FIRST_____________LAST
1543             # **********************
1544              
1545             elsif (($min eq $first) and ($max eq $last)) {
1546 0         0 push @range_regexp, _octets($length,$first,$last,$min,$max);
1547             }
1548              
1549             # *********
1550             # min___max
1551             # FIRST_____________LAST
1552             # *********
1553              
1554             elsif (($first le $min) and ($max le $last)) {
1555 0         0 push @range_regexp, _octets($length,$min,$max,$min,$max);
1556             }
1557              
1558             # **********************
1559             # min__________________________max
1560             # FIRST_____________LAST
1561             # **********************
1562              
1563             elsif (($min le $first) and ($last le $max)) {
1564 0         0 push @range_regexp, _octets($length,$first,$last,$min,$max);
1565             }
1566              
1567             # *********
1568             # min________max
1569             # FIRST_____________LAST
1570             # *********
1571              
1572             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
1573 182         514 push @range_regexp, _octets($length,$min,$last,$min,$max);
1574             }
1575              
1576             # min___max
1577             # FIRST_____________LAST
1578             # (nothing)
1579              
1580             elsif ($last lt $min) {
1581             }
1582              
1583             else {
1584 0         0 die __FILE__, ": subroutine _range_regexp panic.\n";
1585             }
1586             }
1587              
1588 0         0 return @range_regexp;
1589             }
1590              
1591             #
1592             # Windows-1258 open character list for qr and not qr
1593             #
1594             sub _charlist {
1595              
1596 182     358   431 my $modifier = pop @_;
1597 358         615 my @char = @_;
1598              
1599 358 100       884 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
1600              
1601             # unescape character
1602 358         879 for (my $i=0; $i <= $#char; $i++) {
1603              
1604             # escape - to ...
1605 358 100 100     1324 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
1606 1125 100 100     9038 if ((0 < $i) and ($i < $#char)) {
1607 206         820 $char[$i] = '...';
1608             }
1609             }
1610              
1611             # octal escape sequence
1612             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
1613 182         397 $char[$i] = octchr($1);
1614             }
1615              
1616             # hexadecimal escape sequence
1617             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
1618 0         0 $char[$i] = hexchr($1);
1619             }
1620              
1621             # \b{...} --> b\{...}
1622             # \B{...} --> B\{...}
1623             # \N{CHARNAME} --> N\{CHARNAME}
1624             # \p{PROPERTY} --> p\{PROPERTY}
1625             # \P{PROPERTY} --> P\{PROPERTY}
1626             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
1627 0         0 $char[$i] = $1 . '\\' . $2;
1628             }
1629              
1630             # \p, \P, \X --> p, P, X
1631             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
1632 0         0 $char[$i] = $1;
1633             }
1634              
1635             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
1636 0         0 $char[$i] = CORE::chr oct $1;
1637             }
1638             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
1639 0         0 $char[$i] = CORE::chr hex $1;
1640             }
1641             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
1642 22         118 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
1643             }
1644             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
1645             $char[$i] = {
1646             '\0' => "\0",
1647             '\n' => "\n",
1648             '\r' => "\r",
1649             '\t' => "\t",
1650             '\f' => "\f",
1651             '\b' => "\x08", # \b means backspace in character class
1652             '\a' => "\a",
1653             '\e' => "\e",
1654             '\d' => '[0-9]',
1655              
1656             # Vertical tabs are now whitespace
1657             # \s in a regex now matches a vertical tab in all circumstances.
1658             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1659             # \t \n \v \f \r space
1660             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1661             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1662             '\s' => '\s',
1663              
1664             '\w' => '[0-9A-Z_a-z]',
1665             '\D' => '${Ewindows1258::eD}',
1666             '\S' => '${Ewindows1258::eS}',
1667             '\W' => '${Ewindows1258::eW}',
1668              
1669             '\H' => '${Ewindows1258::eH}',
1670             '\V' => '${Ewindows1258::eV}',
1671             '\h' => '[\x09\x20]',
1672             '\v' => '[\x0A\x0B\x0C\x0D]',
1673             '\R' => '${Ewindows1258::eR}',
1674              
1675 0         0 }->{$1};
1676             }
1677              
1678             # POSIX-style character classes
1679             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
1680             $char[$i] = {
1681              
1682             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
1683             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
1684             '[:^lower:]' => '${Ewindows1258::not_lower_i}',
1685             '[:^upper:]' => '${Ewindows1258::not_upper_i}',
1686              
1687 25         409 }->{$1};
1688             }
1689             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
1690             $char[$i] = {
1691              
1692             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
1693             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
1694             '[:ascii:]' => '[\x00-\x7F]',
1695             '[:blank:]' => '[\x09\x20]',
1696             '[:cntrl:]' => '[\x00-\x1F\x7F]',
1697             '[:digit:]' => '[\x30-\x39]',
1698             '[:graph:]' => '[\x21-\x7F]',
1699             '[:lower:]' => '[\x61-\x7A]',
1700             '[:print:]' => '[\x20-\x7F]',
1701             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
1702              
1703             # P.174 POSIX-Style Character Classes
1704             # in Chapter 5: Pattern Matching
1705             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1706              
1707             # P.311 11.2.4 Character Classes and other Special Escapes
1708             # in Chapter 11: perlre: Perl regular expressions
1709             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1710              
1711             # P.210 POSIX-Style Character Classes
1712             # in Chapter 5: Pattern Matching
1713             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1714              
1715             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
1716              
1717             '[:upper:]' => '[\x41-\x5A]',
1718             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
1719             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
1720             '[:^alnum:]' => '${Ewindows1258::not_alnum}',
1721             '[:^alpha:]' => '${Ewindows1258::not_alpha}',
1722             '[:^ascii:]' => '${Ewindows1258::not_ascii}',
1723             '[:^blank:]' => '${Ewindows1258::not_blank}',
1724             '[:^cntrl:]' => '${Ewindows1258::not_cntrl}',
1725             '[:^digit:]' => '${Ewindows1258::not_digit}',
1726             '[:^graph:]' => '${Ewindows1258::not_graph}',
1727             '[:^lower:]' => '${Ewindows1258::not_lower}',
1728             '[:^print:]' => '${Ewindows1258::not_print}',
1729             '[:^punct:]' => '${Ewindows1258::not_punct}',
1730             '[:^space:]' => '${Ewindows1258::not_space}',
1731             '[:^upper:]' => '${Ewindows1258::not_upper}',
1732             '[:^word:]' => '${Ewindows1258::not_word}',
1733             '[:^xdigit:]' => '${Ewindows1258::not_xdigit}',
1734              
1735 8         69 }->{$1};
1736             }
1737             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
1738 70         1266 $char[$i] = $1;
1739             }
1740             }
1741              
1742             # open character list
1743 7         32 my @singleoctet = ();
1744 358         720 my @multipleoctet = ();
1745 358         659 for (my $i=0; $i <= $#char; ) {
1746              
1747             # escaped -
1748 358 100 100     5622 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
1749 943         4307 $i += 1;
1750 182         245 next;
1751             }
1752              
1753             # make range regexp
1754             elsif ($char[$i] eq '...') {
1755              
1756             # range error
1757 182 50       433 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    50          
1758 182         854 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
1759             }
1760             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
1761 0 50       0 if ($char[$i-1] gt $char[$i+1]) {
1762 182         1237 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
1763             }
1764             }
1765              
1766             # make range regexp per length
1767 0         0 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
1768 182         648 my @regexp = ();
1769              
1770             # is first and last
1771 182 50 33     276 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    0 0        
    0          
    0          
1772 182         662 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
1773             }
1774              
1775             # is first
1776             elsif ($length == CORE::length($char[$i-1])) {
1777 182         516 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
1778             }
1779              
1780             # is inside in first and last
1781             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
1782 0         0 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
1783             }
1784              
1785             # is last
1786             elsif ($length == CORE::length($char[$i+1])) {
1787 0         0 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
1788             }
1789              
1790             else {
1791 0         0 die __FILE__, ": subroutine make_regexp panic.\n";
1792             }
1793              
1794 0 50       0 if ($length == 1) {
1795 182         432 push @singleoctet, @regexp;
1796             }
1797             else {
1798 182         483 push @multipleoctet, @regexp;
1799             }
1800             }
1801              
1802 0         0 $i += 2;
1803             }
1804              
1805             # with /i modifier
1806             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1807 182 100       860 if ($modifier =~ /i/oxms) {
1808 493         770 my $uc = Ewindows1258::uc($char[$i]);
1809 24         43 my $fc = Ewindows1258::fc($char[$i]);
1810 24 100       47 if ($uc ne $fc) {
1811 24 50       46 if (CORE::length($fc) == 1) {
1812 12         22 push @singleoctet, $uc, $fc;
1813             }
1814             else {
1815 12         23 push @singleoctet, $uc;
1816 0         0 push @multipleoctet, $fc;
1817             }
1818             }
1819             else {
1820 0         0 push @singleoctet, $char[$i];
1821             }
1822             }
1823             else {
1824 12         24 push @singleoctet, $char[$i];
1825             }
1826 469         868 $i += 1;
1827             }
1828              
1829             # single character of single octet code
1830             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
1831 493         2061 push @singleoctet, "\t", "\x20";
1832 0         0 $i += 1;
1833             }
1834             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
1835 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
1836 0         0 $i += 1;
1837             }
1838             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
1839 0         0 push @singleoctet, $char[$i];
1840 2         5 $i += 1;
1841             }
1842              
1843             # single character of multiple-octet code
1844             else {
1845 2         5 push @multipleoctet, $char[$i];
1846 84         172 $i += 1;
1847             }
1848             }
1849              
1850             # quote metachar
1851 84         169 for (@singleoctet) {
1852 358 50       723 if ($_ eq '...') {
    100          
    100          
    100          
    100          
1853 689         3694 $_ = '-';
1854             }
1855             elsif (/\A \n \z/oxms) {
1856 0         0 $_ = '\n';
1857             }
1858             elsif (/\A \r \z/oxms) {
1859 8         15 $_ = '\r';
1860             }
1861             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
1862 8         17 $_ = sprintf('\x%02X', CORE::ord $1);
1863             }
1864             elsif (/\A [\x00-\xFF] \z/oxms) {
1865 60         213 $_ = quotemeta $_;
1866             }
1867             }
1868              
1869             # return character list
1870 429         666 return \@singleoctet, \@multipleoctet;
1871             }
1872              
1873             #
1874             # Windows-1258 octal escape sequence
1875             #
1876             sub octchr {
1877 358     5 0 1316 my($octdigit) = @_;
1878              
1879 5         12 my @binary = ();
1880 5         9 for my $octal (split(//,$octdigit)) {
1881             push @binary, {
1882             '0' => '000',
1883             '1' => '001',
1884             '2' => '010',
1885             '3' => '011',
1886             '4' => '100',
1887             '5' => '101',
1888             '6' => '110',
1889             '7' => '111',
1890 5         27 }->{$octal};
1891             }
1892 50         188 my $binary = join '', @binary;
1893              
1894             my $octchr = {
1895             # 1234567
1896             1 => pack('B*', "0000000$binary"),
1897             2 => pack('B*', "000000$binary"),
1898             3 => pack('B*', "00000$binary"),
1899             4 => pack('B*', "0000$binary"),
1900             5 => pack('B*', "000$binary"),
1901             6 => pack('B*', "00$binary"),
1902             7 => pack('B*', "0$binary"),
1903             0 => pack('B*', "$binary"),
1904              
1905 5         14 }->{CORE::length($binary) % 8};
1906              
1907 5         59 return $octchr;
1908             }
1909              
1910             #
1911             # Windows-1258 hexadecimal escape sequence
1912             #
1913             sub hexchr {
1914 5     5 0 21 my($hexdigit) = @_;
1915              
1916             my $hexchr = {
1917             1 => pack('H*', "0$hexdigit"),
1918             0 => pack('H*', "$hexdigit"),
1919              
1920 5         14 }->{CORE::length($_[0]) % 2};
1921              
1922 5         44 return $hexchr;
1923             }
1924              
1925             #
1926             # Windows-1258 open character list for qr
1927             #
1928             sub charlist_qr {
1929              
1930 5     314 0 16 my $modifier = pop @_;
1931 314         765 my @char = @_;
1932              
1933 314         821 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
1934 314         1137 my @singleoctet = @$singleoctet;
1935 314         923 my @multipleoctet = @$multipleoctet;
1936              
1937             # return character list
1938 314 100       655 if (scalar(@singleoctet) >= 1) {
1939              
1940             # with /i modifier
1941 314 100       748 if ($modifier =~ m/i/oxms) {
1942 236         554 my %singleoctet_ignorecase = ();
1943 22         37 for (@singleoctet) {
1944 22   100     42 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
1945 46         217 for my $ord (hex($1) .. hex($2)) {
1946 46         234 my $char = CORE::chr($ord);
1947 66         150 my $uc = Ewindows1258::uc($char);
1948 66         153 my $fc = Ewindows1258::fc($char);
1949 66 100       113 if ($uc eq $fc) {
1950 66         131 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
1951             }
1952             else {
1953 12 50       95 if (CORE::length($fc) == 1) {
1954 54         82 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
1955 54         121 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
1956             }
1957             else {
1958 54         216 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
1959 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
1960             }
1961             }
1962             }
1963             }
1964 0 50       0 if ($_ ne '') {
1965 46         110 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
1966             }
1967             }
1968 0         0 my $i = 0;
1969 22         29 my @singleoctet_ignorecase = ();
1970 22         35 for my $ord (0 .. 255) {
1971 22 100       38 if (exists $singleoctet_ignorecase{$ord}) {
1972 5632         6871 push @{$singleoctet_ignorecase[$i]}, $ord;
  96         98  
1973             }
1974             else {
1975 96         258 $i++;
1976             }
1977             }
1978 5536         6128 @singleoctet = ();
1979 22         36 for my $range (@singleoctet_ignorecase) {
1980 22 100       66 if (ref $range) {
1981 3648 100       6172 if (scalar(@{$range}) == 1) {
  56 50       61  
1982 56         90 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  36         43  
1983             }
1984 36         131 elsif (scalar(@{$range}) == 2) {
1985 20         29 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
1986             }
1987             else {
1988 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  20         23  
  20         25  
1989             }
1990             }
1991             }
1992             }
1993              
1994 20         87 my $not_anchor = '';
1995              
1996 236         435 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
1997             }
1998 236 100       702 if (scalar(@multipleoctet) >= 2) {
1999 314         688 return '(?:' . join('|', @multipleoctet) . ')';
2000             }
2001             else {
2002 6         32 return $multipleoctet[0];
2003             }
2004             }
2005              
2006             #
2007             # Windows-1258 open character list for not qr
2008             #
2009             sub charlist_not_qr {
2010              
2011 308     44 0 1600 my $modifier = pop @_;
2012 44         106 my @char = @_;
2013              
2014 44         105 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2015 44         123 my @singleoctet = @$singleoctet;
2016 44         317 my @multipleoctet = @$multipleoctet;
2017              
2018             # with /i modifier
2019 44 100       72 if ($modifier =~ m/i/oxms) {
2020 44         113 my %singleoctet_ignorecase = ();
2021 10         45 for (@singleoctet) {
2022 10   66     18 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2023 10         54 for my $ord (hex($1) .. hex($2)) {
2024 10         44 my $char = CORE::chr($ord);
2025 30         50 my $uc = Ewindows1258::uc($char);
2026 30         56 my $fc = Ewindows1258::fc($char);
2027 30 50       59 if ($uc eq $fc) {
2028 30         56 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2029             }
2030             else {
2031 0 50       0 if (CORE::length($fc) == 1) {
2032 30         47 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2033 30         74 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2034             }
2035             else {
2036 30         140 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2037 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2038             }
2039             }
2040             }
2041             }
2042 0 50       0 if ($_ ne '') {
2043 10         43 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2044             }
2045             }
2046 0         0 my $i = 0;
2047 10         13 my @singleoctet_ignorecase = ();
2048 10         14 for my $ord (0 .. 255) {
2049 10 100       20 if (exists $singleoctet_ignorecase{$ord}) {
2050 2560         3165 push @{$singleoctet_ignorecase[$i]}, $ord;
  60         56  
2051             }
2052             else {
2053 60         107 $i++;
2054             }
2055             }
2056 2500         3097 @singleoctet = ();
2057 10         18 for my $range (@singleoctet_ignorecase) {
2058 10 100       30 if (ref $range) {
2059 960 50       1854 if (scalar(@{$range}) == 1) {
  20 50       21  
2060 20         122 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  0         0  
2061             }
2062 0         0 elsif (scalar(@{$range}) == 2) {
2063 20         32 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2064             }
2065             else {
2066 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  20         29  
  20         27  
2067             }
2068             }
2069             }
2070             }
2071              
2072             # return character list
2073 20 50       93 if (scalar(@multipleoctet) >= 1) {
2074 44 0       107 if (scalar(@singleoctet) >= 1) {
2075              
2076             # any character other than multiple-octet and single octet character class
2077 0         0 return '(?!' . join('|', @multipleoctet) . ')(?:[^' . join('', @singleoctet) . '])';
2078             }
2079             else {
2080              
2081             # any character other than multiple-octet character class
2082 0         0 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
2083             }
2084             }
2085             else {
2086 0 50       0 if (scalar(@singleoctet) >= 1) {
2087              
2088             # any character other than single octet character class
2089 44         395 return '(?:[^' . join('', @singleoctet) . '])';
2090             }
2091             else {
2092              
2093             # any character
2094 44         260 return "(?:$your_char)";
2095             }
2096             }
2097             }
2098              
2099             #
2100             # open file in read mode
2101             #
2102             sub _open_r {
2103 0     408   0 my(undef,$file) = @_;
2104 204     204   2147 use Fcntl qw(O_RDONLY);
  204         745  
  204         41839  
2105 408         1328 return CORE::sysopen($_[0], $file, &O_RDONLY);
2106             }
2107              
2108             #
2109             # open file in append mode
2110             #
2111             sub _open_a {
2112 408     204   17526 my(undef,$file) = @_;
2113 204     204   1524 use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
  204         656  
  204         670905  
2114 204         838 return CORE::sysopen($_[0], $file, &O_WRONLY|&O_APPEND|&O_CREAT);
2115             }
2116              
2117             #
2118             # safe system
2119             #
2120             sub _systemx {
2121              
2122             # P.707 29.2.33. exec
2123             # in Chapter 29: Functions
2124             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2125             #
2126             # Be aware that in older releases of Perl, exec (and system) did not flush
2127             # your output buffer, so you needed to enable command buffering by setting $|
2128             # on one or more filehandles to avoid lost output in the case of exec, or
2129             # misordererd output in the case of system. This situation was largely remedied
2130             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
2131              
2132             # P.855 exec
2133             # in Chapter 27: Functions
2134             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2135             #
2136             # In very old release of Perl (before v5.6), exec (and system) did not flush
2137             # your output buffer, so you needed to enable command buffering by setting $|
2138             # on one or more filehandles to avoid lost output with exec or misordered
2139             # output with system.
2140              
2141 204     204   24623 $| = 1;
2142              
2143             # P.565 23.1.2. Cleaning Up Your Environment
2144             # in Chapter 23: Security
2145             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2146              
2147             # P.656 Cleaning Up Your Environment
2148             # in Chapter 20: Security
2149             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2150              
2151             # local $ENV{'PATH'} = '.';
2152 204         699 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
2153              
2154             # P.707 29.2.33. exec
2155             # in Chapter 29: Functions
2156             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2157             #
2158             # As we mentioned earlier, exec treats a discrete list of arguments as an
2159             # indication that it should bypass shell processing. However, there is one
2160             # place where you might still get tripped up. The exec call (and system, too)
2161             # will not distinguish between a single scalar argument and an array containing
2162             # only one element.
2163             #
2164             # @args = ("echo surprise"); # just one element in list
2165             # exec @args # still subject to shell escapes
2166             # or die "exec: $!"; # because @args == 1
2167             #
2168             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
2169             # first argument as the pathname, which forces the rest of the arguments to be
2170             # interpreted as a list, even if there is only one of them:
2171             #
2172             # exec { $args[0] } @args # safe even with one-argument list
2173             # or die "can't exec @args: $!";
2174              
2175             # P.855 exec
2176             # in Chapter 27: Functions
2177             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2178             #
2179             # As we mentioned earlier, exec treats a discrete list of arguments as a
2180             # directive to bypass shell processing. However, there is one place where
2181             # you might still get tripped up. The exec call (and system, too) cannot
2182             # distinguish between a single scalar argument and an array containing
2183             # only one element.
2184             #
2185             # @args = ("echo surprise"); # just one element in list
2186             # exec @args # still subject to shell escapes
2187             # || die "exec: $!"; # because @args == 1
2188             #
2189             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
2190             # argument as the pathname, which forces the rest of the arguments to be
2191             # interpreted as a list, even if there is only one of them:
2192             #
2193             # exec { $args[0] } @args # safe even with one-argument list
2194             # || die "can't exec @args: $!";
2195              
2196 204         1937 return CORE::system { $_[0] } @_; # safe even with one-argument list
  204         451  
2197             }
2198              
2199             #
2200             # Windows-1258 order to character (with parameter)
2201             #
2202             sub Ewindows1258::chr(;$) {
2203              
2204 204 0   0 0 19650900 my $c = @_ ? $_[0] : $_;
2205              
2206 0 0       0 if ($c == 0x00) {
2207 0         0 return "\x00";
2208             }
2209             else {
2210 0         0 my @chr = ();
2211 0         0 while ($c > 0) {
2212 0         0 unshift @chr, ($c % 0x100);
2213 0         0 $c = int($c / 0x100);
2214             }
2215 0         0 return pack 'C*', @chr;
2216             }
2217             }
2218              
2219             #
2220             # Windows-1258 order to character (without parameter)
2221             #
2222             sub Ewindows1258::chr_() {
2223              
2224 0     0 0 0 my $c = $_;
2225              
2226 0 0       0 if ($c == 0x00) {
2227 0         0 return "\x00";
2228             }
2229             else {
2230 0         0 my @chr = ();
2231 0         0 while ($c > 0) {
2232 0         0 unshift @chr, ($c % 0x100);
2233 0         0 $c = int($c / 0x100);
2234             }
2235 0         0 return pack 'C*', @chr;
2236             }
2237             }
2238              
2239             #
2240             # Windows-1258 path globbing (with parameter)
2241             #
2242             sub Ewindows1258::glob($) {
2243              
2244 0 0   0 0 0 if (wantarray) {
2245 0         0 my @glob = _DOS_like_glob(@_);
2246 0         0 for my $glob (@glob) {
2247 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2248             }
2249 0         0 return @glob;
2250             }
2251             else {
2252 0         0 my $glob = _DOS_like_glob(@_);
2253 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2254 0         0 return $glob;
2255             }
2256             }
2257              
2258             #
2259             # Windows-1258 path globbing (without parameter)
2260             #
2261             sub Ewindows1258::glob_() {
2262              
2263 0 0   0 0 0 if (wantarray) {
2264 0         0 my @glob = _DOS_like_glob();
2265 0         0 for my $glob (@glob) {
2266 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2267             }
2268 0         0 return @glob;
2269             }
2270             else {
2271 0         0 my $glob = _DOS_like_glob();
2272 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2273 0         0 return $glob;
2274             }
2275             }
2276              
2277             #
2278             # Windows-1258 path globbing via File::DosGlob 1.10
2279             #
2280             # Often I confuse "_dosglob" and "_doglob".
2281             # So, I renamed "_dosglob" to "_DOS_like_glob".
2282             #
2283             my %iter;
2284             my %entries;
2285             sub _DOS_like_glob {
2286              
2287             # context (keyed by second cxix argument provided by core)
2288 0     0   0 my($expr,$cxix) = @_;
2289              
2290             # glob without args defaults to $_
2291 0 0       0 $expr = $_ if not defined $expr;
2292              
2293             # represents the current user's home directory
2294             #
2295             # 7.3. Expanding Tildes in Filenames
2296             # in Chapter 7. File Access
2297             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2298             #
2299             # and File::HomeDir, File::HomeDir::Windows module
2300              
2301             # DOS-like system
2302 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2303 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
  0         0  
2304             { my_home_MSWin32() }oxmse;
2305             }
2306              
2307             # UNIX-like system
2308 0 0 0     0 else {
  0         0  
2309             $expr =~ s{ \A ~ ( (?:[^/])* ) }
2310             { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
2311             }
2312 0 0       0  
2313 0 0       0 # assume global context if not provided one
2314             $cxix = '_G_' if not defined $cxix;
2315             $iter{$cxix} = 0 if not exists $iter{$cxix};
2316 0 0       0  
2317 0         0 # if we're just beginning, do it all first
2318             if ($iter{$cxix} == 0) {
2319             $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
2320             }
2321 0 0       0  
2322 0         0 # chuck it all out, quick or slow
2323 0         0 if (wantarray) {
  0         0  
2324             delete $iter{$cxix};
2325             return @{delete $entries{$cxix}};
2326 0 0       0 }
  0         0  
2327 0         0 else {
  0         0  
2328             if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
2329             return shift @{$entries{$cxix}};
2330             }
2331 0         0 else {
2332 0         0 # return undef for EOL
2333 0         0 delete $iter{$cxix};
2334             delete $entries{$cxix};
2335             return undef;
2336             }
2337             }
2338             }
2339              
2340             #
2341             # Windows-1258 path globbing subroutine
2342             #
2343 0     0   0 sub _do_glob {
2344 0         0  
2345 0         0 my($cond,@expr) = @_;
2346             my @glob = ();
2347             my $fix_drive_relative_paths = 0;
2348 0         0  
2349 0 0       0 OUTER:
2350 0 0       0 for my $expr (@expr) {
2351             next OUTER if not defined $expr;
2352 0         0 next OUTER if $expr eq '';
2353 0         0  
2354 0         0 my @matched = ();
2355 0         0 my @globdir = ();
2356 0         0 my $head = '.';
2357             my $pathsep = '/';
2358             my $tail;
2359 0 0       0  
2360 0         0 # if argument is within quotes strip em and do no globbing
2361 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
2362 0 0       0 $expr = $1;
2363 0         0 if ($cond eq 'd') {
2364             if (-d $expr) {
2365             push @glob, $expr;
2366             }
2367 0 0       0 }
2368 0         0 else {
2369             if (-e $expr) {
2370             push @glob, $expr;
2371 0         0 }
2372             }
2373             next OUTER;
2374             }
2375              
2376 0 0       0 # wildcards with a drive prefix such as h:*.pm must be changed
2377 0 0       0 # to h:./*.pm to expand correctly
2378 0         0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2379             if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^/\\]) #$1./$2#oxms) {
2380             $fix_drive_relative_paths = 1;
2381             }
2382 0 0       0 }
2383 0 0       0  
2384 0         0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
2385 0         0 if ($tail eq '') {
2386             push @glob, $expr;
2387 0 0       0 next OUTER;
2388 0 0       0 }
2389 0         0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
  0         0  
2390 0         0 if (@globdir = _do_glob('d', $head)) {
2391             push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
2392             next OUTER;
2393 0 0 0     0 }
2394 0         0 }
2395             if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
2396 0         0 $head .= $pathsep;
2397             }
2398             $expr = $tail;
2399             }
2400 0 0       0  
2401 0 0       0 # If file component has no wildcards, we can avoid opendir
2402 0         0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
2403             if ($head eq '.') {
2404 0 0 0     0 $head = '';
2405 0         0 }
2406             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2407 0         0 $head .= $pathsep;
2408 0 0       0 }
2409 0 0       0 $head .= $expr;
2410 0         0 if ($cond eq 'd') {
2411             if (-d $head) {
2412             push @glob, $head;
2413             }
2414 0 0       0 }
2415 0         0 else {
2416             if (-e $head) {
2417             push @glob, $head;
2418 0         0 }
2419             }
2420 0 0       0 next OUTER;
2421 0         0 }
2422 0         0 opendir(*DIR, $head) or next OUTER;
2423             my @leaf = readdir DIR;
2424 0 0       0 closedir DIR;
2425 0         0  
2426             if ($head eq '.') {
2427 0 0 0     0 $head = '';
2428 0         0 }
2429             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2430             $head .= $pathsep;
2431 0         0 }
2432 0         0  
2433 0         0 my $pattern = '';
2434             while ($expr =~ / \G ($q_char) /oxgc) {
2435             my $char = $1;
2436              
2437             # 6.9. Matching Shell Globs as Regular Expressions
2438             # in Chapter 6. Pattern Matching
2439             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2440 0 0       0 # (and so on)
    0          
    0          
2441 0         0  
2442             if ($char eq '*') {
2443             $pattern .= "(?:$your_char)*",
2444 0         0 }
2445             elsif ($char eq '?') {
2446             $pattern .= "(?:$your_char)?", # DOS style
2447             # $pattern .= "(?:$your_char)", # UNIX style
2448 0         0 }
2449             elsif ((my $fc = Ewindows1258::fc($char)) ne $char) {
2450             $pattern .= $fc;
2451 0         0 }
2452             else {
2453             $pattern .= quotemeta $char;
2454 0     0   0 }
  0         0  
2455             }
2456             my $matchsub = sub { Ewindows1258::fc($_[0]) =~ /\A $pattern \z/xms };
2457              
2458             # if ($@) {
2459             # print STDERR "$0: $@\n";
2460             # next OUTER;
2461             # }
2462 0         0  
2463 0 0 0     0 INNER:
2464 0         0 for my $leaf (@leaf) {
2465             if ($leaf eq '.' or $leaf eq '..') {
2466 0 0 0     0 next INNER;
2467 0         0 }
2468             if ($cond eq 'd' and not -d "$head$leaf") {
2469             next INNER;
2470 0 0       0 }
2471 0         0  
2472 0         0 if (&$matchsub($leaf)) {
2473             push @matched, "$head$leaf";
2474             next INNER;
2475             }
2476              
2477             # [DOS compatibility special case]
2478 0 0 0     0 # Failed, add a trailing dot and try again, but only...
      0        
2479              
2480             if (Ewindows1258::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
2481             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
2482 0 0       0 Ewindows1258::index($pattern,'\\.') != -1 # pattern has a dot.
2483 0         0 ) {
2484 0         0 if (&$matchsub("$leaf.")) {
2485             push @matched, "$head$leaf";
2486             next INNER;
2487             }
2488 0 0       0 }
2489 0         0 }
2490             if (@matched) {
2491             push @glob, @matched;
2492 0 0       0 }
2493 0         0 }
2494 0         0 if ($fix_drive_relative_paths) {
2495             for my $glob (@glob) {
2496             $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
2497 0         0 }
2498             }
2499             return @glob;
2500             }
2501              
2502             #
2503             # Windows-1258 parse line
2504             #
2505 0     0   0 sub _parse_line {
2506              
2507 0         0 my($line) = @_;
2508 0         0  
2509 0         0 $line .= ' ';
2510             my @piece = ();
2511             while ($line =~ /
2512             " ( (?>(?: [^"] )* ) ) " (?>\s+) |
2513             ( (?>(?: [^"\s] )* ) ) (?>\s+)
2514 0 0       0 /oxmsg
2515             ) {
2516 0         0 push @piece, defined($1) ? $1 : $2;
2517             }
2518             return @piece;
2519             }
2520              
2521             #
2522             # Windows-1258 parse path
2523             #
2524 0     0   0 sub _parse_path {
2525              
2526 0         0 my($path,$pathsep) = @_;
2527 0         0  
2528 0         0 $path .= '/';
2529             my @subpath = ();
2530             while ($path =~ /
2531             ((?: [^\/\\] )+?) [\/\\]
2532 0         0 /oxmsg
2533             ) {
2534             push @subpath, $1;
2535 0         0 }
2536 0         0  
2537 0         0 my $tail = pop @subpath;
2538             my $head = join $pathsep, @subpath;
2539             return $head, $tail;
2540             }
2541              
2542             #
2543             # via File::HomeDir::Windows 1.00
2544             #
2545             sub my_home_MSWin32 {
2546              
2547             # A lot of unix people and unix-derived tools rely on
2548 0 0 0 0 0 0 # the ability to overload HOME. We will support it too
    0 0        
    0 0        
      0        
      0        
2549 0         0 # so that they can replace raw HOME calls with File::HomeDir.
2550             if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
2551             return $ENV{'HOME'};
2552             }
2553              
2554 0         0 # Do we have a user profile?
2555             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
2556             return $ENV{'USERPROFILE'};
2557             }
2558              
2559 0         0 # Some Windows use something like $ENV{'HOME'}
2560             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
2561             return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
2562 0         0 }
2563              
2564             return undef;
2565             }
2566              
2567             #
2568             # via File::HomeDir::Unix 1.00
2569 0     0 0 0 #
2570             sub my_home {
2571 0 0 0     0 my $home;
    0 0        
2572 0         0  
2573             if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
2574             $home = $ENV{'HOME'};
2575             }
2576              
2577             # This is from the original code, but I'm guessing
2578 0         0 # it means "login directory" and exists on some Unixes.
2579             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
2580             $home = $ENV{'LOGDIR'};
2581             }
2582              
2583             ### More-desperate methods
2584              
2585 0         0 # Light desperation on any (Unixish) platform
2586             else {
2587             $home = CORE::eval q{ (getpwuid($<))[7] };
2588             }
2589              
2590 0 0 0     0 # On Unix in general, a non-existant home means "no home"
2591 0         0 # For example, "nobody"-like users might use /nonexistant
2592             if (defined $home and ! -d($home)) {
2593 0         0 $home = undef;
2594             }
2595             return $home;
2596             }
2597              
2598             #
2599             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
2600 0     0 0 0 #
2601             sub Ewindows1258::PREMATCH {
2602             return $`;
2603             }
2604              
2605             #
2606             # ${^MATCH}, $MATCH, $& the string that matched
2607 0     0 0 0 #
2608             sub Ewindows1258::MATCH {
2609             return $&;
2610             }
2611              
2612             #
2613             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
2614 0     0 0 0 #
2615             sub Ewindows1258::POSTMATCH {
2616             return $';
2617             }
2618              
2619             #
2620             # Windows-1258 character to order (with parameter)
2621             #
2622 0 0   0 1 0 sub Windows1258::ord(;$) {
2623              
2624 0 0       0 local $_ = shift if @_;
2625 0         0  
2626 0         0 if (/\A ($q_char) /oxms) {
2627 0         0 my @ord = unpack 'C*', $1;
2628 0         0 my $ord = 0;
2629             while (my $o = shift @ord) {
2630 0         0 $ord = $ord * 0x100 + $o;
2631             }
2632             return $ord;
2633 0         0 }
2634             else {
2635             return CORE::ord $_;
2636             }
2637             }
2638              
2639             #
2640             # Windows-1258 character to order (without parameter)
2641             #
2642 0 0   0 0 0 sub Windows1258::ord_() {
2643 0         0  
2644 0         0 if (/\A ($q_char) /oxms) {
2645 0         0 my @ord = unpack 'C*', $1;
2646 0         0 my $ord = 0;
2647             while (my $o = shift @ord) {
2648 0         0 $ord = $ord * 0x100 + $o;
2649             }
2650             return $ord;
2651 0         0 }
2652             else {
2653             return CORE::ord $_;
2654             }
2655             }
2656              
2657             #
2658             # Windows-1258 reverse
2659             #
2660 0 0   0 0 0 sub Windows1258::reverse(@) {
2661 0         0  
2662             if (wantarray) {
2663             return CORE::reverse @_;
2664             }
2665             else {
2666              
2667             # One of us once cornered Larry in an elevator and asked him what
2668             # problem he was solving with this, but he looked as far off into
2669             # the distance as he could in an elevator and said, "It seemed like
2670 0         0 # a good idea at the time."
2671              
2672             return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
2673             }
2674             }
2675              
2676             #
2677             # Windows-1258 getc (with parameter, without parameter)
2678             #
2679 0     0 0 0 sub Windows1258::getc(;*@) {
2680 0 0       0  
2681 0 0 0     0 my($package) = caller;
2682             my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
2683 0         0 croak 'Too many arguments for Windows1258::getc' if @_ and not wantarray;
  0         0  
2684 0         0  
2685 0         0 my @length = sort { $a <=> $b } keys %range_tr;
2686 0         0 my $getc = '';
2687 0 0       0 for my $length ($length[0] .. $length[-1]) {
2688 0 0       0 $getc .= CORE::getc($fh);
2689 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
2690             if ($getc =~ /\A ${Ewindows1258::dot_s} \z/oxms) {
2691             return wantarray ? ($getc,@_) : $getc;
2692             }
2693 0 0       0 }
2694             }
2695             return wantarray ? ($getc,@_) : $getc;
2696             }
2697              
2698             #
2699             # Windows-1258 length by character
2700             #
2701 0 0   0 1 0 sub Windows1258::length(;$) {
2702              
2703 0         0 local $_ = shift if @_;
2704 0         0  
2705             local @_ = /\G ($q_char) /oxmsg;
2706             return scalar @_;
2707             }
2708              
2709             #
2710             # Windows-1258 substr by character
2711             #
2712             BEGIN {
2713              
2714             # P.232 The lvalue Attribute
2715             # in Chapter 6: Subroutines
2716             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2717              
2718             # P.336 The lvalue Attribute
2719             # in Chapter 7: Subroutines
2720             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2721              
2722             # P.144 8.4 Lvalue subroutines
2723             # in Chapter 8: perlsub: Perl subroutines
2724 204 50 0 204 1 147425 # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
  0 0   0   0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
2725              
2726             CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
2727             # vv----------------------*******
2728             sub Windows1258::substr($$;$$) %s {
2729              
2730             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
2731              
2732             # If the substring is beyond either end of the string, substr() returns the undefined
2733             # value and produces a warning. When used as an lvalue, specifying a substring that
2734             # is entirely outside the string raises an exception.
2735             # http://perldoc.perl.org/functions/substr.html
2736              
2737             # A return with no argument returns the scalar value undef in scalar context,
2738             # an empty list () in list context, and (naturally) nothing at all in void
2739             # context.
2740              
2741             my $offset = $_[1];
2742             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
2743             return;
2744             }
2745              
2746             # substr($string,$offset,$length,$replacement)
2747             if (@_ == 4) {
2748             my(undef,undef,$length,$replacement) = @_;
2749             my $substr = join '', splice(@char, $offset, $length, $replacement);
2750             $_[0] = join '', @char;
2751              
2752             # return $substr; this doesn't work, don't say "return"
2753             $substr;
2754             }
2755              
2756             # substr($string,$offset,$length)
2757             elsif (@_ == 3) {
2758             my(undef,undef,$length) = @_;
2759             my $octet_offset = 0;
2760             my $octet_length = 0;
2761             if ($offset == 0) {
2762             $octet_offset = 0;
2763             }
2764             elsif ($offset > 0) {
2765             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
2766             }
2767             else {
2768             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
2769             }
2770             if ($length == 0) {
2771             $octet_length = 0;
2772             }
2773             elsif ($length > 0) {
2774             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
2775             }
2776             else {
2777             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
2778             }
2779             CORE::substr($_[0], $octet_offset, $octet_length);
2780             }
2781              
2782             # substr($string,$offset)
2783             else {
2784             my $octet_offset = 0;
2785             if ($offset == 0) {
2786             $octet_offset = 0;
2787             }
2788             elsif ($offset > 0) {
2789             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
2790             }
2791             else {
2792             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
2793             }
2794             CORE::substr($_[0], $octet_offset);
2795             }
2796             }
2797             END
2798             }
2799              
2800             #
2801             # Windows-1258 index by character
2802             #
2803 0     0 1 0 sub Windows1258::index($$;$) {
2804 0 0       0  
2805 0         0 my $index;
2806             if (@_ == 3) {
2807             $index = Ewindows1258::index($_[0], $_[1], CORE::length(Windows1258::substr($_[0], 0, $_[2])));
2808 0         0 }
2809             else {
2810             $index = Ewindows1258::index($_[0], $_[1]);
2811 0 0       0 }
2812 0         0  
2813             if ($index == -1) {
2814             return -1;
2815 0         0 }
2816             else {
2817             return Windows1258::length(CORE::substr $_[0], 0, $index);
2818             }
2819             }
2820              
2821             #
2822             # Windows-1258 rindex by character
2823             #
2824 0     0 1 0 sub Windows1258::rindex($$;$) {
2825 0 0       0  
2826 0         0 my $rindex;
2827             if (@_ == 3) {
2828             $rindex = Ewindows1258::rindex($_[0], $_[1], CORE::length(Windows1258::substr($_[0], 0, $_[2])));
2829 0         0 }
2830             else {
2831             $rindex = Ewindows1258::rindex($_[0], $_[1]);
2832 0 0       0 }
2833 0         0  
2834             if ($rindex == -1) {
2835             return -1;
2836 0         0 }
2837             else {
2838             return Windows1258::length(CORE::substr $_[0], 0, $rindex);
2839             }
2840             }
2841              
2842 204     204   1696 # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
  204         617  
  204         25490  
2843             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
2844             use vars qw($slash); $slash = 'm//';
2845              
2846             # ord() to ord() or Windows1258::ord()
2847             my $function_ord = 'ord';
2848              
2849             # ord to ord or Windows1258::ord_
2850             my $function_ord_ = 'ord';
2851              
2852             # reverse to reverse or Windows1258::reverse
2853             my $function_reverse = 'reverse';
2854              
2855             # getc to getc or Windows1258::getc
2856             my $function_getc = 'getc';
2857              
2858             # P.1023 Appendix W.9 Multibyte Anchoring
2859             # of ISBN 1-56592-224-7 CJKV Information Processing
2860              
2861 204     204   1574 my $anchor = '';
  204     0   396  
  204         10076066  
2862              
2863             use vars qw($nest);
2864              
2865             # regexp of nested parens in qqXX
2866              
2867             # P.340 Matching Nested Constructs with Embedded Code
2868             # in Chapter 7: Perl
2869             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
2870              
2871             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
2872             [^\\()] |
2873             \( (?{$nest++}) |
2874             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2875             \\ [^c] |
2876             \\c[\x40-\x5F] |
2877             [\x00-\xFF]
2878             }xms;
2879              
2880             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
2881             [^\\{}] |
2882             \{ (?{$nest++}) |
2883             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2884             \\ [^c] |
2885             \\c[\x40-\x5F] |
2886             [\x00-\xFF]
2887             }xms;
2888              
2889             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
2890             [^\\\[\]] |
2891             \[ (?{$nest++}) |
2892             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2893             \\ [^c] |
2894             \\c[\x40-\x5F] |
2895             [\x00-\xFF]
2896             }xms;
2897              
2898             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
2899             [^\\<>] |
2900             \< (?{$nest++}) |
2901             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2902             \\ [^c] |
2903             \\c[\x40-\x5F] |
2904             [\x00-\xFF]
2905             }xms;
2906              
2907             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
2908             (?: ::)? (?:
2909             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
2910             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
2911             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
2912             ))
2913             }xms;
2914              
2915             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
2916             (?: ::)? (?:
2917             (?>[0-9]+) |
2918             [^a-zA-Z_0-9\[\]] |
2919             ^[A-Z] |
2920             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
2921             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
2922             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
2923             ))
2924             }xms;
2925              
2926             my $qq_substr = qr{(?> Char::substr | Windows1258::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
2927             }xms;
2928              
2929             # regexp of nested parens in qXX
2930             my $q_paren = qr{(?{local $nest=0}) (?>(?:
2931             [^()] |
2932             \( (?{$nest++}) |
2933             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2934             [\x00-\xFF]
2935             }xms;
2936              
2937             my $q_brace = qr{(?{local $nest=0}) (?>(?:
2938             [^\{\}] |
2939             \{ (?{$nest++}) |
2940             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2941             [\x00-\xFF]
2942             }xms;
2943              
2944             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
2945             [^\[\]] |
2946             \[ (?{$nest++}) |
2947             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2948             [\x00-\xFF]
2949             }xms;
2950              
2951             my $q_angle = qr{(?{local $nest=0}) (?>(?:
2952             [^<>] |
2953             \< (?{$nest++}) |
2954             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2955             [\x00-\xFF]
2956             }xms;
2957              
2958             my $matched = '';
2959             my $s_matched = '';
2960              
2961             my $tr_variable = ''; # variable of tr///
2962             my $sub_variable = ''; # variable of s///
2963             my $bind_operator = ''; # =~ or !~
2964              
2965             my @heredoc = (); # here document
2966             my @heredoc_delimiter = ();
2967             my $here_script = ''; # here script
2968              
2969             #
2970             # escape Windows-1258 script
2971 0 50   204 0 0 #
2972             sub Windows1258::escape(;$) {
2973             local($_) = $_[0] if @_;
2974              
2975             # P.359 The Study Function
2976             # in Chapter 7: Perl
2977 204         656 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
2978              
2979             study $_; # Yes, I studied study yesterday.
2980              
2981             # while all script
2982              
2983             # 6.14. Matching from Where the Last Pattern Left Off
2984             # in Chapter 6. Pattern Matching
2985             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2986             # (and so on)
2987              
2988             # one member of Tag-team
2989             #
2990             # P.128 Start of match (or end of previous match): \G
2991             # P.130 Advanced Use of \G with Perl
2992             # in Chapter 3: Overview of Regular Expression Features and Flavors
2993             # P.255 Use leading anchors
2994             # P.256 Expose ^ and \G at the front expressions
2995             # in Chapter 6: Crafting an Efficient Expression
2996             # P.315 "Tag-team" matching with /gc
2997             # in Chapter 7: Perl
2998 204         476 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
2999 204         1466  
3000 204         775 my $e_script = '';
3001             while (not /\G \z/oxgc) { # member
3002             $e_script .= Windows1258::escape_token();
3003 75267         123392 }
3004              
3005             return $e_script;
3006             }
3007              
3008             #
3009             # escape Windows-1258 token of script
3010             #
3011             sub Windows1258::escape_token {
3012              
3013 204     75267 0 3143 # \n output here document
3014              
3015             my $ignore_modules = join('|', qw(
3016             utf8
3017             bytes
3018             charnames
3019             I18N::Japanese
3020             I18N::Collate
3021             I18N::JExt
3022             File::DosGlob
3023             Wild
3024             Wildcard
3025             Japanese
3026             ));
3027              
3028             # another member of Tag-team
3029             #
3030             # P.315 "Tag-team" matching with /gc
3031             # in Chapter 7: Perl
3032 75267 100 100     95105 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
    100 66        
    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          
    50          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    100          
    50          
    100          
    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          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    100          
    50          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    100          
    100          
    50          
3033 75267         3244856  
3034 12499 100       20762 if (/\G ( \n ) /oxgc) { # another member (and so on)
3035 12499         47270 my $heredoc = '';
3036             if (scalar(@heredoc_delimiter) >= 1) {
3037 174         244 $slash = 'm//';
3038 174         389  
3039             $heredoc = join '', @heredoc;
3040             @heredoc = ();
3041 174         318  
3042 174         332 # skip here document
3043             for my $heredoc_delimiter (@heredoc_delimiter) {
3044 174         1241 /\G .*? \n $heredoc_delimiter \n/xmsgc;
3045             }
3046 174         313 @heredoc_delimiter = ();
3047              
3048 174         265 $here_script = '';
3049             }
3050             return "\n" . $heredoc;
3051             }
3052 12499         59880  
3053             # ignore space, comment
3054             elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
3055              
3056             # if (, elsif (, unless (, while (, until (, given (, and when (
3057              
3058             # given, when
3059              
3060             # P.225 The given Statement
3061             # in Chapter 15: Smart Matching and given-when
3062             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3063              
3064             # P.133 The given Statement
3065             # in Chapter 4: Statements and Declarations
3066             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3067 17859         58181  
3068 1401         2291 elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
3069             $slash = 'm//';
3070             return $1;
3071             }
3072              
3073             # scalar variable ($scalar = ...) =~ tr///;
3074             # scalar variable ($scalar = ...) =~ s///;
3075              
3076             # state
3077              
3078             # P.68 Persistent, Private Variables
3079             # in Chapter 4: Subroutines
3080             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3081              
3082             # P.160 Persistent Lexically Scoped Variables: state
3083             # in Chapter 4: Statements and Declarations
3084             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3085              
3086             # (and so on)
3087 1401         4276  
3088             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
3089 86 50       205 my $e_string = e_string($1);
    50          
3090 86         3660  
3091 0         0 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3092 0         0 $tr_variable = $e_string . e_string($1);
3093 0         0 $bind_operator = $2;
3094             $slash = 'm//';
3095             return '';
3096 0         0 }
3097 0         0 elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3098 0         0 $sub_variable = $e_string . e_string($1);
3099 0         0 $bind_operator = $2;
3100             $slash = 'm//';
3101             return '';
3102 0         0 }
3103 86         164 else {
3104             $slash = 'div';
3105             return $e_string;
3106             }
3107             }
3108              
3109 86         305 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
3110 4         9 elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
3111             $slash = 'div';
3112             return q{Ewindows1258::PREMATCH()};
3113             }
3114              
3115 4         14 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
3116 28         54 elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
3117             $slash = 'div';
3118             return q{Ewindows1258::MATCH()};
3119             }
3120              
3121 28         276 # $', ${'} --> $', ${'}
3122 1         2 elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
3123             $slash = 'div';
3124             return $1;
3125             }
3126              
3127 1         4 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
3128 3         6 elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
3129             $slash = 'div';
3130             return q{Ewindows1258::POSTMATCH()};
3131             }
3132              
3133             # scalar variable $scalar =~ tr///;
3134             # scalar variable $scalar =~ s///;
3135             # substr() =~ tr///;
3136 3         11 # substr() =~ s///;
3137             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
3138 1671 100       3680 my $scalar = e_string($1);
    100          
3139 1671         7140  
3140 1         3 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3141 1         3 $tr_variable = $scalar;
3142 1         2 $bind_operator = $1;
3143             $slash = 'm//';
3144             return '';
3145 1         3 }
3146 61         134 elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3147 61         137 $sub_variable = $scalar;
3148 61         123 $bind_operator = $1;
3149             $slash = 'm//';
3150             return '';
3151 61         205 }
3152 1609         2712 else {
3153             $slash = 'div';
3154             return $scalar;
3155             }
3156             }
3157              
3158 1609         5498 # end of statement
3159             elsif (/\G ( [,;] ) /oxgc) {
3160             $slash = 'm//';
3161 4975         7797  
3162             # clear tr/// variable
3163             $tr_variable = '';
3164 4975         6690  
3165             # clear s/// variable
3166 4975         6189 $sub_variable = '';
3167              
3168 4975         5717 $bind_operator = '';
3169              
3170             return $1;
3171             }
3172              
3173 4975         17832 # bareword
3174             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
3175             return $1;
3176             }
3177              
3178 0         0 # $0 --> $0
3179 2         4 elsif (/\G ( \$ 0 ) /oxmsgc) {
3180             $slash = 'div';
3181             return $1;
3182 2         7 }
3183 0         0 elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
3184             $slash = 'div';
3185             return $1;
3186             }
3187              
3188 0         0 # $$ --> $$
3189 1         3 elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
3190             $slash = 'div';
3191             return $1;
3192             }
3193              
3194             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
3195 1         3 # $1, $2, $3 --> $1, $2, $3 otherwise
3196 4         5 elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
3197             $slash = 'div';
3198             return e_capture($1);
3199 4         9 }
3200 0         0 elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
3201             $slash = 'div';
3202             return e_capture($1);
3203             }
3204              
3205 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
3206 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
3207             $slash = 'div';
3208             return e_capture($1.'->'.$2);
3209             }
3210              
3211 0         0 # $$foo{ ... } --> $ $foo->{ ... }
3212 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
3213             $slash = 'div';
3214             return e_capture($1.'->'.$2);
3215             }
3216              
3217 0         0 # $$foo
3218 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
3219             $slash = 'div';
3220             return e_capture($1);
3221             }
3222              
3223 0         0 # ${ foo }
3224 0         0 elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
3225             $slash = 'div';
3226             return '${' . $1 . '}';
3227             }
3228              
3229 0         0 # ${ ... }
3230 0         0 elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
3231             $slash = 'div';
3232             return e_capture($1);
3233             }
3234              
3235             # variable or function
3236 0         0 # $ @ % & * $ #
3237 42         72 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) {
3238             $slash = 'div';
3239             return $1;
3240             }
3241             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
3242 42         139 # $ @ # \ ' " / ? ( ) [ ] < >
3243 62         114 elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
3244             $slash = 'div';
3245             return $1;
3246             }
3247              
3248 62         213 # while ()
3249             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
3250             return $1;
3251             }
3252              
3253             # while () --- glob
3254              
3255             # avoid "Error: Runtime exception" of perl version 5.005_03
3256 0         0  
3257             elsif (/\G \b while (?>\s*) \( (?>\s*) < ((?:[^>\0\a\e\f\n\r\t])+?) > (?>\s*) \) \b /oxgc) {
3258             return 'while ($_ = Ewindows1258::glob("' . $1 . '"))';
3259             }
3260              
3261 0         0 # while (glob)
3262             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
3263             return 'while ($_ = Ewindows1258::glob_)';
3264             }
3265              
3266 0         0 # while (glob(WILDCARD))
3267             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
3268             return 'while ($_ = Ewindows1258::glob';
3269             }
3270 0         0  
  248         977  
3271             # doit if, doit unless, doit while, doit until, doit for, doit when
3272             elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
3273 248         985  
  19         37  
3274 19         74 # subroutines of package Ewindows1258
  0         0  
3275 0         0 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  13         19  
3276 13         35 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
3277 0         0 elsif (/\G \b Windows1258::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  114         189  
3278 114         383 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  2         6  
3279 2         6 elsif (/\G \b Windows1258::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Windows1258::escape'; }
  0         0  
3280 0         0 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         4  
3281 2         6 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::chop'; }
  0         0  
3282 0         0 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  0         0  
3283 0         0 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  0         0  
3284 0         0 elsif (/\G \b Windows1258::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Windows1258::index'; }
  2         4  
3285 2         6 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::index'; }
  0         0  
3286 0         0 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  0         0  
3287 0         0 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  0         0  
3288 0         0 elsif (/\G \b Windows1258::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Windows1258::rindex'; }
  1         3  
3289 1         5 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::rindex'; }
  0         0  
3290 0         0 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lc'; }
  1         3  
3291 1         3 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lcfirst'; }
  0         0  
3292 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::uc'; }
  6         9  
3293             elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::ucfirst'; }
3294             elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::fc'; }
3295 6         17  
  0         0  
3296 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
3297 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
3298 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3299 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3300 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3301 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3302             elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
3303 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  
3304 0         0  
  0         0  
3305 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
3306 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3307 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3308 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3309 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3310             elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3311             elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3312 0         0  
  0         0  
3313 0         0 elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
3314 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
3315 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
3316             elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
3317 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  2         4  
3318 2         8  
  2         5  
3319 2         7 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  36         63  
3320 36         114 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         4  
3321 2         7 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::chr'; }
  8         17  
3322 8         22 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3323 0         0 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  0         0  
3324 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::glob'; }
  0         0  
3325 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lc_'; }
  0         0  
3326 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lcfirst_'; }
  0         0  
3327 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::uc_'; }
  0         0  
3328 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::ucfirst_'; }
  0         0  
3329             elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::fc_'; }
3330 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
3331 0         0  
  0         0  
3332 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
3333 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
3334 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::chr_'; }
  0         0  
3335 0         0 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3336 0         0 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  0         0  
3337 0         0 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::glob_'; }
  8         27  
3338             elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
3339             elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
3340 8         32 # split
3341             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
3342 87         182 $slash = 'm//';
3343 87         148  
3344 87         322 my $e = '';
3345             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
3346             $e .= $1;
3347             }
3348 85 100       471  
  87 100       6212  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
3349             # end of split
3350             if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Ewindows1258::split' . $e; }
3351 2         9  
3352             # split scalar value
3353             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Ewindows1258::split' . $e . e_string($1); }
3354 1         5  
3355 0         0 # split literal space
3356 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Ewindows1258::split' . $e . qq {qq$1 $2}; }
3357 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3358 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3359 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3360 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3361 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3362 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Ewindows1258::split' . $e . qq {q$1 $2}; }
3363 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3364 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3365 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3366 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3367 10         44 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3368             elsif (/\G ' [ ] ' /oxgc) { return 'Ewindows1258::split' . $e . qq {' '}; }
3369             elsif (/\G " [ ] " /oxgc) { return 'Ewindows1258::split' . $e . qq {" "}; }
3370              
3371 0 0       0 # split qq//
  0         0  
3372             elsif (/\G \b (qq) \b /oxgc) {
3373 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
3374 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3375 0         0 while (not /\G \z/oxgc) {
3376 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3377 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
3378 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
3379 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
3380 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
3381             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
3382 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
3383             }
3384             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3385             }
3386             }
3387              
3388 0 50       0 # split qr//
  12         414  
3389             elsif (/\G \b (qr) \b /oxgc) {
3390 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
3391 12 50       66 else {
  12 50       3286  
    50          
    50          
    50          
    50          
    50          
    50          
3392 0         0 while (not /\G \z/oxgc) {
3393 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3394 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
3395 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
3396 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
3397 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
3398 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
3399             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
3400 12         90 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
3401             }
3402             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3403             }
3404             }
3405              
3406 0 0       0 # split q//
  0         0  
3407             elsif (/\G \b (q) \b /oxgc) {
3408 0         0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
3409 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3410 0         0 while (not /\G \z/oxgc) {
3411 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3412 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
3413 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
3414 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
3415 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
3416             elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
3417 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
3418             }
3419             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3420             }
3421             }
3422              
3423 0 50       0 # split m//
  18         466  
3424             elsif (/\G \b (m) \b /oxgc) {
3425 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
3426 18 50       78 else {
  18 50       4154  
    50          
    50          
    50          
    50          
    50          
    50          
3427 0         0 while (not /\G \z/oxgc) {
3428 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3429 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
3430 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
3431 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
3432 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
3433 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
3434             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
3435 18         109 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
3436             }
3437             die __FILE__, ": Search pattern not terminated\n";
3438             }
3439             }
3440              
3441 0         0 # split ''
3442 0         0 elsif (/\G (\') /oxgc) {
3443 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
3444 0         0 while (not /\G \z/oxgc) {
3445 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3446 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
3447             elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
3448 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3449             }
3450             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3451             }
3452              
3453 0         0 # split ""
3454 0         0 elsif (/\G (\") /oxgc) {
3455 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3456 0         0 while (not /\G \z/oxgc) {
3457 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3458 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
3459             elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
3460 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
3461             }
3462             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3463             }
3464              
3465 0         0 # split //
3466 44         108 elsif (/\G (\/) /oxgc) {
3467 44 50       350 my $regexp = '';
  381 50       1667  
    100          
    50          
3468 0         0 while (not /\G \z/oxgc) {
3469 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
3470 44         205 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
3471             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
3472 337         960 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
3473             }
3474             die __FILE__, ": Search pattern not terminated\n";
3475             }
3476             }
3477              
3478             # tr/// or y///
3479              
3480             # about [cdsrbB]* (/B modifier)
3481             #
3482             # P.559 appendix C
3483             # of ISBN 4-89052-384-7 Programming perl
3484             # (Japanese title is: Perl puroguramingu)
3485 0         0  
3486             elsif (/\G \b ( tr | y ) \b /oxgc) {
3487             my $ope = $1;
3488 3 50       8  
3489 3         44 # $1 $2 $3 $4 $5 $6
3490 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
3491             my @tr = ($tr_variable,$2);
3492             return e_tr(@tr,'',$4,$6);
3493 0         0 }
3494 3         4 else {
3495 3 50       7 my $e = '';
  3 50       340  
    50          
    50          
    50          
    50          
3496             while (not /\G \z/oxgc) {
3497 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3498 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
3499 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3500 0         0 while (not /\G \z/oxgc) {
3501 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3502 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
3503 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
3504 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
3505             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
3506 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
3507             }
3508             die __FILE__, ": Transliteration replacement not terminated\n";
3509 0         0 }
3510 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
3511 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3512 0         0 while (not /\G \z/oxgc) {
3513 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3514 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
3515 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
3516 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
3517             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
3518 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
3519             }
3520             die __FILE__, ": Transliteration replacement not terminated\n";
3521 0         0 }
3522 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
3523 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3524 0         0 while (not /\G \z/oxgc) {
3525 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3526 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
3527 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
3528 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
3529             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
3530 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
3531             }
3532             die __FILE__, ": Transliteration replacement not terminated\n";
3533 0         0 }
3534 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
3535 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3536 0         0 while (not /\G \z/oxgc) {
3537 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3538 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
3539 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
3540 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
3541             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
3542 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
3543             }
3544             die __FILE__, ": Transliteration replacement not terminated\n";
3545             }
3546 0         0 # $1 $2 $3 $4 $5 $6
3547 3         14 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
3548             my @tr = ($tr_variable,$2);
3549             return e_tr(@tr,'',$4,$6);
3550 3         9 }
3551             }
3552             die __FILE__, ": Transliteration pattern not terminated\n";
3553             }
3554             }
3555              
3556 0         0 # qq//
3557             elsif (/\G \b (qq) \b /oxgc) {
3558             my $ope = $1;
3559 2180 50       5145  
3560 2180         4514 # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
3561 0         0 if (/\G (\#) /oxgc) { # qq# #
3562 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3563 0         0 while (not /\G \z/oxgc) {
3564 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3565 0         0 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
3566             elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
3567 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3568             }
3569             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3570             }
3571 0         0  
3572 2180         3118 else {
3573 2180 50       30732 my $e = '';
  2180 50       9817  
    100          
    50          
    50          
    0          
3574             while (not /\G \z/oxgc) {
3575             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3576              
3577 0         0 # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
3578 0         0 elsif (/\G (\() /oxgc) { # qq ( )
3579 0         0 my $qq_string = '';
3580 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3581 0         0 while (not /\G \z/oxgc) {
3582 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3583             elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
3584 0 0       0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3585 0         0 elsif (/\G (\)) /oxgc) {
3586             if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
3587 0         0 else { $qq_string .= $1; }
3588             }
3589 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3590             }
3591             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3592             }
3593              
3594 0         0 # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
3595 2150         3163 elsif (/\G (\{) /oxgc) { # qq { }
3596 2150         3112 my $qq_string = '';
3597 2150 100       4541 local $nest = 1;
  84071 50       282617  
    100          
    100          
    50          
3598 722         1423 while (not /\G \z/oxgc) {
3599 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  1153         1823  
3600             elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
3601 1153 100       2005 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  3303         5211  
3602 2150         4630 elsif (/\G (\}) /oxgc) {
3603             if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
3604 1153         2681 else { $qq_string .= $1; }
3605             }
3606 78893         161725 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3607             }
3608             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3609             }
3610              
3611 0         0 # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
3612 0         0 elsif (/\G (\[) /oxgc) { # qq [ ]
3613 0         0 my $qq_string = '';
3614 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3615 0         0 while (not /\G \z/oxgc) {
3616 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3617             elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
3618 0 0       0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3619 0         0 elsif (/\G (\]) /oxgc) {
3620             if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
3621 0         0 else { $qq_string .= $1; }
3622             }
3623 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3624             }
3625             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3626             }
3627              
3628 0         0 # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
3629 30         51 elsif (/\G (\<) /oxgc) { # qq < >
3630 30         54 my $qq_string = '';
3631 30 100       90 local $nest = 1;
  1166 50       3881  
    50          
    100          
    50          
3632 22         56 while (not /\G \z/oxgc) {
3633 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3634             elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
3635 0 50       0 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  30         71  
3636 30         87 elsif (/\G (\>) /oxgc) {
3637             if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
3638 0         0 else { $qq_string .= $1; }
3639             }
3640 1114         2157 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3641             }
3642             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3643             }
3644              
3645 0         0 # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
3646 0         0 elsif (/\G (\S) /oxgc) { # qq * *
3647 0         0 my $delimiter = $1;
3648 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3649 0         0 while (not /\G \z/oxgc) {
3650 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3651 0         0 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
3652             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
3653 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3654             }
3655             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3656 0         0 }
3657             }
3658             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3659             }
3660             }
3661              
3662 0         0 # qr//
3663 0 0       0 elsif (/\G \b (qr) \b /oxgc) {
3664 0         0 my $ope = $1;
3665             if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
3666             return e_qr($ope,$1,$3,$2,$4);
3667 0         0 }
3668 0         0 else {
3669 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
3670 0         0 while (not /\G \z/oxgc) {
3671 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3672 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
3673 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
3674 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
3675 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
3676 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
3677             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
3678 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
3679             }
3680             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3681             }
3682             }
3683              
3684 0         0 # qw//
3685 16 50       46 elsif (/\G \b (qw) \b /oxgc) {
3686 16         51 my $ope = $1;
3687             if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
3688             return e_qw($ope,$1,$3,$2);
3689 0         0 }
3690 16         31 else {
3691 16 50       56 my $e = '';
  16 50       116  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3692             while (not /\G \z/oxgc) {
3693 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3694 16         67  
3695             elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3696 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3697 0         0  
3698             elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3699 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3700 0         0  
3701             elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3702 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3703 0         0  
3704             elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
3705 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
3706 0         0  
3707             elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
3708 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
3709             }
3710             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3711             }
3712             }
3713              
3714 0         0 # qx//
3715 0 0       0 elsif (/\G \b (qx) \b /oxgc) {
3716 0         0 my $ope = $1;
3717             if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
3718             return e_qq($ope,$1,$3,$2);
3719 0         0 }
3720 0         0 else {
3721 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3722 0         0 while (not /\G \z/oxgc) {
3723 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3724 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
3725 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
3726 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
3727 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
3728             elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
3729 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
3730             }
3731             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3732             }
3733             }
3734              
3735 0         0 # q//
3736             elsif (/\G \b (q) \b /oxgc) {
3737             my $ope = $1;
3738              
3739             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
3740              
3741             # avoid "Error: Runtime exception" of perl version 5.005_03
3742 410 50       1133 # (and so on)
3743 410         1085  
3744 0         0 if (/\G (\#) /oxgc) { # q# #
3745 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
3746 0         0 while (not /\G \z/oxgc) {
3747 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3748 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
3749             elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
3750 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3751             }
3752             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3753             }
3754 0         0  
3755 410         698 else {
3756 410 50       1407 my $e = '';
  410 50       2264  
    100          
    50          
    100          
    50          
3757             while (not /\G \z/oxgc) {
3758             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3759              
3760 0         0 # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
3761 0         0 elsif (/\G (\() /oxgc) { # q ( )
3762 0         0 my $q_string = '';
3763 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
3764 0         0 while (not /\G \z/oxgc) {
3765 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3766 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
  0         0  
3767             elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
3768 0 0       0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  0         0  
3769 0         0 elsif (/\G (\)) /oxgc) {
3770             if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
3771 0         0 else { $q_string .= $1; }
3772             }
3773 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3774             }
3775             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3776             }
3777              
3778 0         0 # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
3779 404         716 elsif (/\G (\{) /oxgc) { # q { }
3780 404         807 my $q_string = '';
3781 404 50       1107 local $nest = 1;
  6835 50       25727  
    50          
    100          
    100          
    50          
3782 0         0 while (not /\G \z/oxgc) {
3783 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3784 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
  107         208  
3785             elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
3786 107 100       211 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  511         1303  
3787 404         1213 elsif (/\G (\}) /oxgc) {
3788             if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
3789 107         223 else { $q_string .= $1; }
3790             }
3791 6217         21360 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3792             }
3793             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3794             }
3795              
3796 0         0 # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
3797 0         0 elsif (/\G (\[) /oxgc) { # q [ ]
3798 0         0 my $q_string = '';
3799 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
3800 0         0 while (not /\G \z/oxgc) {
3801 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3802 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
  0         0  
3803             elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
3804 0 0       0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
3805 0         0 elsif (/\G (\]) /oxgc) {
3806             if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
3807 0         0 else { $q_string .= $1; }
3808             }
3809 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3810             }
3811             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3812             }
3813              
3814 0         0 # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
3815 5         10 elsif (/\G (\<) /oxgc) { # q < >
3816 5         11 my $q_string = '';
3817 5 50       18 local $nest = 1;
  88 50       365  
    50          
    50          
    100          
    50          
3818 0         0 while (not /\G \z/oxgc) {
3819 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3820 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
  0         0  
3821             elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
3822 0 50       0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  5         12  
3823 5         14 elsif (/\G (\>) /oxgc) {
3824             if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
3825 0         0 else { $q_string .= $1; }
3826             }
3827 83         159 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3828             }
3829             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3830             }
3831              
3832 0         0 # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
3833 1         2 elsif (/\G (\S) /oxgc) { # q * *
3834 1         2 my $delimiter = $1;
3835 1 50       4 my $q_string = '';
  14 50       68  
    100          
    50          
3836 0         0 while (not /\G \z/oxgc) {
3837 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3838 1         3 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
3839             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
3840 13         28 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3841             }
3842             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3843 0         0 }
3844             }
3845             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3846             }
3847             }
3848              
3849 0         0 # m//
3850 209 50       729 elsif (/\G \b (m) \b /oxgc) {
3851 209         1425 my $ope = $1;
3852             if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
3853             return e_qr($ope,$1,$3,$2,$4);
3854 0         0 }
3855 209         379 else {
3856 209 50       928 my $e = '';
  209 50       11283  
    50          
    50          
    50          
    50          
    100          
    50          
    50          
3857 0         0 while (not /\G \z/oxgc) {
3858 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3859 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
3860 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
3861 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
3862 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
3863 10         30 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
3864 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
3865             elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
3866 199         807 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
3867             }
3868             die __FILE__, ": Search pattern not terminated\n";
3869             }
3870             }
3871              
3872             # s///
3873              
3874             # about [cegimosxpradlunbB]* (/cg modifier)
3875             #
3876             # P.67 Pattern-Matching Operators
3877             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
3878 0         0  
3879             elsif (/\G \b (s) \b /oxgc) {
3880             my $ope = $1;
3881 97 100       297  
3882 97         1921 # $1 $2 $3 $4 $5 $6
3883             if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
3884             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3885 1         6 }
3886 96         213 else {
3887 96 50       337 my $e = '';
  96 50       14263  
    50          
    50          
    50          
    100          
    50          
    50          
    50          
3888             while (not /\G \z/oxgc) {
3889 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3890 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
3891 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3892             while (not /\G \z/oxgc) {
3893 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3894 0         0 # $1 $2 $3 $4
3895 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3896 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3897 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3898 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3899 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3900 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3901 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3902             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3903 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3904             }
3905             die __FILE__, ": Substitution replacement not terminated\n";
3906 0         0 }
3907 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
3908 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3909             while (not /\G \z/oxgc) {
3910 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3911 0         0 # $1 $2 $3 $4
3912 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3913 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3914 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3915 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3916 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3917 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3918 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3919             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3920 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3921             }
3922             die __FILE__, ": Substitution replacement not terminated\n";
3923 0         0 }
3924 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
3925 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
3926             while (not /\G \z/oxgc) {
3927 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3928 0         0 # $1 $2 $3 $4
3929 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3930 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3931 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3932 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3933 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3934             elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3935 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3936             }
3937             die __FILE__, ": Substitution replacement not terminated\n";
3938 0         0 }
3939 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
3940 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3941             while (not /\G \z/oxgc) {
3942 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3943 0         0 # $1 $2 $3 $4
3944 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3945 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3946 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3947 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3948 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3949 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3950 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3951             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3952 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3953             }
3954             die __FILE__, ": Substitution replacement not terminated\n";
3955             }
3956 0         0 # $1 $2 $3 $4 $5 $6
3957             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
3958             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3959             }
3960 21         61 # $1 $2 $3 $4 $5 $6
3961             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
3962             return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
3963             }
3964 0         0 # $1 $2 $3 $4 $5 $6
3965             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
3966             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3967             }
3968 0         0 # $1 $2 $3 $4 $5 $6
3969             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
3970             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3971 75         358 }
3972             }
3973             die __FILE__, ": Substitution pattern not terminated\n";
3974             }
3975             }
3976 0         0  
3977 0         0 # require ignore module
3978 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
3979             elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^#]) /oxmsgc) { return "# require$1\n$2"; }
3980             elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
3981 0         0  
3982 37         385 # use strict; --> use strict; no strict qw(refs);
3983 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
3984             elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
3985             elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
3986              
3987 0 50 33     0 # use 5.12.0; --> use 5.12.0; no strict qw(refs);
      33        
3988 2         22 elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
3989             if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
3990             return "use $1; no strict qw(refs);";
3991 0         0 }
3992             else {
3993             return "use $1;";
3994             }
3995 2 0 0     12 }
      0        
3996 0         0 elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
3997             if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
3998             return "use $1; no strict qw(refs);";
3999 0         0 }
4000             else {
4001             return "use $1;";
4002             }
4003             }
4004 0         0  
4005 2         14 # ignore use module
4006 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
4007             elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^#]) /oxmsgc) { return "# use$1\n$2"; }
4008             elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
4009 0         0  
4010 0         0 # ignore no module
4011 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
4012             elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^#]) /oxmsgc) { return "# no$1\n$2"; }
4013             elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
4014 0         0  
4015             # use else
4016             elsif (/\G \b use \b /oxmsgc) { return "use"; }
4017 0         0  
4018             # use else
4019             elsif (/\G \b no \b /oxmsgc) { return "no"; }
4020              
4021 2         7 # ''
4022 848         1845 elsif (/\G (?
4023 848 100       2516 my $q_string = '';
  8319 100       38227  
    100          
    50          
4024 4         11 while (not /\G \z/oxgc) {
4025 48         96 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4026 848         2151 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
4027             elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
4028 7419         21593 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4029             }
4030             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4031             }
4032              
4033 0         0 # ""
4034 1758         4147 elsif (/\G (\") /oxgc) {
4035 1758 100       4397 my $qq_string = '';
  35924 100       110502  
    100          
    50          
4036 67         152 while (not /\G \z/oxgc) {
4037 12         26 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
4038 1758         4020 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
4039             elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
4040 34087         92867 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
4041             }
4042             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4043             }
4044              
4045 0         0 # ``
4046 1         4 elsif (/\G (\`) /oxgc) {
4047 1 50       6 my $qx_string = '';
  19 50       76  
    100          
    50          
4048 0         0 while (not /\G \z/oxgc) {
4049 0         0 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
4050 1         5 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
4051             elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
4052 18         36 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
4053             }
4054             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4055             }
4056              
4057 0         0 # // --- not divide operator (num / num), not defined-or
4058 453         1589 elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
4059 453 50       1370 my $regexp = '';
  4496 50       20532  
    100          
    50          
4060 0         0 while (not /\G \z/oxgc) {
4061 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4062 453         1717 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
4063             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
4064 4043         9803 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4065             }
4066             die __FILE__, ": Search pattern not terminated\n";
4067             }
4068              
4069 0         0 # ?? --- not conditional operator (condition ? then : else)
4070 0         0 elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
4071 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
4072 0         0 while (not /\G \z/oxgc) {
4073 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4074 0         0 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
4075             elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
4076 0         0 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4077             }
4078             die __FILE__, ": Search pattern not terminated\n";
4079             }
4080 0         0  
  0         0  
4081             # <<>> (a safer ARGV)
4082             elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
4083 0         0  
  0         0  
4084             # << (bit shift) --- not here document
4085             elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
4086              
4087 0         0 # <<~'HEREDOC'
4088 6         10 elsif (/\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
4089 6         13 $slash = 'm//';
4090             my $here_quote = $1;
4091             my $delimiter = $2;
4092 6 50       9  
4093 6         12 # get here document
4094 6         20 if ($here_script eq '') {
4095             $here_script = CORE::substr $_, pos $_;
4096 6 50       28 $here_script =~ s/.*?\n//oxm;
4097 6         63 }
4098 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4099 6         8 my $heredoc = $1;
4100 6         48 my $indent = $2;
4101 6         15 $heredoc =~ s{^$indent}{}msg; # no /ox
4102             push @heredoc, $heredoc . qq{\n$delimiter\n};
4103             push @heredoc_delimiter, qq{\\s*$delimiter};
4104 6         13 }
4105             else {
4106 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4107             }
4108             return qq{<<'$delimiter'};
4109             }
4110              
4111             # <<~\HEREDOC
4112              
4113             # P.66 2.6.6. "Here" Documents
4114             # in Chapter 2: Bits and Pieces
4115             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4116              
4117             # P.73 "Here" Documents
4118             # in Chapter 2: Bits and Pieces
4119             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4120 6         25  
4121 3         7 elsif (/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
4122 3         6 $slash = 'm//';
4123             my $here_quote = $1;
4124             my $delimiter = $2;
4125 3 50       6  
4126 3         8 # get here document
4127 3         28 if ($here_script eq '') {
4128             $here_script = CORE::substr $_, pos $_;
4129 3 50       18 $here_script =~ s/.*?\n//oxm;
4130 3         46 }
4131 3         8 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4132 3         5 my $heredoc = $1;
4133 3         36 my $indent = $2;
4134 3         13 $heredoc =~ s{^$indent}{}msg; # no /ox
4135             push @heredoc, $heredoc . qq{\n$delimiter\n};
4136             push @heredoc_delimiter, qq{\\s*$delimiter};
4137 3         7 }
4138             else {
4139 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4140             }
4141             return qq{<<\\$delimiter};
4142             }
4143              
4144 3         12 # <<~"HEREDOC"
4145 6         10 elsif (/\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
4146 6         13 $slash = 'm//';
4147             my $here_quote = $1;
4148             my $delimiter = $2;
4149 6 50       8  
4150 6         13 # get here document
4151 6         29 if ($here_script eq '') {
4152             $here_script = CORE::substr $_, pos $_;
4153 6 50       27 $here_script =~ s/.*?\n//oxm;
4154 6         53 }
4155 6         14 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4156 6         11 my $heredoc = $1;
4157 6         51 my $indent = $2;
4158 6         16 $heredoc =~ s{^$indent}{}msg; # no /ox
4159             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4160             push @heredoc_delimiter, qq{\\s*$delimiter};
4161 6         13 }
4162             else {
4163 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4164             }
4165             return qq{<<"$delimiter"};
4166             }
4167              
4168 6         22 # <<~HEREDOC
4169 3         7 elsif (/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
4170 3         6 $slash = 'm//';
4171             my $here_quote = $1;
4172             my $delimiter = $2;
4173 3 50       6  
4174 3         7 # get here document
4175 3         29 if ($here_script eq '') {
4176             $here_script = CORE::substr $_, pos $_;
4177 3 50       18 $here_script =~ s/.*?\n//oxm;
4178 3         42 }
4179 3         10 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4180 3         5 my $heredoc = $1;
4181 3         36 my $indent = $2;
4182 3         10 $heredoc =~ s{^$indent}{}msg; # no /ox
4183             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4184             push @heredoc_delimiter, qq{\\s*$delimiter};
4185 3         10 }
4186             else {
4187 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4188             }
4189             return qq{<<$delimiter};
4190             }
4191              
4192 3         14 # <<~`HEREDOC`
4193 6         18 elsif (/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
4194 6         12 $slash = 'm//';
4195             my $here_quote = $1;
4196             my $delimiter = $2;
4197 6 50       12  
4198 6         12 # get here document
4199 6         28 if ($here_script eq '') {
4200             $here_script = CORE::substr $_, pos $_;
4201 6 50       31 $here_script =~ s/.*?\n//oxm;
4202 6         67 }
4203 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4204 6         8 my $heredoc = $1;
4205 6         49 my $indent = $2;
4206 6         18 $heredoc =~ s{^$indent}{}msg; # no /ox
4207             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4208             push @heredoc_delimiter, qq{\\s*$delimiter};
4209 6         18 }
4210             else {
4211 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4212             }
4213             return qq{<<`$delimiter`};
4214             }
4215              
4216 6         26 # <<'HEREDOC'
4217 72         132 elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4218 72         148 $slash = 'm//';
4219             my $here_quote = $1;
4220             my $delimiter = $2;
4221 72 50       120  
4222 72         140 # get here document
4223 72         367 if ($here_script eq '') {
4224             $here_script = CORE::substr $_, pos $_;
4225 72 50       470 $here_script =~ s/.*?\n//oxm;
4226 72         560 }
4227 72         233 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4228             push @heredoc, $1 . qq{\n$delimiter\n};
4229             push @heredoc_delimiter, $delimiter;
4230 72         113 }
4231             else {
4232 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4233             }
4234             return $here_quote;
4235             }
4236              
4237             # <<\HEREDOC
4238              
4239             # P.66 2.6.6. "Here" Documents
4240             # in Chapter 2: Bits and Pieces
4241             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4242              
4243             # P.73 "Here" Documents
4244             # in Chapter 2: Bits and Pieces
4245             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4246 72         265  
4247 0         0 elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
4248 0         0 $slash = 'm//';
4249             my $here_quote = $1;
4250             my $delimiter = $2;
4251 0 0       0  
4252 0         0 # get here document
4253 0         0 if ($here_script eq '') {
4254             $here_script = CORE::substr $_, pos $_;
4255 0 0       0 $here_script =~ s/.*?\n//oxm;
4256 0         0 }
4257 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4258             push @heredoc, $1 . qq{\n$delimiter\n};
4259             push @heredoc_delimiter, $delimiter;
4260 0         0 }
4261             else {
4262 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4263             }
4264             return $here_quote;
4265             }
4266              
4267 0         0 # <<"HEREDOC"
4268 36         86 elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
4269 36         81 $slash = 'm//';
4270             my $here_quote = $1;
4271             my $delimiter = $2;
4272 36 50       70  
4273 36         90 # get here document
4274 36         301 if ($here_script eq '') {
4275             $here_script = CORE::substr $_, pos $_;
4276 36 50       207 $here_script =~ s/.*?\n//oxm;
4277 36         482 }
4278 36         113 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4279             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4280             push @heredoc_delimiter, $delimiter;
4281 36         84 }
4282             else {
4283 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4284             }
4285             return $here_quote;
4286             }
4287              
4288 36         152 # <
4289 42         114 elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
4290 42         103 $slash = 'm//';
4291             my $here_quote = $1;
4292             my $delimiter = $2;
4293 42 50       88  
4294 42         117 # get here document
4295 42         420 if ($here_script eq '') {
4296             $here_script = CORE::substr $_, pos $_;
4297 42 50       338 $here_script =~ s/.*?\n//oxm;
4298 42         674 }
4299 42         164 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4300             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4301             push @heredoc_delimiter, $delimiter;
4302 42         104 }
4303             else {
4304 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4305             }
4306             return $here_quote;
4307             }
4308              
4309 42         185 # <<`HEREDOC`
4310 0         0 elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
4311 0         0 $slash = 'm//';
4312             my $here_quote = $1;
4313             my $delimiter = $2;
4314 0 0       0  
4315 0         0 # get here document
4316 0         0 if ($here_script eq '') {
4317             $here_script = CORE::substr $_, pos $_;
4318 0 0       0 $here_script =~ s/.*?\n//oxm;
4319 0         0 }
4320 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4321             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4322             push @heredoc_delimiter, $delimiter;
4323 0         0 }
4324             else {
4325 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4326             }
4327             return $here_quote;
4328             }
4329              
4330 0         0 # <<= <=> <= < operator
4331             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
4332             return $1;
4333             }
4334              
4335 12         66 #
4336             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
4337             return $1;
4338             }
4339              
4340             # --- glob
4341              
4342             # avoid "Error: Runtime exception" of perl version 5.005_03
4343 0         0  
4344             elsif (/\G < ((?:[^>\0\a\e\f\n\r\t])+?) > /oxgc) {
4345             return 'Ewindows1258::glob("' . $1 . '")';
4346             }
4347 0         0  
4348             # __DATA__
4349             elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
4350 0         0  
4351             # __END__
4352             elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
4353              
4354             # \cD Control-D
4355              
4356             # P.68 2.6.8. Other Literal Tokens
4357             # in Chapter 2: Bits and Pieces
4358             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4359              
4360             # P.76 Other Literal Tokens
4361             # in Chapter 2: Bits and Pieces
4362 204         1465 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4363              
4364             elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
4365 0         0  
4366             # \cZ Control-Z
4367             elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
4368              
4369             # any operator before div
4370             elsif (/\G (
4371             -- | \+\+ |
4372 0         0 [\)\}\]]
  5081         10535  
4373              
4374             ) /oxgc) { $slash = 'div'; return $1; }
4375              
4376             # yada-yada or triple-dot operator
4377             elsif (/\G (
4378 5081         28179 \.\.\.
  7         14  
4379              
4380             ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
4381              
4382             # any operator before m//
4383              
4384             # //, //= (defined-or)
4385              
4386             # P.164 Logical Operators
4387             # in Chapter 10: More Control Structures
4388             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4389              
4390             # P.119 C-Style Logical (Short-Circuit) Operators
4391             # in Chapter 3: Unary and Binary Operators
4392             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4393              
4394             # (and so on)
4395              
4396             # ~~
4397              
4398             # P.221 The Smart Match Operator
4399             # in Chapter 15: Smart Matching and given-when
4400             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4401              
4402             # P.112 Smartmatch Operator
4403             # in Chapter 3: Unary and Binary Operators
4404             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4405              
4406             # (and so on)
4407              
4408             elsif (/\G ((?>
4409              
4410             !~~ | !~ | != | ! |
4411             %= | % |
4412             &&= | && | &= | &\.= | &\. | & |
4413             -= | -> | - |
4414             :(?>\s*)= |
4415             : |
4416             <<>> |
4417             <<= | <=> | <= | < |
4418             == | => | =~ | = |
4419             >>= | >> | >= | > |
4420             \*\*= | \*\* | \*= | \* |
4421             \+= | \+ |
4422             \.\. | \.= | \. |
4423             \/\/= | \/\/ |
4424             \/= | \/ |
4425             \? |
4426             \\ |
4427             \^= | \^\.= | \^\. | \^ |
4428             \b x= |
4429             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
4430             ~~ | ~\. | ~ |
4431             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
4432             \b(?: print )\b |
4433              
4434 7         25 [,;\(\{\[]
  8823         18946  
4435              
4436             )) /oxgc) { $slash = 'm//'; return $1; }
4437 8823         41075  
  15757         32062  
4438             # other any character
4439             elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
4440              
4441 15757         72067 # system error
4442             else {
4443             die __FILE__, ": Oops, this shouldn't happen!\n";
4444             }
4445             }
4446              
4447 0     1786 0 0 # escape Windows-1258 string
4448 1786         5124 sub e_string {
4449             my($string) = @_;
4450 1786         2792 my $e_string = '';
4451              
4452             local $slash = 'm//';
4453              
4454             # P.1024 Appendix W.10 Multibyte Processing
4455             # of ISBN 1-56592-224-7 CJKV Information Processing
4456 1786         2796 # (and so on)
4457              
4458             my @char = $string =~ / \G (?>[^\\]|\\$q_char|$q_char) /oxmsg;
4459 1786 100 66     21597  
4460 1786 50       8683 # without { ... }
4461 1769         4331 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
4462             if ($string !~ /<
4463             return $string;
4464             }
4465             }
4466 1769         4365  
4467 17 50       63 E_STRING_LOOP:
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    50          
4468             while ($string !~ /\G \z/oxgc) {
4469             if (0) {
4470             }
4471 190         11474  
4472 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Ewindows1258::PREMATCH()]}
4473 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4474             $e_string .= q{Ewindows1258::PREMATCH()};
4475             $slash = 'div';
4476             }
4477              
4478 0         0 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Ewindows1258::MATCH()]}
4479 0         0 elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4480             $e_string .= q{Ewindows1258::MATCH()};
4481             $slash = 'div';
4482             }
4483              
4484 0         0 # $', ${'} --> $', ${'}
4485 0         0 elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
4486             $e_string .= $1;
4487             $slash = 'div';
4488             }
4489              
4490 0         0 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Ewindows1258::POSTMATCH()]}
4491 0         0 elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4492             $e_string .= q{Ewindows1258::POSTMATCH()};
4493             $slash = 'div';
4494             }
4495              
4496 0         0 # bareword
4497 0         0 elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
4498             $e_string .= $1;
4499             $slash = 'div';
4500             }
4501              
4502 0         0 # $0 --> $0
4503 0         0 elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
4504             $e_string .= $1;
4505             $slash = 'div';
4506 0         0 }
4507 0         0 elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
4508             $e_string .= $1;
4509             $slash = 'div';
4510             }
4511              
4512 0         0 # $$ --> $$
4513 0         0 elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
4514             $e_string .= $1;
4515             $slash = 'div';
4516             }
4517              
4518             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
4519 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
4520 0         0 elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
4521             $e_string .= e_capture($1);
4522             $slash = 'div';
4523 0         0 }
4524 0         0 elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
4525             $e_string .= e_capture($1);
4526             $slash = 'div';
4527             }
4528              
4529 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
4530 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
4531             $e_string .= e_capture($1.'->'.$2);
4532             $slash = 'div';
4533             }
4534              
4535 0         0 # $$foo{ ... } --> $ $foo->{ ... }
4536 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
4537             $e_string .= e_capture($1.'->'.$2);
4538             $slash = 'div';
4539             }
4540              
4541 0         0 # $$foo
4542 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
4543             $e_string .= e_capture($1);
4544             $slash = 'div';
4545             }
4546              
4547 0         0 # ${ foo }
4548 0         0 elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
4549             $e_string .= '${' . $1 . '}';
4550             $slash = 'div';
4551             }
4552              
4553 0         0 # ${ ... }
4554 3         9 elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
4555             $e_string .= e_capture($1);
4556             $slash = 'div';
4557             }
4558              
4559             # variable or function
4560 3         14 # $ @ % & * $ #
4561 7         21 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) {
4562             $e_string .= $1;
4563             $slash = 'div';
4564             }
4565             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
4566 7         28 # $ @ # \ ' " / ? ( ) [ ] < >
4567 0         0 elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
4568             $e_string .= $1;
4569             $slash = 'div';
4570             }
4571 0         0  
  0         0  
4572 0         0 # subroutines of package Ewindows1258
  0         0  
4573 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
4574 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4575 0         0 elsif ($string =~ /\G \b Windows1258::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4576 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
4577 0         0 elsif ($string =~ /\G \b Windows1258::eval \b /oxgc) { $e_string .= 'eval Windows1258::escape'; $slash = 'm//'; }
  0         0  
4578 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
4579 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Ewindows1258::chop'; $slash = 'm//'; }
  0         0  
4580 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
4581 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
4582 0         0 elsif ($string =~ /\G \b Windows1258::index \b /oxgc) { $e_string .= 'Windows1258::index'; $slash = 'm//'; }
  0         0  
4583 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Ewindows1258::index'; $slash = 'm//'; }
  0         0  
4584 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
4585 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
4586 0         0 elsif ($string =~ /\G \b Windows1258::rindex \b /oxgc) { $e_string .= 'Windows1258::rindex'; $slash = 'm//'; }
  0         0  
4587 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Ewindows1258::rindex'; $slash = 'm//'; }
  0         0  
4588 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::lc'; $slash = 'm//'; }
  0         0  
4589 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::lcfirst'; $slash = 'm//'; }
  0         0  
4590 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::uc'; $slash = 'm//'; }
  0         0  
4591             elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::ucfirst'; $slash = 'm//'; }
4592             elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::fc'; $slash = 'm//'; }
4593 0         0  
  0         0  
4594 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
4595 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4596 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  
4597 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  
4598 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  
4599 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  
4600             elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
4601 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  
4602 0         0  
  0         0  
4603 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4604 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  
4605 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  
4606 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  
4607 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  
4608             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4609             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4610 0         0  
  0         0  
4611 0         0 elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
  0         0  
4612 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4613 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
4614             elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
4615 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4616 0         0  
  0         0  
4617 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4618 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4619 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::chr'; $slash = 'm//'; }
  0         0  
4620 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4621 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
4622 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::glob'; $slash = 'm//'; }
  0         0  
4623 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Ewindows1258::lc_'; $slash = 'm//'; }
  0         0  
4624 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Ewindows1258::lcfirst_'; $slash = 'm//'; }
  0         0  
4625 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Ewindows1258::uc_'; $slash = 'm//'; }
  0         0  
4626 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Ewindows1258::ucfirst_'; $slash = 'm//'; }
  0         0  
4627             elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Ewindows1258::fc_'; $slash = 'm//'; }
4628 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
4629 0         0  
  0         0  
4630 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4631 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4632 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Ewindows1258::chr_'; $slash = 'm//'; }
  0         0  
4633 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4634 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
4635 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Ewindows1258::glob_'; $slash = 'm//'; }
  0         0  
4636             elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
4637             elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
4638 0         0 # split
4639             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
4640 0         0 $slash = 'm//';
4641 0         0  
4642 0         0 my $e = '';
4643             while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
4644             $e .= $1;
4645             }
4646 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          
4647             # end of split
4648             if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Ewindows1258::split' . $e; }
4649 0         0  
  0         0  
4650             # split scalar value
4651             elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . e_string($1); next E_STRING_LOOP; }
4652 0         0  
  0         0  
4653 0         0 # split literal space
  0         0  
4654 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
4655 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4656 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4657 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4658 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4659 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4660 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
4661 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4662 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4663 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4664 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4665 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4666             elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {' '}; next E_STRING_LOOP; }
4667             elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {" "}; next E_STRING_LOOP; }
4668              
4669 0 0       0 # split qq//
  0         0  
  0         0  
4670             elsif ($string =~ /\G \b (qq) \b /oxgc) {
4671 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
4672 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4673 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4674 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4675 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  
4676 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  
4677 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  
4678 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  
4679             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
4680 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 * *
4681             }
4682             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4683             }
4684             }
4685              
4686 0 0       0 # split qr//
  0         0  
  0         0  
4687             elsif ($string =~ /\G \b (qr) \b /oxgc) {
4688 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
4689 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4690 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4691 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4692 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  
4693 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  
4694 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  
4695 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  
4696 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  
4697             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
4698 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 * *
4699             }
4700             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4701             }
4702             }
4703              
4704 0 0       0 # split q//
  0         0  
  0         0  
4705             elsif ($string =~ /\G \b (q) \b /oxgc) {
4706 0         0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
4707 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4708 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4709 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4710 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  
4711 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  
4712 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  
4713 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  
4714             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
4715 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 * *
4716             }
4717             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4718             }
4719             }
4720              
4721 0 0       0 # split m//
  0         0  
  0         0  
4722             elsif ($string =~ /\G \b (m) \b /oxgc) {
4723 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 # #
4724 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4725 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4726 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4727 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  
4728 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  
4729 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  
4730 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  
4731 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  
4732             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
4733 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 * *
4734             }
4735             die __FILE__, ": Search pattern not terminated\n";
4736             }
4737             }
4738              
4739 0         0 # split ''
4740 0         0 elsif ($string =~ /\G (\') /oxgc) {
4741 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
4742 0         0 while ($string !~ /\G \z/oxgc) {
4743 0         0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0         0  
4744 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
4745             elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
4746 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
4747             }
4748             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4749             }
4750              
4751 0         0 # split ""
4752 0         0 elsif ($string =~ /\G (\") /oxgc) {
4753 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
4754 0         0 while ($string !~ /\G \z/oxgc) {
4755 0         0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
4756 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
4757             elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
4758 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
4759             }
4760             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4761             }
4762              
4763 0         0 # split //
4764 0         0 elsif ($string =~ /\G (\/) /oxgc) {
4765 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
4766 0         0 while ($string !~ /\G \z/oxgc) {
4767 0         0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0         0  
4768 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
4769             elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
4770 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
4771             }
4772             die __FILE__, ": Search pattern not terminated\n";
4773             }
4774             }
4775              
4776 0         0 # qq//
4777 0 0       0 elsif ($string =~ /\G \b (qq) \b /oxgc) {
4778 0         0 my $ope = $1;
4779             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
4780             $e_string .= e_qq($ope,$1,$3,$2);
4781 0         0 }
4782 0         0 else {
4783 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
4784 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4785 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4786 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
4787 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
4788 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
4789             elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
4790 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
4791             }
4792             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4793             }
4794             }
4795              
4796 0         0 # qx//
4797 0 0       0 elsif ($string =~ /\G \b (qx) \b /oxgc) {
4798 0         0 my $ope = $1;
4799             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4800             $e_string .= e_qq($ope,$1,$3,$2);
4801 0         0 }
4802 0         0 else {
4803 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4804 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4805 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4806 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
4807 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
4808 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
4809 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
4810             elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
4811 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
4812             }
4813             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4814             }
4815             }
4816              
4817 0         0 # q//
4818 0 0       0 elsif ($string =~ /\G \b (q) \b /oxgc) {
4819 0         0 my $ope = $1;
4820             if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
4821             $e_string .= e_q($ope,$1,$3,$2);
4822 0         0 }
4823 0         0 else {
4824 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
4825 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4826 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4827 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
4828 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
4829 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
4830             elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
4831 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 * *
4832             }
4833             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4834             }
4835             }
4836 0         0  
4837             # ''
4838             elsif ($string =~ /\G (?
4839 0         0  
4840             # ""
4841             elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
4842 0         0  
4843             # ``
4844             elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
4845 0         0  
4846             # <<>> (a safer ARGV)
4847             elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
4848 0         0  
4849             # <<= <=> <= < operator
4850             elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
4851 0         0  
4852             #
4853             elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
4854              
4855 0         0 # --- glob
4856             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
4857             $e_string .= 'Ewindows1258::glob("' . $1 . '")';
4858             }
4859              
4860 0         0 # << (bit shift) --- not here document
4861 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) {
4862             $slash = 'm//';
4863             $e_string .= $1;
4864             }
4865              
4866 0         0 # <<~'HEREDOC'
4867 0         0 elsif ($string =~ /\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
4868 0         0 $slash = 'm//';
4869             my $here_quote = $1;
4870             my $delimiter = $2;
4871 0 0       0  
4872 0         0 # get here document
4873 0         0 if ($here_script eq '') {
4874             $here_script = CORE::substr $_, pos $_;
4875 0 0       0 $here_script =~ s/.*?\n//oxm;
4876 0         0 }
4877 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4878 0         0 my $heredoc = $1;
4879 0         0 my $indent = $2;
4880 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4881             push @heredoc, $heredoc . qq{\n$delimiter\n};
4882             push @heredoc_delimiter, qq{\\s*$delimiter};
4883 0         0 }
4884             else {
4885 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4886             }
4887             $e_string .= qq{<<'$delimiter'};
4888             }
4889              
4890 0         0 # <<~\HEREDOC
4891 0         0 elsif ($string =~ /\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
4892 0         0 $slash = 'm//';
4893             my $here_quote = $1;
4894             my $delimiter = $2;
4895 0 0       0  
4896 0         0 # get here document
4897 0         0 if ($here_script eq '') {
4898             $here_script = CORE::substr $_, pos $_;
4899 0 0       0 $here_script =~ s/.*?\n//oxm;
4900 0         0 }
4901 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4902 0         0 my $heredoc = $1;
4903 0         0 my $indent = $2;
4904 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4905             push @heredoc, $heredoc . qq{\n$delimiter\n};
4906             push @heredoc_delimiter, qq{\\s*$delimiter};
4907 0         0 }
4908             else {
4909 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4910             }
4911             $e_string .= qq{<<\\$delimiter};
4912             }
4913              
4914 0         0 # <<~"HEREDOC"
4915 0         0 elsif ($string =~ /\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
4916 0         0 $slash = 'm//';
4917             my $here_quote = $1;
4918             my $delimiter = $2;
4919 0 0       0  
4920 0         0 # get here document
4921 0         0 if ($here_script eq '') {
4922             $here_script = CORE::substr $_, pos $_;
4923 0 0       0 $here_script =~ s/.*?\n//oxm;
4924 0         0 }
4925 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4926 0         0 my $heredoc = $1;
4927 0         0 my $indent = $2;
4928 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4929             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4930             push @heredoc_delimiter, qq{\\s*$delimiter};
4931 0         0 }
4932             else {
4933 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4934             }
4935             $e_string .= qq{<<"$delimiter"};
4936             }
4937              
4938 0         0 # <<~HEREDOC
4939 0         0 elsif ($string =~ /\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
4940 0         0 $slash = 'm//';
4941             my $here_quote = $1;
4942             my $delimiter = $2;
4943 0 0       0  
4944 0         0 # get here document
4945 0         0 if ($here_script eq '') {
4946             $here_script = CORE::substr $_, pos $_;
4947 0 0       0 $here_script =~ s/.*?\n//oxm;
4948 0         0 }
4949 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4950 0         0 my $heredoc = $1;
4951 0         0 my $indent = $2;
4952 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4953             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4954             push @heredoc_delimiter, qq{\\s*$delimiter};
4955 0         0 }
4956             else {
4957 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4958             }
4959             $e_string .= qq{<<$delimiter};
4960             }
4961              
4962 0         0 # <<~`HEREDOC`
4963 0         0 elsif ($string =~ /\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
4964 0         0 $slash = 'm//';
4965             my $here_quote = $1;
4966             my $delimiter = $2;
4967 0 0       0  
4968 0         0 # get here document
4969 0         0 if ($here_script eq '') {
4970             $here_script = CORE::substr $_, pos $_;
4971 0 0       0 $here_script =~ s/.*?\n//oxm;
4972 0         0 }
4973 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4974 0         0 my $heredoc = $1;
4975 0         0 my $indent = $2;
4976 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4977             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4978             push @heredoc_delimiter, qq{\\s*$delimiter};
4979 0         0 }
4980             else {
4981 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4982             }
4983             $e_string .= qq{<<`$delimiter`};
4984             }
4985              
4986 0         0 # <<'HEREDOC'
4987 0         0 elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4988 0         0 $slash = 'm//';
4989             my $here_quote = $1;
4990             my $delimiter = $2;
4991 0 0       0  
4992 0         0 # get here document
4993 0         0 if ($here_script eq '') {
4994             $here_script = CORE::substr $_, pos $_;
4995 0 0       0 $here_script =~ s/.*?\n//oxm;
4996 0         0 }
4997 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4998             push @heredoc, $1 . qq{\n$delimiter\n};
4999             push @heredoc_delimiter, $delimiter;
5000 0         0 }
5001             else {
5002 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5003             }
5004             $e_string .= $here_quote;
5005             }
5006              
5007 0         0 # <<\HEREDOC
5008 0         0 elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
5009 0         0 $slash = 'm//';
5010             my $here_quote = $1;
5011             my $delimiter = $2;
5012 0 0       0  
5013 0         0 # get here document
5014 0         0 if ($here_script eq '') {
5015             $here_script = CORE::substr $_, pos $_;
5016 0 0       0 $here_script =~ s/.*?\n//oxm;
5017 0         0 }
5018 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5019             push @heredoc, $1 . qq{\n$delimiter\n};
5020             push @heredoc_delimiter, $delimiter;
5021 0         0 }
5022             else {
5023 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5024             }
5025             $e_string .= $here_quote;
5026             }
5027              
5028 0         0 # <<"HEREDOC"
5029 0         0 elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
5030 0         0 $slash = 'm//';
5031             my $here_quote = $1;
5032             my $delimiter = $2;
5033 0 0       0  
5034 0         0 # get here document
5035 0         0 if ($here_script eq '') {
5036             $here_script = CORE::substr $_, pos $_;
5037 0 0       0 $here_script =~ s/.*?\n//oxm;
5038 0         0 }
5039 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5040             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5041             push @heredoc_delimiter, $delimiter;
5042 0         0 }
5043             else {
5044 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5045             }
5046             $e_string .= $here_quote;
5047             }
5048              
5049 0         0 # <
5050 0         0 elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
5051 0         0 $slash = 'm//';
5052             my $here_quote = $1;
5053             my $delimiter = $2;
5054 0 0       0  
5055 0         0 # get here document
5056 0         0 if ($here_script eq '') {
5057             $here_script = CORE::substr $_, pos $_;
5058 0 0       0 $here_script =~ s/.*?\n//oxm;
5059 0         0 }
5060 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5061             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5062             push @heredoc_delimiter, $delimiter;
5063 0         0 }
5064             else {
5065 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5066             }
5067             $e_string .= $here_quote;
5068             }
5069              
5070 0         0 # <<`HEREDOC`
5071 0         0 elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
5072 0         0 $slash = 'm//';
5073             my $here_quote = $1;
5074             my $delimiter = $2;
5075 0 0       0  
5076 0         0 # get here document
5077 0         0 if ($here_script eq '') {
5078             $here_script = CORE::substr $_, pos $_;
5079 0 0       0 $here_script =~ s/.*?\n//oxm;
5080 0         0 }
5081 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5082             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5083             push @heredoc_delimiter, $delimiter;
5084 0         0 }
5085             else {
5086 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5087             }
5088             $e_string .= $here_quote;
5089             }
5090              
5091             # any operator before div
5092             elsif ($string =~ /\G (
5093             -- | \+\+ |
5094 0         0 [\)\}\]]
  18         31  
5095              
5096             ) /oxgc) { $slash = 'div'; $e_string .= $1; }
5097              
5098             # yada-yada or triple-dot operator
5099             elsif ($string =~ /\G (
5100 18         56 \.\.\.
  0         0  
5101              
5102             ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
5103              
5104             # any operator before m//
5105             elsif ($string =~ /\G ((?>
5106              
5107             !~~ | !~ | != | ! |
5108             %= | % |
5109             &&= | && | &= | &\.= | &\. | & |
5110             -= | -> | - |
5111             :(?>\s*)= |
5112             : |
5113             <<>> |
5114             <<= | <=> | <= | < |
5115             == | => | =~ | = |
5116             >>= | >> | >= | > |
5117             \*\*= | \*\* | \*= | \* |
5118             \+= | \+ |
5119             \.\. | \.= | \. |
5120             \/\/= | \/\/ |
5121             \/= | \/ |
5122             \? |
5123             \\ |
5124             \^= | \^\.= | \^\. | \^ |
5125             \b x= |
5126             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
5127             ~~ | ~\. | ~ |
5128             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
5129             \b(?: print )\b |
5130              
5131 0         0 [,;\(\{\[]
  31         56  
5132              
5133             )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
5134 31         111  
5135             # other any character
5136             elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
5137              
5138 131         402 # system error
5139             else {
5140             die __FILE__, ": Oops, this shouldn't happen!\n";
5141             }
5142 0         0 }
5143              
5144             return $e_string;
5145             }
5146              
5147             #
5148             # character class
5149 17     1919 0 85 #
5150             sub character_class {
5151 1919 100       3502 my($char,$modifier) = @_;
5152 1919 100       3225  
5153 52         113 if ($char eq '.') {
5154             if ($modifier =~ /s/) {
5155             return '${Ewindows1258::dot_s}';
5156 17         41 }
5157             else {
5158             return '${Ewindows1258::dot}';
5159             }
5160 35         75 }
5161             else {
5162             return Ewindows1258::classic_character_class($char);
5163             }
5164             }
5165              
5166             #
5167             # escape capture ($1, $2, $3, ...)
5168             #
5169 1867     212 0 3368 sub e_capture {
5170              
5171             return join '', '${', $_[0], '}';
5172             }
5173              
5174             #
5175             # escape transliteration (tr/// or y///)
5176 212     3 0 750 #
5177 3         17 sub e_tr {
5178 3   50     5 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
5179             my $e_tr = '';
5180 3         7 $modifier ||= '';
5181              
5182             $slash = 'div';
5183 3         4  
5184             # quote character class 1
5185             $charclass = q_tr($charclass);
5186 3         81  
5187             # quote character class 2
5188             $charclass2 = q_tr($charclass2);
5189 3 50       6  
5190 3 0       10 # /b /B modifier
5191 0         0 if ($modifier =~ tr/bB//d) {
5192             if ($variable eq '') {
5193             $e_tr = qq{tr$charclass$e$charclass2$modifier};
5194 0         0 }
5195             else {
5196             $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
5197             }
5198 0 100       0 }
5199 3         7 else {
5200             if ($variable eq '') {
5201             $e_tr = qq{Ewindows1258::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
5202 2         5 }
5203             else {
5204             $e_tr = qq{Ewindows1258::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
5205             }
5206             }
5207 1         4  
5208 3         4 # clear tr/// variable
5209             $tr_variable = '';
5210 3         5 $bind_operator = '';
5211              
5212             return $e_tr;
5213             }
5214              
5215             #
5216             # quote for escape transliteration (tr/// or y///)
5217 3     6 0 17 #
5218             sub q_tr {
5219             my($charclass) = @_;
5220 6 50       12  
    0          
    0          
    0          
    0          
    0          
5221 6         14 # quote character class
5222             if ($charclass !~ /'/oxms) {
5223             return e_q('', "'", "'", $charclass); # --> q' '
5224 6         10 }
5225             elsif ($charclass !~ /\//oxms) {
5226             return e_q('q', '/', '/', $charclass); # --> q/ /
5227 0         0 }
5228             elsif ($charclass !~ /\#/oxms) {
5229             return e_q('q', '#', '#', $charclass); # --> q# #
5230 0         0 }
5231             elsif ($charclass !~ /[\<\>]/oxms) {
5232             return e_q('q', '<', '>', $charclass); # --> q< >
5233 0         0 }
5234             elsif ($charclass !~ /[\(\)]/oxms) {
5235             return e_q('q', '(', ')', $charclass); # --> q( )
5236 0         0 }
5237             elsif ($charclass !~ /[\{\}]/oxms) {
5238             return e_q('q', '{', '}', $charclass); # --> q{ }
5239 0         0 }
5240 0 0       0 else {
5241 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5242             if ($charclass !~ /\Q$char\E/xms) {
5243             return e_q('q', $char, $char, $charclass);
5244             }
5245             }
5246 0         0 }
5247              
5248             return e_q('q', '{', '}', $charclass);
5249             }
5250              
5251             #
5252             # escape q string (q//, '')
5253 0     1264 0 0 #
5254             sub e_q {
5255 1264         3252 my($ope,$delimiter,$end_delimiter,$string) = @_;
5256              
5257 1264         1753 $slash = 'div';
5258              
5259             return join '', $ope, $delimiter, $string, $end_delimiter;
5260             }
5261              
5262             #
5263             # escape qq string (qq//, "", qx//, ``)
5264 1264     4020 0 6680 #
5265             sub e_qq {
5266 4020         9441 my($ope,$delimiter,$end_delimiter,$string) = @_;
5267              
5268 4020         5556 $slash = 'div';
5269 4020         5867  
5270             my $left_e = 0;
5271             my $right_e = 0;
5272 4020         4751  
5273             # split regexp
5274             my @char = $string =~ /\G((?>
5275             [^\\\$] |
5276             \\x\{ (?>[0-9A-Fa-f]+) \} |
5277             \\o\{ (?>[0-7]+) \} |
5278             \\N\{ (?>[^0-9\}][^\}]*) \} |
5279             \\ $q_char |
5280             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5281             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5282             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5283             \$ (?>\s* [0-9]+) |
5284             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5285             \$ \$ (?![\w\{]) |
5286             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5287             $q_char
5288 4020         167568 ))/oxmsg;
5289              
5290             for (my $i=0; $i <= $#char; $i++) {
5291 4020 50 33     12897  
    50 33        
    100          
    100          
    50          
5292 114733         392314 # "\L\u" --> "\u\L"
5293             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5294             @char[$i,$i+1] = @char[$i+1,$i];
5295             }
5296              
5297 0         0 # "\U\l" --> "\l\U"
5298             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5299             @char[$i,$i+1] = @char[$i+1,$i];
5300             }
5301              
5302 0         0 # octal escape sequence
5303             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5304             $char[$i] = Ewindows1258::octchr($1);
5305             }
5306              
5307 1         4 # hexadecimal escape sequence
5308             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5309             $char[$i] = Ewindows1258::hexchr($1);
5310             }
5311              
5312 1         4 # \N{CHARNAME} --> N{CHARNAME}
5313             elsif ($char[$i] =~ /\A \\ ( N\{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
5314             $char[$i] = $1;
5315 0 100       0 }
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
5316              
5317             if (0) {
5318             }
5319              
5320             # \F
5321             #
5322             # P.69 Table 2-6. Translation escapes
5323             # in Chapter 2: Bits and Pieces
5324             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5325             # (and so on)
5326 114733         1031159  
5327 0 50       0 # \u \l \U \L \F \Q \E
5328 484         1084 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5329             if ($right_e < $left_e) {
5330             $char[$i] = '\\' . $char[$i];
5331             }
5332             }
5333             elsif ($char[$i] eq '\u') {
5334              
5335             # "STRING @{[ LIST EXPR ]} MORE STRING"
5336              
5337             # P.257 Other Tricks You Can Do with Hard References
5338             # in Chapter 8: References
5339             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5340              
5341             # P.353 Other Tricks You Can Do with Hard References
5342             # in Chapter 8: References
5343             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5344              
5345 0         0 # (and so on)
5346 0         0  
5347             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
5348             $left_e++;
5349 0         0 }
5350 0         0 elsif ($char[$i] eq '\l') {
5351             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
5352             $left_e++;
5353 0         0 }
5354 0         0 elsif ($char[$i] eq '\U') {
5355             $char[$i] = '@{[Ewindows1258::uc qq<';
5356             $left_e++;
5357 0         0 }
5358 0         0 elsif ($char[$i] eq '\L') {
5359             $char[$i] = '@{[Ewindows1258::lc qq<';
5360             $left_e++;
5361 0         0 }
5362 24         43 elsif ($char[$i] eq '\F') {
5363             $char[$i] = '@{[Ewindows1258::fc qq<';
5364             $left_e++;
5365 24         45 }
5366 0         0 elsif ($char[$i] eq '\Q') {
5367             $char[$i] = '@{[CORE::quotemeta qq<';
5368             $left_e++;
5369 0 50       0 }
5370 24         47 elsif ($char[$i] eq '\E') {
5371 24         32 if ($right_e < $left_e) {
5372             $char[$i] = '>]}';
5373             $right_e++;
5374 24         46 }
5375             else {
5376             $char[$i] = '';
5377             }
5378 0         0 }
5379 0 0       0 elsif ($char[$i] eq '\Q') {
5380 0         0 while (1) {
5381             if (++$i > $#char) {
5382 0 0       0 last;
5383 0         0 }
5384             if ($char[$i] eq '\E') {
5385             last;
5386             }
5387             }
5388             }
5389             elsif ($char[$i] eq '\E') {
5390             }
5391              
5392             # $0 --> $0
5393             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5394             }
5395             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5396             }
5397              
5398             # $$ --> $$
5399             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5400             }
5401              
5402             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5403 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5404             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5405             $char[$i] = e_capture($1);
5406 205         392 }
5407             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5408             $char[$i] = e_capture($1);
5409             }
5410              
5411 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5412             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5413             $char[$i] = e_capture($1.'->'.$2);
5414             }
5415              
5416 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5417             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5418             $char[$i] = e_capture($1.'->'.$2);
5419             }
5420              
5421 0         0 # $$foo
5422             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5423             $char[$i] = e_capture($1);
5424             }
5425              
5426 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
5427             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5428             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
5429             }
5430              
5431 44         118 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
5432             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5433             $char[$i] = '@{[Ewindows1258::MATCH()]}';
5434             }
5435              
5436 45         128 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
5437             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5438             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
5439             }
5440              
5441             # ${ foo } --> ${ foo }
5442             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5443             }
5444              
5445 33         108 # ${ ... }
5446             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5447             $char[$i] = e_capture($1);
5448             }
5449             }
5450 0 50       0  
5451 4020         7940 # return string
5452             if ($left_e > $right_e) {
5453 0         0 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
5454             }
5455             return join '', $ope, $delimiter, @char, $end_delimiter;
5456             }
5457              
5458             #
5459             # escape qw string (qw//)
5460 4020     16 0 40463 #
5461             sub e_qw {
5462 16         71 my($ope,$delimiter,$end_delimiter,$string) = @_;
5463              
5464             $slash = 'div';
5465 16         32  
  16         197  
5466 483 50       730 # choice again delimiter
    0          
    0          
    0          
    0          
5467 16         93 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
5468             if (not $octet{$end_delimiter}) {
5469             return join '', $ope, $delimiter, $string, $end_delimiter;
5470 16         145 }
5471             elsif (not $octet{')'}) {
5472             return join '', $ope, '(', $string, ')';
5473 0         0 }
5474             elsif (not $octet{'}'}) {
5475             return join '', $ope, '{', $string, '}';
5476 0         0 }
5477             elsif (not $octet{']'}) {
5478             return join '', $ope, '[', $string, ']';
5479 0         0 }
5480             elsif (not $octet{'>'}) {
5481             return join '', $ope, '<', $string, '>';
5482 0         0 }
5483 0 0       0 else {
5484 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5485             if (not $octet{$char}) {
5486             return join '', $ope, $char, $string, $char;
5487             }
5488             }
5489             }
5490 0         0  
5491 0         0 # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
5492 0         0 my @string = CORE::split(/\s+/, $string);
5493 0         0 for my $string (@string) {
5494 0 0       0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
5495 0         0 for my $octet (@octet) {
5496             if ($octet =~ /\A (['\\]) \z/oxms) {
5497             $octet = '\\' . $1;
5498 0         0 }
5499             }
5500 0         0 $string = join '', @octet;
  0         0  
5501             }
5502             return join '', '(', (join ', ', map { "'$_'" } @string), ')';
5503             }
5504              
5505             #
5506             # escape here document (<<"HEREDOC", <
5507 0     93 0 0 #
5508             sub e_heredoc {
5509 93         262 my($string) = @_;
5510              
5511 93         164 $slash = 'm//';
5512              
5513 93         308 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
5514 93         152  
5515             my $left_e = 0;
5516             my $right_e = 0;
5517 93         131  
5518             # split regexp
5519             my @char = $string =~ /\G((?>
5520             [^\\\$] |
5521             \\x\{ (?>[0-9A-Fa-f]+) \} |
5522             \\o\{ (?>[0-7]+) \} |
5523             \\N\{ (?>[^0-9\}][^\}]*) \} |
5524             \\ $q_char |
5525             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5526             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5527             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5528             \$ (?>\s* [0-9]+) |
5529             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5530             \$ \$ (?![\w\{]) |
5531             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5532             $q_char
5533 93         8587 ))/oxmsg;
5534              
5535             for (my $i=0; $i <= $#char; $i++) {
5536 93 50 33     475  
    50 33        
    100          
    100          
    50          
5537 3307         10531 # "\L\u" --> "\u\L"
5538             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5539             @char[$i,$i+1] = @char[$i+1,$i];
5540             }
5541              
5542 0         0 # "\U\l" --> "\l\U"
5543             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5544             @char[$i,$i+1] = @char[$i+1,$i];
5545             }
5546              
5547 0         0 # octal escape sequence
5548             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5549             $char[$i] = Ewindows1258::octchr($1);
5550             }
5551              
5552 1         3 # hexadecimal escape sequence
5553             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5554             $char[$i] = Ewindows1258::hexchr($1);
5555             }
5556              
5557 1         4 # \N{CHARNAME} --> N{CHARNAME}
5558             elsif ($char[$i] =~ /\A \\ ( N\{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
5559             $char[$i] = $1;
5560 0 50       0 }
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
5561              
5562             if (0) {
5563             }
5564 3307         28019  
5565 0 0       0 # \u \l \U \L \F \Q \E
5566 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5567             if ($right_e < $left_e) {
5568             $char[$i] = '\\' . $char[$i];
5569             }
5570 0         0 }
5571 0         0 elsif ($char[$i] eq '\u') {
5572             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
5573             $left_e++;
5574 0         0 }
5575 0         0 elsif ($char[$i] eq '\l') {
5576             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
5577             $left_e++;
5578 0         0 }
5579 0         0 elsif ($char[$i] eq '\U') {
5580             $char[$i] = '@{[Ewindows1258::uc qq<';
5581             $left_e++;
5582 0         0 }
5583 0         0 elsif ($char[$i] eq '\L') {
5584             $char[$i] = '@{[Ewindows1258::lc qq<';
5585             $left_e++;
5586 0         0 }
5587 0         0 elsif ($char[$i] eq '\F') {
5588             $char[$i] = '@{[Ewindows1258::fc qq<';
5589             $left_e++;
5590 0         0 }
5591 0         0 elsif ($char[$i] eq '\Q') {
5592             $char[$i] = '@{[CORE::quotemeta qq<';
5593             $left_e++;
5594 0 0       0 }
5595 0         0 elsif ($char[$i] eq '\E') {
5596 0         0 if ($right_e < $left_e) {
5597             $char[$i] = '>]}';
5598             $right_e++;
5599 0         0 }
5600             else {
5601             $char[$i] = '';
5602             }
5603 0         0 }
5604 0 0       0 elsif ($char[$i] eq '\Q') {
5605 0         0 while (1) {
5606             if (++$i > $#char) {
5607 0 0       0 last;
5608 0         0 }
5609             if ($char[$i] eq '\E') {
5610             last;
5611             }
5612             }
5613             }
5614             elsif ($char[$i] eq '\E') {
5615             }
5616              
5617             # $0 --> $0
5618             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5619             }
5620             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5621             }
5622              
5623             # $$ --> $$
5624             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5625             }
5626              
5627             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5628 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5629             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5630             $char[$i] = e_capture($1);
5631 0         0 }
5632             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5633             $char[$i] = e_capture($1);
5634             }
5635              
5636 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5637             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5638             $char[$i] = e_capture($1.'->'.$2);
5639             }
5640              
5641 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5642             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5643             $char[$i] = e_capture($1.'->'.$2);
5644             }
5645              
5646 0         0 # $$foo
5647             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5648             $char[$i] = e_capture($1);
5649             }
5650              
5651 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
5652             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5653             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
5654             }
5655              
5656 8         45 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
5657             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5658             $char[$i] = '@{[Ewindows1258::MATCH()]}';
5659             }
5660              
5661 8         45 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
5662             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5663             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
5664             }
5665              
5666             # ${ foo } --> ${ foo }
5667             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5668             }
5669              
5670 6         39 # ${ ... }
5671             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5672             $char[$i] = e_capture($1);
5673             }
5674             }
5675 0 50       0  
5676 93         204 # return string
5677             if ($left_e > $right_e) {
5678 0         0 return join '', @char, '>]}' x ($left_e - $right_e);
5679             }
5680             return join '', @char;
5681             }
5682              
5683             #
5684             # escape regexp (m//, qr//)
5685 93     652 0 873 #
5686 652   100     3201 sub e_qr {
5687             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
5688 652         3485 $modifier ||= '';
5689 652 50       1401  
5690 652         1741 $modifier =~ tr/p//d;
5691 0         0 if ($modifier =~ /([adlu])/oxms) {
5692 0 0       0 my $line = 0;
5693 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
5694 0         0 if ($filename ne __FILE__) {
5695             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
5696             last;
5697 0         0 }
5698             }
5699             die qq{Unsupported modifier "$1" used at line $line.\n};
5700 0         0 }
5701              
5702             $slash = 'div';
5703 652 100       1074  
    100          
5704 652         2025 # literal null string pattern
5705 8         10 if ($string eq '') {
5706 8         10 $modifier =~ tr/bB//d;
5707             $modifier =~ tr/i//d;
5708             return join '', $ope, $delimiter, $end_delimiter, $modifier;
5709             }
5710              
5711             # /b /B modifier
5712             elsif ($modifier =~ tr/bB//d) {
5713 8 50       37  
5714 2         6 # choice again delimiter
5715 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
5716 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
5717 0         0 my %octet = map {$_ => 1} @char;
5718 0         0 if (not $octet{')'}) {
5719             $delimiter = '(';
5720             $end_delimiter = ')';
5721 0         0 }
5722 0         0 elsif (not $octet{'}'}) {
5723             $delimiter = '{';
5724             $end_delimiter = '}';
5725 0         0 }
5726 0         0 elsif (not $octet{']'}) {
5727             $delimiter = '[';
5728             $end_delimiter = ']';
5729 0         0 }
5730 0         0 elsif (not $octet{'>'}) {
5731             $delimiter = '<';
5732             $end_delimiter = '>';
5733 0         0 }
5734 0 0       0 else {
5735 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5736 0         0 if (not $octet{$char}) {
5737 0         0 $delimiter = $char;
5738             $end_delimiter = $char;
5739             last;
5740             }
5741             }
5742             }
5743 0 50 33     0 }
5744 2         11  
5745             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
5746             return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
5747 0         0 }
5748             else {
5749             return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
5750             }
5751 2 100       11 }
5752 642         1885  
5753             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
5754             my $metachar = qr/[\@\\|[\]{^]/oxms;
5755 642         2584  
5756             # split regexp
5757             my @char = $string =~ /\G((?>
5758             [^\\\$\@\[\(] |
5759             \\x (?>[0-9A-Fa-f]{1,2}) |
5760             \\ (?>[0-7]{2,3}) |
5761             \\c [\x40-\x5F] |
5762             \\x\{ (?>[0-9A-Fa-f]+) \} |
5763             \\o\{ (?>[0-7]+) \} |
5764             \\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
5765             \\ $q_char |
5766             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5767             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5768             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5769             [\$\@] $qq_variable |
5770             \$ (?>\s* [0-9]+) |
5771             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5772             \$ \$ (?![\w\{]) |
5773             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5774             \[\^ |
5775             \[\: (?>[a-z]+) :\] |
5776             \[\:\^ (?>[a-z]+) :\] |
5777             \(\? |
5778             $q_char
5779             ))/oxmsg;
5780 642 50       66631  
5781 642         3226 # choice again delimiter
  0         0  
5782 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
5783 0         0 my %octet = map {$_ => 1} @char;
5784 0         0 if (not $octet{')'}) {
5785             $delimiter = '(';
5786             $end_delimiter = ')';
5787 0         0 }
5788 0         0 elsif (not $octet{'}'}) {
5789             $delimiter = '{';
5790             $end_delimiter = '}';
5791 0         0 }
5792 0         0 elsif (not $octet{']'}) {
5793             $delimiter = '[';
5794             $end_delimiter = ']';
5795 0         0 }
5796 0         0 elsif (not $octet{'>'}) {
5797             $delimiter = '<';
5798             $end_delimiter = '>';
5799 0         0 }
5800 0 0       0 else {
5801 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5802 0         0 if (not $octet{$char}) {
5803 0         0 $delimiter = $char;
5804             $end_delimiter = $char;
5805             last;
5806             }
5807             }
5808             }
5809 0         0 }
5810 642         1383  
5811 642         955 my $left_e = 0;
5812             my $right_e = 0;
5813             for (my $i=0; $i <= $#char; $i++) {
5814 642 50 66     2002  
    50 66        
    100          
    100          
    100          
    100          
5815 1872         10202 # "\L\u" --> "\u\L"
5816             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5817             @char[$i,$i+1] = @char[$i+1,$i];
5818             }
5819              
5820 0         0 # "\U\l" --> "\l\U"
5821             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5822             @char[$i,$i+1] = @char[$i+1,$i];
5823             }
5824              
5825 0         0 # octal escape sequence
5826             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5827             $char[$i] = Ewindows1258::octchr($1);
5828             }
5829              
5830 1         3 # hexadecimal escape sequence
5831             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5832             $char[$i] = Ewindows1258::hexchr($1);
5833             }
5834              
5835             # \b{...} --> b\{...}
5836             # \B{...} --> B\{...}
5837             # \N{CHARNAME} --> N\{CHARNAME}
5838             # \p{PROPERTY} --> p\{PROPERTY}
5839 1         3 # \P{PROPERTY} --> P\{PROPERTY}
5840             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
5841             $char[$i] = $1 . '\\' . $2;
5842             }
5843              
5844 6         19 # \p, \P, \X --> p, P, X
5845             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
5846             $char[$i] = $1;
5847 4 100 100     13 }
    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          
5848              
5849             if (0) {
5850             }
5851 1872         5783  
5852 0 50 33     0 # join separated multiple-octet
    50 33        
    50 33        
      33        
      66        
      33        
5853 6         72 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
5854             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)) {
5855             $char[$i] .= join '', splice @char, $i+1, 3;
5856 0         0 }
5857             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)) {
5858             $char[$i] .= join '', splice @char, $i+1, 2;
5859 0         0 }
5860             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)) {
5861             $char[$i] .= join '', splice @char, $i+1, 1;
5862             }
5863             }
5864              
5865 0         0 # open character class [...]
5866             elsif ($char[$i] eq '[') {
5867             my $left = $i;
5868              
5869             # [] make die "Unmatched [] in regexp ...\n"
5870 328 100       12863 # (and so on)
5871 328         827  
5872             if ($char[$i+1] eq ']') {
5873             $i++;
5874 3         5 }
5875 328 50       532  
5876 1379         2746 while (1) {
5877             if (++$i > $#char) {
5878 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
5879 1379         2798 }
5880             if ($char[$i] eq ']') {
5881             my $right = $i;
5882 328 100       435  
5883 328         1916 # [...]
  30         71  
5884             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5885             splice @char, $left, $right-$left+1, sprintf(q{@{[Ewindows1258::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
5886 90         148 }
5887             else {
5888             splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
5889 298         1566 }
5890 328         616  
5891             $i = $left;
5892             last;
5893             }
5894             }
5895             }
5896              
5897 328         1060 # open character class [^...]
5898             elsif ($char[$i] eq '[^') {
5899             my $left = $i;
5900              
5901             # [^] make die "Unmatched [] in regexp ...\n"
5902 74 100       106 # (and so on)
5903 74         165  
5904             if ($char[$i+1] eq ']') {
5905             $i++;
5906 4         8 }
5907 74 50       100  
5908 272         398 while (1) {
5909             if (++$i > $#char) {
5910 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
5911 272         428 }
5912             if ($char[$i] eq ']') {
5913             my $right = $i;
5914 74 100       87  
5915 74         363 # [^...]
  30         72  
5916             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5917             splice @char, $left, $right-$left+1, sprintf(q{@{[Ewindows1258::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
5918 90         146 }
5919             else {
5920             splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
5921 44         198 }
5922 74         137  
5923             $i = $left;
5924             last;
5925             }
5926             }
5927             }
5928              
5929 74         201 # rewrite character class or escape character
5930             elsif (my $char = character_class($char[$i],$modifier)) {
5931             $char[$i] = $char;
5932             }
5933              
5934 139 50       379 # /i modifier
5935 20         34 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
5936             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
5937             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
5938 20         114 }
5939             else {
5940             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
5941             }
5942             }
5943              
5944 0 50       0 # \u \l \U \L \F \Q \E
5945 1         5 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
5946             if ($right_e < $left_e) {
5947             $char[$i] = '\\' . $char[$i];
5948             }
5949 0         0 }
5950 0         0 elsif ($char[$i] eq '\u') {
5951             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
5952             $left_e++;
5953 0         0 }
5954 0         0 elsif ($char[$i] eq '\l') {
5955             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
5956             $left_e++;
5957 0         0 }
5958 1         2 elsif ($char[$i] eq '\U') {
5959             $char[$i] = '@{[Ewindows1258::uc qq<';
5960             $left_e++;
5961 1         3 }
5962 1         2 elsif ($char[$i] eq '\L') {
5963             $char[$i] = '@{[Ewindows1258::lc qq<';
5964             $left_e++;
5965 1         3 }
5966 18         30 elsif ($char[$i] eq '\F') {
5967             $char[$i] = '@{[Ewindows1258::fc qq<';
5968             $left_e++;
5969 18         42 }
5970 1         2 elsif ($char[$i] eq '\Q') {
5971             $char[$i] = '@{[CORE::quotemeta qq<';
5972             $left_e++;
5973 1 50       3 }
5974 21         48 elsif ($char[$i] eq '\E') {
5975 21         27 if ($right_e < $left_e) {
5976             $char[$i] = '>]}';
5977             $right_e++;
5978 21         47 }
5979             else {
5980             $char[$i] = '';
5981             }
5982 0         0 }
5983 0 0       0 elsif ($char[$i] eq '\Q') {
5984 0         0 while (1) {
5985             if (++$i > $#char) {
5986 0 0       0 last;
5987 0         0 }
5988             if ($char[$i] eq '\E') {
5989             last;
5990             }
5991             }
5992             }
5993             elsif ($char[$i] eq '\E') {
5994             }
5995              
5996 0 0       0 # $0 --> $0
5997 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5998             if ($ignorecase) {
5999             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6000             }
6001 0 0       0 }
6002 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6003             if ($ignorecase) {
6004             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6005             }
6006             }
6007              
6008             # $$ --> $$
6009             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6010             }
6011              
6012             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6013 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6014 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6015 0         0 $char[$i] = e_capture($1);
6016             if ($ignorecase) {
6017             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6018             }
6019 0         0 }
6020 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6021 0         0 $char[$i] = e_capture($1);
6022             if ($ignorecase) {
6023             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6024             }
6025             }
6026              
6027 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6028 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
6029 0         0 $char[$i] = e_capture($1.'->'.$2);
6030             if ($ignorecase) {
6031             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6032             }
6033             }
6034              
6035 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6036 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
6037 0         0 $char[$i] = e_capture($1.'->'.$2);
6038             if ($ignorecase) {
6039             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6040             }
6041             }
6042              
6043 0         0 # $$foo
6044 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6045 0         0 $char[$i] = e_capture($1);
6046             if ($ignorecase) {
6047             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6048             }
6049             }
6050              
6051 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
6052 8         21 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6053             if ($ignorecase) {
6054             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::PREMATCH())]}';
6055 0         0 }
6056             else {
6057             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
6058             }
6059             }
6060              
6061 8 50       25 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
6062 8         21 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6063             if ($ignorecase) {
6064             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::MATCH())]}';
6065 0         0 }
6066             else {
6067             $char[$i] = '@{[Ewindows1258::MATCH()]}';
6068             }
6069             }
6070              
6071 8 50       33 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
6072 6         18 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6073             if ($ignorecase) {
6074             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::POSTMATCH())]}';
6075 0         0 }
6076             else {
6077             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
6078             }
6079             }
6080              
6081 6 0       19 # ${ foo }
6082 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
6083             if ($ignorecase) {
6084             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6085             }
6086             }
6087              
6088 0         0 # ${ ... }
6089 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6090 0         0 $char[$i] = e_capture($1);
6091             if ($ignorecase) {
6092             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6093             }
6094             }
6095              
6096 0         0 # $scalar or @array
6097 21 100       56 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6098 21         125 $char[$i] = e_string($char[$i]);
6099             if ($ignorecase) {
6100             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6101             }
6102             }
6103              
6104 11 100 33     33 # quote character before ? + * {
    50          
6105             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6106             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6107 138         1041 }
6108 0 0       0 elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6109 0         0 my $char = $char[$i-1];
6110             if ($char[$i] eq '{') {
6111             die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
6112 0         0 }
6113             else {
6114             die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
6115             }
6116 0         0 }
6117             else {
6118             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6119             }
6120             }
6121             }
6122 127         519  
6123 642 50       1497 # make regexp string
6124 642 0 0     1609 $modifier =~ tr/i//d;
6125 0         0 if ($left_e > $right_e) {
6126             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6127             return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
6128 0         0 }
6129             else {
6130             return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6131 0 50 33     0 }
6132 642         3808 }
6133             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6134             return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
6135 0         0 }
6136             else {
6137             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6138             }
6139             }
6140              
6141             #
6142             # double quote stuff
6143 642     180 0 5376 #
6144             sub qq_stuff {
6145             my($delimiter,$end_delimiter,$stuff) = @_;
6146 180 100       265  
6147 180         361 # scalar variable or array variable
6148             if ($stuff =~ /\A [\$\@] /oxms) {
6149             return $stuff;
6150             }
6151 100         342  
  80         165  
6152 80         209 # quote by delimiter
6153 80 50       265 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
6154 80 50       138 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6155 80 50       121 next if $char eq $delimiter;
6156 80         129 next if $char eq $end_delimiter;
6157             if (not $octet{$char}) {
6158             return join '', 'qq', $char, $stuff, $char;
6159 80         332 }
6160             }
6161             return join '', 'qq', '<', $stuff, '>';
6162             }
6163              
6164             #
6165             # escape regexp (m'', qr'', and m''b, qr''b)
6166 0     10 0 0 #
6167 10   50     44 sub e_qr_q {
6168             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6169 10         42 $modifier ||= '';
6170 10 50       13  
6171 10         22 $modifier =~ tr/p//d;
6172 0         0 if ($modifier =~ /([adlu])/oxms) {
6173 0 0       0 my $line = 0;
6174 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6175 0         0 if ($filename ne __FILE__) {
6176             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6177             last;
6178 0         0 }
6179             }
6180             die qq{Unsupported modifier "$1" used at line $line.\n};
6181 0         0 }
6182              
6183             $slash = 'div';
6184 10 100       12  
    50          
6185 10         22 # literal null string pattern
6186 8         10 if ($string eq '') {
6187 8         10 $modifier =~ tr/bB//d;
6188             $modifier =~ tr/i//d;
6189             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6190             }
6191              
6192 8         38 # with /b /B modifier
6193             elsif ($modifier =~ tr/bB//d) {
6194             return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6195             }
6196              
6197 0         0 # without /b /B modifier
6198             else {
6199             return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6200             }
6201             }
6202              
6203             #
6204             # escape regexp (m'', qr'')
6205 2     2 0 8 #
6206             sub e_qr_qt {
6207 2 50       6 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6208              
6209             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6210 2         7  
6211             # split regexp
6212             my @char = $string =~ /\G((?>
6213             [^\\\[\$\@\/] |
6214             [\x00-\xFF] |
6215             \[\^ |
6216             \[\: (?>[a-z]+) \:\] |
6217             \[\:\^ (?>[a-z]+) \:\] |
6218             [\$\@\/] |
6219             \\ (?:$q_char) |
6220             (?:$q_char)
6221             ))/oxmsg;
6222 2         59  
6223 2 50 33     10 # unescape character
    50 33        
    50 33        
    50          
    50          
    50          
6224             for (my $i=0; $i <= $#char; $i++) {
6225             if (0) {
6226             }
6227 2         15  
6228 0         0 # open character class [...]
6229 0 0       0 elsif ($char[$i] eq '[') {
6230 0         0 my $left = $i;
6231             if ($char[$i+1] eq ']') {
6232 0         0 $i++;
6233 0 0       0 }
6234 0         0 while (1) {
6235             if (++$i > $#char) {
6236 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6237 0         0 }
6238             if ($char[$i] eq ']') {
6239             my $right = $i;
6240 0         0  
6241             # [...]
6242 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
6243 0         0  
6244             $i = $left;
6245             last;
6246             }
6247             }
6248             }
6249              
6250 0         0 # open character class [^...]
6251 0 0       0 elsif ($char[$i] eq '[^') {
6252 0         0 my $left = $i;
6253             if ($char[$i+1] eq ']') {
6254 0         0 $i++;
6255 0 0       0 }
6256 0         0 while (1) {
6257             if (++$i > $#char) {
6258 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6259 0         0 }
6260             if ($char[$i] eq ']') {
6261             my $right = $i;
6262 0         0  
6263             # [^...]
6264 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6265 0         0  
6266             $i = $left;
6267             last;
6268             }
6269             }
6270             }
6271              
6272 0         0 # escape $ @ / and \
6273             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6274             $char[$i] = '\\' . $char[$i];
6275             }
6276              
6277 0         0 # rewrite character class or escape character
6278             elsif (my $char = character_class($char[$i],$modifier)) {
6279             $char[$i] = $char;
6280             }
6281              
6282 0 0       0 # /i modifier
6283 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
6284             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
6285             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
6286 0         0 }
6287             else {
6288             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
6289             }
6290             }
6291              
6292 0 0       0 # quote character before ? + * {
6293             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6294             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6295 0         0 }
6296             else {
6297             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6298             }
6299             }
6300 0         0 }
6301 2         4  
6302             $delimiter = '/';
6303 2         5 $end_delimiter = '/';
6304 2         4  
6305             $modifier =~ tr/i//d;
6306             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6307             }
6308              
6309             #
6310             # escape regexp (m''b, qr''b)
6311 2     0 0 13 #
6312             sub e_qr_qb {
6313             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6314 0         0  
6315             # split regexp
6316             my @char = $string =~ /\G ((?>[^\\]|\\\\)) /oxmsg;
6317 0         0  
6318 0 0       0 # unescape character
    0          
6319             for (my $i=0; $i <= $#char; $i++) {
6320             if (0) {
6321             }
6322 0         0  
6323             # remain \\
6324             elsif ($char[$i] eq '\\\\') {
6325             }
6326              
6327 0         0 # escape $ @ / and \
6328             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6329             $char[$i] = '\\' . $char[$i];
6330             }
6331 0         0 }
6332 0         0  
6333 0         0 $delimiter = '/';
6334             $end_delimiter = '/';
6335             return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6336             }
6337              
6338             #
6339             # escape regexp (s/here//)
6340 0     76 0 0 #
6341 76   100     232 sub e_s1 {
6342             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6343 76         717 $modifier ||= '';
6344 76 50       128  
6345 76         206 $modifier =~ tr/p//d;
6346 0         0 if ($modifier =~ /([adlu])/oxms) {
6347 0 0       0 my $line = 0;
6348 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6349 0         0 if ($filename ne __FILE__) {
6350             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6351             last;
6352 0         0 }
6353             }
6354             die qq{Unsupported modifier "$1" used at line $line.\n};
6355 0         0 }
6356              
6357             $slash = 'div';
6358 76 100       162  
    50          
6359 76         276 # literal null string pattern
6360 8         9 if ($string eq '') {
6361 8         9 $modifier =~ tr/bB//d;
6362             $modifier =~ tr/i//d;
6363             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6364             }
6365              
6366             # /b /B modifier
6367             elsif ($modifier =~ tr/bB//d) {
6368 8 0       51  
6369 0         0 # choice again delimiter
6370 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
6371 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
6372 0         0 my %octet = map {$_ => 1} @char;
6373 0         0 if (not $octet{')'}) {
6374             $delimiter = '(';
6375             $end_delimiter = ')';
6376 0         0 }
6377 0         0 elsif (not $octet{'}'}) {
6378             $delimiter = '{';
6379             $end_delimiter = '}';
6380 0         0 }
6381 0         0 elsif (not $octet{']'}) {
6382             $delimiter = '[';
6383             $end_delimiter = ']';
6384 0         0 }
6385 0         0 elsif (not $octet{'>'}) {
6386             $delimiter = '<';
6387             $end_delimiter = '>';
6388 0         0 }
6389 0 0       0 else {
6390 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6391 0         0 if (not $octet{$char}) {
6392 0         0 $delimiter = $char;
6393             $end_delimiter = $char;
6394             last;
6395             }
6396             }
6397             }
6398 0         0 }
6399 0         0  
6400             my $prematch = '';
6401             return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6402 0 100       0 }
6403 68         9811  
6404             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6405             my $metachar = qr/[\@\\|[\]{^]/oxms;
6406 68         295  
6407             # split regexp
6408             my @char = $string =~ /\G((?>
6409             [^\\\$\@\[\(] |
6410             \\ (?>[1-9][0-9]*) |
6411             \\g (?>\s*) (?>[1-9][0-9]*) |
6412             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6413             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6414             \\x (?>[0-9A-Fa-f]{1,2}) |
6415             \\ (?>[0-7]{2,3}) |
6416             \\c [\x40-\x5F] |
6417             \\x\{ (?>[0-9A-Fa-f]+) \} |
6418             \\o\{ (?>[0-7]+) \} |
6419             \\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
6420             \\ $q_char |
6421             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6422             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6423             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6424             [\$\@] $qq_variable |
6425             \$ (?>\s* [0-9]+) |
6426             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6427             \$ \$ (?![\w\{]) |
6428             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6429             \[\^ |
6430             \[\: (?>[a-z]+) :\] |
6431             \[\:\^ (?>[a-z]+) :\] |
6432             \(\? |
6433             $q_char
6434             ))/oxmsg;
6435 68 50       18886  
6436 68         763 # choice again delimiter
  0         0  
6437 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
6438 0         0 my %octet = map {$_ => 1} @char;
6439 0         0 if (not $octet{')'}) {
6440             $delimiter = '(';
6441             $end_delimiter = ')';
6442 0         0 }
6443 0         0 elsif (not $octet{'}'}) {
6444             $delimiter = '{';
6445             $end_delimiter = '}';
6446 0         0 }
6447 0         0 elsif (not $octet{']'}) {
6448             $delimiter = '[';
6449             $end_delimiter = ']';
6450 0         0 }
6451 0         0 elsif (not $octet{'>'}) {
6452             $delimiter = '<';
6453             $end_delimiter = '>';
6454 0         0 }
6455 0 0       0 else {
6456 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6457 0         0 if (not $octet{$char}) {
6458 0         0 $delimiter = $char;
6459             $end_delimiter = $char;
6460             last;
6461             }
6462             }
6463             }
6464             }
6465 0         0  
  68         164  
6466             # count '('
6467 253         451 my $parens = grep { $_ eq '(' } @char;
6468 68         127  
6469 68         141 my $left_e = 0;
6470             my $right_e = 0;
6471             for (my $i=0; $i <= $#char; $i++) {
6472 68 50 33     228  
    50 33        
    100          
    100          
    50          
    50          
6473 195         1184 # "\L\u" --> "\u\L"
6474             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6475             @char[$i,$i+1] = @char[$i+1,$i];
6476             }
6477              
6478 0         0 # "\U\l" --> "\l\U"
6479             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6480             @char[$i,$i+1] = @char[$i+1,$i];
6481             }
6482              
6483 0         0 # octal escape sequence
6484             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6485             $char[$i] = Ewindows1258::octchr($1);
6486             }
6487              
6488 1         4 # hexadecimal escape sequence
6489             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6490             $char[$i] = Ewindows1258::hexchr($1);
6491             }
6492              
6493             # \b{...} --> b\{...}
6494             # \B{...} --> B\{...}
6495             # \N{CHARNAME} --> N\{CHARNAME}
6496             # \p{PROPERTY} --> p\{PROPERTY}
6497 1         3 # \P{PROPERTY} --> P\{PROPERTY}
6498             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
6499             $char[$i] = $1 . '\\' . $2;
6500             }
6501              
6502 0         0 # \p, \P, \X --> p, P, X
6503             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6504             $char[$i] = $1;
6505 0 50 66     0 }
    100 66        
    50 100        
    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          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
6506              
6507             if (0) {
6508             }
6509 195         720  
6510 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
6511 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6512             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)) {
6513             $char[$i] .= join '', splice @char, $i+1, 3;
6514 0         0 }
6515             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)) {
6516             $char[$i] .= join '', splice @char, $i+1, 2;
6517 0         0 }
6518             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)) {
6519             $char[$i] .= join '', splice @char, $i+1, 1;
6520             }
6521             }
6522              
6523 0         0 # open character class [...]
6524 13 50       23 elsif ($char[$i] eq '[') {
6525 13         58 my $left = $i;
6526             if ($char[$i+1] eq ']') {
6527 0         0 $i++;
6528 13 50       20 }
6529 58         146 while (1) {
6530             if (++$i > $#char) {
6531 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6532 58         155 }
6533             if ($char[$i] eq ']') {
6534             my $right = $i;
6535 13 50       22  
6536 13         86 # [...]
  0         0  
6537             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6538             splice @char, $left, $right-$left+1, sprintf(q{@{[Ewindows1258::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6539 0         0 }
6540             else {
6541             splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
6542 13         60 }
6543 13         28  
6544             $i = $left;
6545             last;
6546             }
6547             }
6548             }
6549              
6550 13         37 # open character class [^...]
6551 0 0       0 elsif ($char[$i] eq '[^') {
6552 0         0 my $left = $i;
6553             if ($char[$i+1] eq ']') {
6554 0         0 $i++;
6555 0 0       0 }
6556 0         0 while (1) {
6557             if (++$i > $#char) {
6558 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6559 0         0 }
6560             if ($char[$i] eq ']') {
6561             my $right = $i;
6562 0 0       0  
6563 0         0 # [^...]
  0         0  
6564             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6565             splice @char, $left, $right-$left+1, sprintf(q{@{[Ewindows1258::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6566 0         0 }
6567             else {
6568             splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6569 0         0 }
6570 0         0  
6571             $i = $left;
6572             last;
6573             }
6574             }
6575             }
6576              
6577 0         0 # rewrite character class or escape character
6578             elsif (my $char = character_class($char[$i],$modifier)) {
6579             $char[$i] = $char;
6580             }
6581              
6582 7 50       13 # /i modifier
6583 3         5 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
6584             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
6585             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
6586 3         5 }
6587             else {
6588             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
6589             }
6590             }
6591              
6592 0 0       0 # \u \l \U \L \F \Q \E
6593 0         0 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6594             if ($right_e < $left_e) {
6595             $char[$i] = '\\' . $char[$i];
6596             }
6597 0         0 }
6598 0         0 elsif ($char[$i] eq '\u') {
6599             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
6600             $left_e++;
6601 0         0 }
6602 0         0 elsif ($char[$i] eq '\l') {
6603             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
6604             $left_e++;
6605 0         0 }
6606 0         0 elsif ($char[$i] eq '\U') {
6607             $char[$i] = '@{[Ewindows1258::uc qq<';
6608             $left_e++;
6609 0         0 }
6610 0         0 elsif ($char[$i] eq '\L') {
6611             $char[$i] = '@{[Ewindows1258::lc qq<';
6612             $left_e++;
6613 0         0 }
6614 0         0 elsif ($char[$i] eq '\F') {
6615             $char[$i] = '@{[Ewindows1258::fc qq<';
6616             $left_e++;
6617 0         0 }
6618 0         0 elsif ($char[$i] eq '\Q') {
6619             $char[$i] = '@{[CORE::quotemeta qq<';
6620             $left_e++;
6621 0 0       0 }
6622 0         0 elsif ($char[$i] eq '\E') {
6623 0         0 if ($right_e < $left_e) {
6624             $char[$i] = '>]}';
6625             $right_e++;
6626 0         0 }
6627             else {
6628             $char[$i] = '';
6629             }
6630 0         0 }
6631 0 0       0 elsif ($char[$i] eq '\Q') {
6632 0         0 while (1) {
6633             if (++$i > $#char) {
6634 0 0       0 last;
6635 0         0 }
6636             if ($char[$i] eq '\E') {
6637             last;
6638             }
6639             }
6640             }
6641             elsif ($char[$i] eq '\E') {
6642             }
6643              
6644             # \0 --> \0
6645             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
6646             }
6647              
6648             # \g{N}, \g{-N}
6649              
6650             # P.108 Using Simple Patterns
6651             # in Chapter 7: In the World of Regular Expressions
6652             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
6653              
6654             # P.221 Capturing
6655             # in Chapter 5: Pattern Matching
6656             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6657              
6658             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
6659             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6660             }
6661              
6662             # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
6663             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6664             }
6665              
6666             # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
6667             elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6668             }
6669              
6670             # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
6671             elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6672             }
6673              
6674 0 0       0 # $0 --> $0
6675 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6676             if ($ignorecase) {
6677             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6678             }
6679 0 0       0 }
6680 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6681             if ($ignorecase) {
6682             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6683             }
6684             }
6685              
6686             # $$ --> $$
6687             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6688             }
6689              
6690             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6691 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6692 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6693 0         0 $char[$i] = e_capture($1);
6694             if ($ignorecase) {
6695             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6696             }
6697 0         0 }
6698 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6699 0         0 $char[$i] = e_capture($1);
6700             if ($ignorecase) {
6701             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6702             }
6703             }
6704              
6705 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6706 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
6707 0         0 $char[$i] = e_capture($1.'->'.$2);
6708             if ($ignorecase) {
6709             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6710             }
6711             }
6712              
6713 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6714 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
6715 0         0 $char[$i] = e_capture($1.'->'.$2);
6716             if ($ignorecase) {
6717             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6718             }
6719             }
6720              
6721 0         0 # $$foo
6722 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6723 0         0 $char[$i] = e_capture($1);
6724             if ($ignorecase) {
6725             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6726             }
6727             }
6728              
6729 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
6730 4         13 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6731             if ($ignorecase) {
6732             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::PREMATCH())]}';
6733 0         0 }
6734             else {
6735             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
6736             }
6737             }
6738              
6739 4 50       16 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
6740 4         14 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6741             if ($ignorecase) {
6742             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::MATCH())]}';
6743 0         0 }
6744             else {
6745             $char[$i] = '@{[Ewindows1258::MATCH()]}';
6746             }
6747             }
6748              
6749 4 50       16 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
6750 3         10 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6751             if ($ignorecase) {
6752             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::POSTMATCH())]}';
6753 0         0 }
6754             else {
6755             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
6756             }
6757             }
6758              
6759 3 0       11 # ${ foo }
6760 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
6761             if ($ignorecase) {
6762             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6763             }
6764             }
6765              
6766 0         0 # ${ ... }
6767 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6768 0         0 $char[$i] = e_capture($1);
6769             if ($ignorecase) {
6770             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6771             }
6772             }
6773              
6774 0         0 # $scalar or @array
6775 4 50       22 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6776 4         20 $char[$i] = e_string($char[$i]);
6777             if ($ignorecase) {
6778             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6779             }
6780             }
6781              
6782 0 50       0 # quote character before ? + * {
6783             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6784             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6785 13         77 }
6786             else {
6787             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6788             }
6789             }
6790             }
6791 13         69  
6792 68         162 # make regexp string
6793 68 50       249 my $prematch = '';
6794 68         171 $modifier =~ tr/i//d;
6795             if ($left_e > $right_e) {
6796 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6797             }
6798             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6799             }
6800              
6801             #
6802             # escape regexp (s'here'' or s'here''b)
6803 68     21 0 874 #
6804 21   100     49 sub e_s1_q {
6805             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6806 21         66 $modifier ||= '';
6807 21 50       33  
6808 21         41 $modifier =~ tr/p//d;
6809 0         0 if ($modifier =~ /([adlu])/oxms) {
6810 0 0       0 my $line = 0;
6811 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6812 0         0 if ($filename ne __FILE__) {
6813             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6814             last;
6815 0         0 }
6816             }
6817             die qq{Unsupported modifier "$1" used at line $line.\n};
6818 0         0 }
6819              
6820             $slash = 'div';
6821 21 100       30  
    50          
6822 21         54 # literal null string pattern
6823 8         10 if ($string eq '') {
6824 8         10 $modifier =~ tr/bB//d;
6825             $modifier =~ tr/i//d;
6826             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6827             }
6828              
6829 8         44 # with /b /B modifier
6830             elsif ($modifier =~ tr/bB//d) {
6831             return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6832             }
6833              
6834 0         0 # without /b /B modifier
6835             else {
6836             return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6837             }
6838             }
6839              
6840             #
6841             # escape regexp (s'here'')
6842 13     13 0 29 #
6843             sub e_s1_qt {
6844 13 50       27 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6845              
6846             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6847 13         30  
6848             # split regexp
6849             my @char = $string =~ /\G((?>
6850             [^\\\[\$\@\/] |
6851             [\x00-\xFF] |
6852             \[\^ |
6853             \[\: (?>[a-z]+) \:\] |
6854             \[\:\^ (?>[a-z]+) \:\] |
6855             [\$\@\/] |
6856             \\ (?:$q_char) |
6857             (?:$q_char)
6858             ))/oxmsg;
6859 13         199  
6860 13 50 33     39 # unescape character
    50 33        
    50 66        
    100          
    50          
    50          
6861             for (my $i=0; $i <= $#char; $i++) {
6862             if (0) {
6863             }
6864 25         106  
6865 0         0 # open character class [...]
6866 0 0       0 elsif ($char[$i] eq '[') {
6867 0         0 my $left = $i;
6868             if ($char[$i+1] eq ']') {
6869 0         0 $i++;
6870 0 0       0 }
6871 0         0 while (1) {
6872             if (++$i > $#char) {
6873 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6874 0         0 }
6875             if ($char[$i] eq ']') {
6876             my $right = $i;
6877 0         0  
6878             # [...]
6879 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
6880 0         0  
6881             $i = $left;
6882             last;
6883             }
6884             }
6885             }
6886              
6887 0         0 # open character class [^...]
6888 0 0       0 elsif ($char[$i] eq '[^') {
6889 0         0 my $left = $i;
6890             if ($char[$i+1] eq ']') {
6891 0         0 $i++;
6892 0 0       0 }
6893 0         0 while (1) {
6894             if (++$i > $#char) {
6895 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6896 0         0 }
6897             if ($char[$i] eq ']') {
6898             my $right = $i;
6899 0         0  
6900             # [^...]
6901 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6902 0         0  
6903             $i = $left;
6904             last;
6905             }
6906             }
6907             }
6908              
6909 0         0 # escape $ @ / and \
6910             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6911             $char[$i] = '\\' . $char[$i];
6912             }
6913              
6914 0         0 # rewrite character class or escape character
6915             elsif (my $char = character_class($char[$i],$modifier)) {
6916             $char[$i] = $char;
6917             }
6918              
6919 6 0       13 # /i modifier
6920 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
6921             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
6922             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
6923 0         0 }
6924             else {
6925             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
6926             }
6927             }
6928              
6929 0 0       0 # quote character before ? + * {
6930             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6931             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6932 0         0 }
6933             else {
6934             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6935             }
6936             }
6937 0         0 }
6938 13         25  
6939 13         21 $modifier =~ tr/i//d;
6940 13         15 $delimiter = '/';
6941 13         15 $end_delimiter = '/';
6942             my $prematch = '';
6943             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6944             }
6945              
6946             #
6947             # escape regexp (s'here''b)
6948 13     0 0 93 #
6949             sub e_s1_qb {
6950             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6951 0         0  
6952             # split regexp
6953             my @char = $string =~ /\G (?>[^\\]|\\\\) /oxmsg;
6954 0         0  
6955 0 0       0 # unescape character
    0          
6956             for (my $i=0; $i <= $#char; $i++) {
6957             if (0) {
6958             }
6959 0         0  
6960             # remain \\
6961             elsif ($char[$i] eq '\\\\') {
6962             }
6963              
6964 0         0 # escape $ @ / and \
6965             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6966             $char[$i] = '\\' . $char[$i];
6967             }
6968 0         0 }
6969 0         0  
6970 0         0 $delimiter = '/';
6971 0         0 $end_delimiter = '/';
6972             my $prematch = '';
6973             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6974             }
6975              
6976             #
6977             # escape regexp (s''here')
6978 0     16 0 0 #
6979             sub e_s2_q {
6980 16         35 my($ope,$delimiter,$end_delimiter,$string) = @_;
6981              
6982 16         22 $slash = 'div';
6983 16         91  
6984 16 100       42 my @char = $string =~ / \G (?>[^\\]|\\\\|$q_char) /oxmsg;
    100          
6985             for (my $i=0; $i <= $#char; $i++) {
6986             if (0) {
6987             }
6988 9         31  
6989             # not escape \\
6990             elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
6991             }
6992              
6993 0         0 # escape $ @ / and \
6994             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6995             $char[$i] = '\\' . $char[$i];
6996             }
6997 5         14 }
6998              
6999             return join '', $ope, $delimiter, @char, $end_delimiter;
7000             }
7001              
7002             #
7003             # escape regexp (s/here/and here/modifier)
7004 16     97 0 49 #
7005 97   100     850 sub e_sub {
7006             my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
7007 97         400 $modifier ||= '';
7008 97 50       212  
7009 97         281 $modifier =~ tr/p//d;
7010 0         0 if ($modifier =~ /([adlu])/oxms) {
7011 0 0       0 my $line = 0;
7012 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7013 0         0 if ($filename ne __FILE__) {
7014             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7015             last;
7016 0         0 }
7017             }
7018             die qq{Unsupported modifier "$1" used at line $line.\n};
7019 0 100       0 }
7020 97         277  
7021 36         53 if ($variable eq '') {
7022             $variable = '$_';
7023             $bind_operator = ' =~ ';
7024 36         46 }
7025              
7026             $slash = 'div';
7027              
7028             # P.128 Start of match (or end of previous match): \G
7029             # P.130 Advanced Use of \G with Perl
7030             # in Chapter 3: Overview of Regular Expression Features and Flavors
7031             # P.312 Iterative Matching: Scalar Context, with /g
7032             # in Chapter 7: Perl
7033             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
7034              
7035             # P.181 Where You Left Off: The \G Assertion
7036             # in Chapter 5: Pattern Matching
7037             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7038              
7039             # P.220 Where You Left Off: The \G Assertion
7040             # in Chapter 5: Pattern Matching
7041 97         1345 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7042 97         151  
7043             my $e_modifier = $modifier =~ tr/e//d;
7044 97         158 my $r_modifier = $modifier =~ tr/r//d;
7045 97 50       152  
7046 97         244 my $my = '';
7047 0         0 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
7048 0         0 $my = $variable;
7049             $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
7050             $variable =~ s/ = .+ \z//oxms;
7051 0         0 }
7052 97         247  
7053             (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
7054             $variable_basename =~ s/ \s+ \z//oxms;
7055 97         185  
7056 97 100       133 # quote replacement string
7057 97         238 my $e_replacement = '';
7058 17         40 if ($e_modifier >= 1) {
7059             $e_replacement = e_qq('', '', '', $replacement);
7060             $e_modifier--;
7061 17 100       30 }
7062 80         176 else {
7063             if ($delimiter2 eq "'") {
7064             $e_replacement = e_s2_q('qq', '/', '/', $replacement);
7065 16         34 }
7066             else {
7067             $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
7068             }
7069 64         173 }
7070              
7071             my $sub = '';
7072 97 100       168  
7073 97 100       220 # with /r
7074             if ($r_modifier) {
7075             if (0) {
7076             }
7077 8         26  
7078 0 50       0 # s///gr without multibyte anchoring
7079             elsif ($modifier =~ /g/oxms) {
7080             $sub = sprintf(
7081             # 1 2 3 4 5
7082             q,
7083              
7084             $variable, # 1
7085             ($delimiter1 eq "'") ? # 2
7086             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7087             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7088             $s_matched, # 3
7089             $e_replacement, # 4
7090             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 5
7091             );
7092             }
7093              
7094             # s///r
7095 4         20 else {
7096              
7097 4 50       8 my $prematch = q{$`};
7098              
7099             $sub = sprintf(
7100             # 1 2 3 4 5 6 7
7101             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Ewindows1258::re_r=%s; %s"%s$Ewindows1258::re_r$'" } : %s>,
7102              
7103             $variable, # 1
7104             ($delimiter1 eq "'") ? # 2
7105             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7106             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7107             $s_matched, # 3
7108             $e_replacement, # 4
7109             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 5
7110             $prematch, # 6
7111             $variable, # 7
7112             );
7113             }
7114 4 50       13  
7115 8         30 # $var !~ s///r doesn't make sense
7116             if ($bind_operator =~ / !~ /oxms) {
7117             $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
7118             }
7119             }
7120              
7121 0 100       0 # without /r
7122             else {
7123             if (0) {
7124             }
7125 89         231  
7126 0 100       0 # s///g without multibyte anchoring
    100          
7127             elsif ($modifier =~ /g/oxms) {
7128             $sub = sprintf(
7129             # 1 2 3 4 5 6 7 8
7130             q,
7131              
7132             $variable, # 1
7133             ($delimiter1 eq "'") ? # 2
7134             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7135             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7136             $s_matched, # 3
7137             $e_replacement, # 4
7138             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 5
7139             $variable, # 6
7140             $variable, # 7
7141             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
7142             );
7143             }
7144              
7145             # s///
7146 22         86 else {
7147              
7148 67 100       125 my $prematch = q{$`};
    100          
7149              
7150             $sub = sprintf(
7151              
7152             ($bind_operator =~ / =~ /oxms) ?
7153              
7154             # 1 2 3 4 5 6 7 8
7155             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Ewindows1258::re_r=%s; %s%s="%s$Ewindows1258::re_r$'"; 1 } : undef> :
7156              
7157             # 1 2 3 4 5 6 7 8
7158             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Ewindows1258::re_r=%s; %s%s="%s$Ewindows1258::re_r$'"; undef }>,
7159              
7160             $variable, # 1
7161             $bind_operator, # 2
7162             ($delimiter1 eq "'") ? # 3
7163             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7164             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7165             $s_matched, # 4
7166             $e_replacement, # 5
7167             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 6
7168             $variable, # 7
7169             $prematch, # 8
7170             );
7171             }
7172             }
7173 67 50       387  
7174 97         272 # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
7175             if ($my ne '') {
7176             $sub = "($my, $sub)[1]";
7177             }
7178 0         0  
7179 97         164 # clear s/// variable
7180             $sub_variable = '';
7181 97         142 $bind_operator = '';
7182              
7183             return $sub;
7184             }
7185              
7186             #
7187             # escape regexp of split qr//
7188 97     74 0 873 #
7189 74   100     358 sub e_split {
7190             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7191 74         456 $modifier ||= '';
7192 74 50       127  
7193 74         195 $modifier =~ tr/p//d;
7194 0         0 if ($modifier =~ /([adlu])/oxms) {
7195 0 0       0 my $line = 0;
7196 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7197 0         0 if ($filename ne __FILE__) {
7198             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7199             last;
7200 0         0 }
7201             }
7202             die qq{Unsupported modifier "$1" used at line $line.\n};
7203 0         0 }
7204              
7205             $slash = 'div';
7206 74 50       134  
7207 74         546 # /b /B modifier
7208             if ($modifier =~ tr/bB//d) {
7209             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7210 0 50       0 }
7211 74         278  
7212             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7213             my $metachar = qr/[\@\\|[\]{^]/oxms;
7214 74         429  
7215             # split regexp
7216             my @char = $string =~ /\G((?>
7217             [^\\\$\@\[\(] |
7218             \\x (?>[0-9A-Fa-f]{1,2}) |
7219             \\ (?>[0-7]{2,3}) |
7220             \\c [\x40-\x5F] |
7221             \\x\{ (?>[0-9A-Fa-f]+) \} |
7222             \\o\{ (?>[0-7]+) \} |
7223             \\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
7224             \\ $q_char |
7225             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7226             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7227             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7228             [\$\@] $qq_variable |
7229             \$ (?>\s* [0-9]+) |
7230             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7231             \$ \$ (?![\w\{]) |
7232             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7233             \[\^ |
7234             \[\: (?>[a-z]+) :\] |
7235             \[\:\^ (?>[a-z]+) :\] |
7236             \(\? |
7237             $q_char
7238 74         9699 ))/oxmsg;
7239 74         269  
7240 74         118 my $left_e = 0;
7241             my $right_e = 0;
7242             for (my $i=0; $i <= $#char; $i++) {
7243 74 50 33     442  
    50 33        
    100          
    100          
    50          
    50          
7244 249         1330 # "\L\u" --> "\u\L"
7245             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
7246             @char[$i,$i+1] = @char[$i+1,$i];
7247             }
7248              
7249 0         0 # "\U\l" --> "\l\U"
7250             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7251             @char[$i,$i+1] = @char[$i+1,$i];
7252             }
7253              
7254 0         0 # octal escape sequence
7255             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7256             $char[$i] = Ewindows1258::octchr($1);
7257             }
7258              
7259 1         4 # hexadecimal escape sequence
7260             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7261             $char[$i] = Ewindows1258::hexchr($1);
7262             }
7263              
7264             # \b{...} --> b\{...}
7265             # \B{...} --> B\{...}
7266             # \N{CHARNAME} --> N\{CHARNAME}
7267             # \p{PROPERTY} --> p\{PROPERTY}
7268 1         4 # \P{PROPERTY} --> P\{PROPERTY}
7269             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
7270             $char[$i] = $1 . '\\' . $2;
7271             }
7272              
7273 0         0 # \p, \P, \X --> p, P, X
7274             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7275             $char[$i] = $1;
7276 0 50 100     0 }
    100 33        
    50 33        
    100 100        
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
7277              
7278             if (0) {
7279             }
7280 249         863  
7281 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
7282 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7283             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)) {
7284             $char[$i] .= join '', splice @char, $i+1, 3;
7285 0         0 }
7286             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)) {
7287             $char[$i] .= join '', splice @char, $i+1, 2;
7288 0         0 }
7289             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)) {
7290             $char[$i] .= join '', splice @char, $i+1, 1;
7291             }
7292             }
7293              
7294 0         0 # open character class [...]
7295 3 50       4 elsif ($char[$i] eq '[') {
7296 3         10 my $left = $i;
7297             if ($char[$i+1] eq ']') {
7298 0         0 $i++;
7299 3 50       5 }
7300 7         14 while (1) {
7301             if (++$i > $#char) {
7302 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7303 7         12 }
7304             if ($char[$i] eq ']') {
7305             my $right = $i;
7306 3 50       5  
7307 3         15 # [...]
  0         0  
7308             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7309             splice @char, $left, $right-$left+1, sprintf(q{@{[Ewindows1258::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7310 0         0 }
7311             else {
7312             splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
7313 3         16 }
7314 3         6  
7315             $i = $left;
7316             last;
7317             }
7318             }
7319             }
7320              
7321 3         8 # open character class [^...]
7322 0 0       0 elsif ($char[$i] eq '[^') {
7323 0         0 my $left = $i;
7324             if ($char[$i+1] eq ']') {
7325 0         0 $i++;
7326 0 0       0 }
7327 0         0 while (1) {
7328             if (++$i > $#char) {
7329 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7330 0         0 }
7331             if ($char[$i] eq ']') {
7332             my $right = $i;
7333 0 0       0  
7334 0         0 # [^...]
  0         0  
7335             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7336             splice @char, $left, $right-$left+1, sprintf(q{@{[Ewindows1258::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7337 0         0 }
7338             else {
7339             splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7340 0         0 }
7341 0         0  
7342             $i = $left;
7343             last;
7344             }
7345             }
7346             }
7347              
7348 0         0 # rewrite character class or escape character
7349             elsif (my $char = character_class($char[$i],$modifier)) {
7350             $char[$i] = $char;
7351             }
7352              
7353             # P.794 29.2.161. split
7354             # in Chapter 29: Functions
7355             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7356              
7357             # P.951 split
7358             # in Chapter 27: Functions
7359             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7360              
7361             # said "The //m modifier is assumed when you split on the pattern /^/",
7362             # but perl5.008 is not so. Therefore, this software adds //m.
7363             # (and so on)
7364              
7365 1         3 # split(m/^/) --> split(m/^/m)
7366             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7367             $modifier .= 'm';
7368             }
7369              
7370 7 0       24 # /i modifier
7371 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
7372             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
7373             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
7374 0         0 }
7375             else {
7376             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
7377             }
7378             }
7379              
7380 0 0       0 # \u \l \U \L \F \Q \E
7381 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
7382             if ($right_e < $left_e) {
7383             $char[$i] = '\\' . $char[$i];
7384             }
7385 0         0 }
7386 0         0 elsif ($char[$i] eq '\u') {
7387             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
7388             $left_e++;
7389 0         0 }
7390 0         0 elsif ($char[$i] eq '\l') {
7391             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
7392             $left_e++;
7393 0         0 }
7394 0         0 elsif ($char[$i] eq '\U') {
7395             $char[$i] = '@{[Ewindows1258::uc qq<';
7396             $left_e++;
7397 0         0 }
7398 0         0 elsif ($char[$i] eq '\L') {
7399             $char[$i] = '@{[Ewindows1258::lc qq<';
7400             $left_e++;
7401 0         0 }
7402 0         0 elsif ($char[$i] eq '\F') {
7403             $char[$i] = '@{[Ewindows1258::fc qq<';
7404             $left_e++;
7405 0         0 }
7406 0         0 elsif ($char[$i] eq '\Q') {
7407             $char[$i] = '@{[CORE::quotemeta qq<';
7408             $left_e++;
7409 0 0       0 }
7410 0         0 elsif ($char[$i] eq '\E') {
7411 0         0 if ($right_e < $left_e) {
7412             $char[$i] = '>]}';
7413             $right_e++;
7414 0         0 }
7415             else {
7416             $char[$i] = '';
7417             }
7418 0         0 }
7419 0 0       0 elsif ($char[$i] eq '\Q') {
7420 0         0 while (1) {
7421             if (++$i > $#char) {
7422 0 0       0 last;
7423 0         0 }
7424             if ($char[$i] eq '\E') {
7425             last;
7426             }
7427             }
7428             }
7429             elsif ($char[$i] eq '\E') {
7430             }
7431              
7432 0 0       0 # $0 --> $0
7433 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7434             if ($ignorecase) {
7435             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7436             }
7437 0 0       0 }
7438 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7439             if ($ignorecase) {
7440             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7441             }
7442             }
7443              
7444             # $$ --> $$
7445             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7446             }
7447              
7448             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7449 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7450 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7451 0         0 $char[$i] = e_capture($1);
7452             if ($ignorecase) {
7453             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7454             }
7455 0         0 }
7456 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7457 0         0 $char[$i] = e_capture($1);
7458             if ($ignorecase) {
7459             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7460             }
7461             }
7462              
7463 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7464 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
7465 0         0 $char[$i] = e_capture($1.'->'.$2);
7466             if ($ignorecase) {
7467             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7468             }
7469             }
7470              
7471 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7472 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
7473 0         0 $char[$i] = e_capture($1.'->'.$2);
7474             if ($ignorecase) {
7475             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7476             }
7477             }
7478              
7479 0         0 # $$foo
7480 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7481 0         0 $char[$i] = e_capture($1);
7482             if ($ignorecase) {
7483             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7484             }
7485             }
7486              
7487 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
7488 12         33 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7489             if ($ignorecase) {
7490             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::PREMATCH())]}';
7491 0         0 }
7492             else {
7493             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
7494             }
7495             }
7496              
7497 12 50       50 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
7498 12         40 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7499             if ($ignorecase) {
7500             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::MATCH())]}';
7501 0         0 }
7502             else {
7503             $char[$i] = '@{[Ewindows1258::MATCH()]}';
7504             }
7505             }
7506              
7507 12 50       57 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
7508 9         27 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7509             if ($ignorecase) {
7510             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::POSTMATCH())]}';
7511 0         0 }
7512             else {
7513             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
7514             }
7515             }
7516              
7517 9 0       43 # ${ foo }
7518 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
7519             if ($ignorecase) {
7520             $char[$i] = '@{[Ewindows1258::ignorecase(' . $1 . ')]}';
7521             }
7522             }
7523              
7524 0         0 # ${ ... }
7525 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7526 0         0 $char[$i] = e_capture($1);
7527             if ($ignorecase) {
7528             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7529             }
7530             }
7531              
7532 0         0 # $scalar or @array
7533 3 50       11 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7534 3         12 $char[$i] = e_string($char[$i]);
7535             if ($ignorecase) {
7536             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7537             }
7538             }
7539              
7540 0 50       0 # quote character before ? + * {
7541             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7542             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7543 1         8 }
7544             else {
7545             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7546             }
7547             }
7548             }
7549 0         0  
7550 74 50       216 # make regexp string
7551 74         168 $modifier =~ tr/i//d;
7552             if ($left_e > $right_e) {
7553 0         0 return join '', 'Ewindows1258::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
7554             }
7555             return join '', 'Ewindows1258::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7556             }
7557              
7558             #
7559             # escape regexp of split qr''
7560 74     0 0 913 #
7561 0   0       sub e_split_q {
7562             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7563 0           $modifier ||= '';
7564 0 0          
7565 0           $modifier =~ tr/p//d;
7566 0           if ($modifier =~ /([adlu])/oxms) {
7567 0 0         my $line = 0;
7568 0           for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7569 0           if ($filename ne __FILE__) {
7570             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7571             last;
7572 0           }
7573             }
7574             die qq{Unsupported modifier "$1" used at line $line.\n};
7575 0           }
7576              
7577             $slash = 'div';
7578 0 0          
7579 0           # /b /B modifier
7580             if ($modifier =~ tr/bB//d) {
7581             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7582 0 0         }
7583              
7584             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7585 0            
7586             # split regexp
7587             my @char = $string =~ /\G((?>
7588             [^\\\[] |
7589             [\x00-\xFF] |
7590             \[\^ |
7591             \[\: (?>[a-z]+) \:\] |
7592             \[\:\^ (?>[a-z]+) \:\] |
7593             \\ (?:$q_char) |
7594             (?:$q_char)
7595             ))/oxmsg;
7596 0            
7597 0 0 0       # unescape character
    0 0        
    0 0        
    0 0        
    0          
    0          
7598             for (my $i=0; $i <= $#char; $i++) {
7599             if (0) {
7600             }
7601 0            
7602 0           # open character class [...]
7603 0 0         elsif ($char[$i] eq '[') {
7604 0           my $left = $i;
7605             if ($char[$i+1] eq ']') {
7606 0           $i++;
7607 0 0         }
7608 0           while (1) {
7609             if (++$i > $#char) {
7610 0 0         die __FILE__, ": Unmatched [] in regexp\n";
7611 0           }
7612             if ($char[$i] eq ']') {
7613             my $right = $i;
7614 0            
7615             # [...]
7616 0           splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
7617 0            
7618             $i = $left;
7619             last;
7620             }
7621             }
7622             }
7623              
7624 0           # open character class [^...]
7625 0 0         elsif ($char[$i] eq '[^') {
7626 0           my $left = $i;
7627             if ($char[$i+1] eq ']') {
7628 0           $i++;
7629 0 0         }
7630 0           while (1) {
7631             if (++$i > $#char) {
7632 0 0         die __FILE__, ": Unmatched [] in regexp\n";
7633 0           }
7634             if ($char[$i] eq ']') {
7635             my $right = $i;
7636 0            
7637             # [^...]
7638 0           splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7639 0            
7640             $i = $left;
7641             last;
7642             }
7643             }
7644             }
7645              
7646 0           # rewrite character class or escape character
7647             elsif (my $char = character_class($char[$i],$modifier)) {
7648             $char[$i] = $char;
7649             }
7650              
7651 0           # split(m/^/) --> split(m/^/m)
7652             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7653             $modifier .= 'm';
7654             }
7655              
7656 0 0         # /i modifier
7657 0           elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
7658             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
7659             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
7660 0           }
7661             else {
7662             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
7663             }
7664             }
7665              
7666 0 0         # quote character before ? + * {
7667             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7668             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7669 0           }
7670             else {
7671             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7672             }
7673             }
7674 0           }
7675 0            
7676             $modifier =~ tr/i//d;
7677             return join '', 'Ewindows1258::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7678             }
7679              
7680             #
7681             # instead of Carp::carp
7682 0     0 0   #
7683 0           sub carp {
7684             my($package,$filename,$line) = caller(1);
7685             print STDERR "@_ at $filename line $line.\n";
7686             }
7687              
7688             #
7689             # instead of Carp::croak
7690 0     0 0   #
7691 0           sub croak {
7692 0           my($package,$filename,$line) = caller(1);
7693             print STDERR "@_ at $filename line $line.\n";
7694             die "\n";
7695             }
7696              
7697             #
7698             # instead of Carp::cluck
7699 0     0 0   #
7700 0           sub cluck {
7701 0           my $i = 0;
7702 0           my @cluck = ();
7703 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7704             push @cluck, "[$i] $filename($line) $package::$subroutine\n";
7705 0           $i++;
7706 0           }
7707 0           print STDERR CORE::reverse @cluck;
7708             print STDERR "\n";
7709             print STDERR @_;
7710             }
7711              
7712             #
7713             # instead of Carp::confess
7714 0     0 0   #
7715 0           sub confess {
7716 0           my $i = 0;
7717 0           my @confess = ();
7718 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7719             push @confess, "[$i] $filename($line) $package::$subroutine\n";
7720 0           $i++;
7721 0           }
7722 0           print STDERR CORE::reverse @confess;
7723 0           print STDERR "\n";
7724             print STDERR @_;
7725             die "\n";
7726             }
7727              
7728             1;
7729              
7730             __END__