File Coverage

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


line stmt bran cond sub pod time code
1             package Ewindows1258;
2 204     204   1174 use strict;
  204         360  
  204         5300  
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   2581 use 5.00503; # Galapagos Consensus 1998 for primetools
  204         583  
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   963 use vars qw($VERSION);
  204         382  
  204         26521  
28             $VERSION = '1.15';
29             $VERSION = $VERSION;
30              
31             BEGIN {
32 204 50   204   1426 if ($^X =~ / jperl /oxmsi) {
33 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
34             }
35 204         354 if (CORE::ord('A') == 193) {
36             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
37             }
38 204         25489 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   13962 CORE::eval q{
  204     204   1158  
  204     70   447  
  204         21352  
  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       70966 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 0 if ($] < 5.006) {
69 0         0 return \do { local *_ };
  0         0  
70             }
71             else {
72 0         0 return undef;
73             }
74             }
75              
76             sub qualify ($$) {
77 0     0 0 0 my($name) = @_;
78              
79 0 0       0 if (ref $name) {
    0          
    0          
    0          
    0          
    0          
    0          
80 0         0 return $name;
81             }
82             elsif (Ewindows1258::index($name,'::') >= 0) {
83 0         0 return $name;
84             }
85             elsif (Ewindows1258::index($name,"'") >= 0) {
86 0         0 return $name;
87             }
88              
89             # special character, "^xyz"
90             elsif ($name =~ /\A \^ [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]+ \z/x) {
91              
92             # RGS 2001-11-05 : translate leading ^X to control-char
93 0         0 $name =~ s{\A \^ ([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]) }{'qq(\c'.$1.')'}xee;
  0         0  
94 0         0 return 'main::' . $name;
95             }
96              
97             # Global names
98             elsif ($name =~ /\A (?: ARGV | ARGVOUT | ENV | INC | SIG | STDERR | STDIN | STDOUT ) \z/x) {
99 0         0 return 'main::' . $name;
100             }
101              
102             # or other
103             elsif ($name =~ /\A [^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] \z/x) {
104 0         0 return 'main::' . $name;
105             }
106              
107             elsif (defined $_[1]) {
108 0         0 return $_[1] . '::' . $name;
109             }
110             else {
111 0         0 return (caller)[0] . '::' . $name;
112             }
113             }
114              
115             sub qualify_to_ref ($;$) {
116 0 0   0 0 0 if (defined $_[1]) {
117 204     204   1507 no strict qw(refs);
  204         393  
  204         13136  
118 0         0 return \*{ qualify $_[0], $_[1] };
  0         0  
119             }
120             else {
121 204     204   1198 no strict qw(refs);
  204     0   443  
  204         32886  
122 0         0 return \*{ qualify $_[0], (caller)[0] };
  0         0  
123             }
124             }
125             }
126              
127             # P.714 29.2.39. flock
128             # in Chapter 29: Functions
129             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
130              
131             # P.863 flock
132             # in Chapter 27: Functions
133             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
134              
135             sub LOCK_SH() {1}
136             sub LOCK_EX() {2}
137             sub LOCK_UN() {8}
138             sub LOCK_NB() {4}
139              
140             # instead of Carp.pm
141             sub carp;
142             sub croak;
143             sub cluck;
144             sub confess;
145              
146             # 6.18. Matching Multiple-Byte Characters
147             # in Chapter 6. Pattern Matching
148             # of ISBN 978-1-56592-243-3 Perl Perl Cookbook.
149             # (and so on)
150              
151             # regexp of character
152             my $your_char = q{[\x00-\xFF]};
153 204     204   1237 use vars qw($qq_char); $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  204         346  
  204         12221  
154 204     204   1195 use vars qw($q_char); $q_char = qr/$your_char/oxms;
  204         430  
  204         281499  
155              
156             #
157             # Windows-1258 character range per length
158             #
159             my %range_tr = ();
160              
161             #
162             # Windows-1258 case conversion
163             #
164             my %lc = ();
165             @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)} =
166             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
167             my %uc = ();
168             @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)} =
169             qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
170             my %fc = ();
171             @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)} =
172             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);
173              
174             if (0) {
175             }
176              
177             elsif (__PACKAGE__ =~ / \b Ewindows1258 \z/oxms) {
178             %range_tr = (
179             1 => [ [0x00..0xFF],
180             ],
181             );
182              
183             %lc = (%lc,
184             "\x8C" => "\x9C", # LATIN LIGATURE OE
185             "\x9F" => "\xFF", # LATIN LETTER Y WITH DIAERESIS
186             "\xC0" => "\xE0", # LATIN LETTER A WITH GRAVE
187             "\xC1" => "\xE1", # LATIN LETTER A WITH ACUTE
188             "\xC2" => "\xE2", # LATIN LETTER A WITH CIRCUMFLEX
189             "\xC3" => "\xE3", # LATIN LETTER A WITH BREVE
190             "\xC4" => "\xE4", # LATIN LETTER A WITH DIAERESIS
191             "\xC5" => "\xE5", # LATIN LETTER A WITH RING ABOVE
192             "\xC6" => "\xE6", # LATIN LETTER AE
193             "\xC7" => "\xE7", # LATIN LETTER C WITH CEDILLA
194             "\xC8" => "\xE8", # LATIN LETTER E WITH GRAVE
195             "\xC9" => "\xE9", # LATIN LETTER E WITH ACUTE
196             "\xCA" => "\xEA", # LATIN LETTER E WITH CIRCUMFLEX
197             "\xCB" => "\xEB", # LATIN LETTER E WITH DIAERESIS
198             "\xCD" => "\xED", # LATIN LETTER I WITH ACUTE
199             "\xCE" => "\xEE", # LATIN LETTER I WITH CIRCUMFLEX
200             "\xCF" => "\xEF", # LATIN LETTER I WITH DIAERESIS
201             "\xD0" => "\xF0", # LATIN LETTER D WITH STROKE
202             "\xD1" => "\xF1", # LATIN LETTER N WITH TILDE
203             "\xD3" => "\xF3", # LATIN LETTER O WITH ACUTE
204             "\xD4" => "\xF4", # LATIN LETTER O WITH CIRCUMFLEX
205             "\xD5" => "\xF5", # LATIN LETTER O WITH HORN
206             "\xD6" => "\xF6", # LATIN LETTER O WITH DIAERESIS
207             "\xD8" => "\xF8", # LATIN LETTER O WITH STROKE
208             "\xD9" => "\xF9", # LATIN LETTER U WITH GRAVE
209             "\xDA" => "\xFA", # LATIN LETTER U WITH ACUTE
210             "\xDB" => "\xFB", # LATIN LETTER U WITH CIRCUMFLEX
211             "\xDC" => "\xFC", # LATIN LETTER U WITH DIAERESIS
212             "\xDD" => "\xFD", # LATIN LETTER U WITH HORN
213             );
214              
215             %uc = (%uc,
216             "\x9C" => "\x8C", # LATIN LIGATURE OE
217             "\xFF" => "\x9F", # LATIN LETTER Y WITH DIAERESIS
218             "\xE0" => "\xC0", # LATIN LETTER A WITH GRAVE
219             "\xE1" => "\xC1", # LATIN LETTER A WITH ACUTE
220             "\xE2" => "\xC2", # LATIN LETTER A WITH CIRCUMFLEX
221             "\xE3" => "\xC3", # LATIN LETTER A WITH BREVE
222             "\xE4" => "\xC4", # LATIN LETTER A WITH DIAERESIS
223             "\xE5" => "\xC5", # LATIN LETTER A WITH RING ABOVE
224             "\xE6" => "\xC6", # LATIN LETTER AE
225             "\xE7" => "\xC7", # LATIN LETTER C WITH CEDILLA
226             "\xE8" => "\xC8", # LATIN LETTER E WITH GRAVE
227             "\xE9" => "\xC9", # LATIN LETTER E WITH ACUTE
228             "\xEA" => "\xCA", # LATIN LETTER E WITH CIRCUMFLEX
229             "\xEB" => "\xCB", # LATIN LETTER E WITH DIAERESIS
230             "\xED" => "\xCD", # LATIN LETTER I WITH ACUTE
231             "\xEE" => "\xCE", # LATIN LETTER I WITH CIRCUMFLEX
232             "\xEF" => "\xCF", # LATIN LETTER I WITH DIAERESIS
233             "\xF0" => "\xD0", # LATIN LETTER D WITH STROKE
234             "\xF1" => "\xD1", # LATIN LETTER N WITH TILDE
235             "\xF3" => "\xD3", # LATIN LETTER O WITH ACUTE
236             "\xF4" => "\xD4", # LATIN LETTER O WITH CIRCUMFLEX
237             "\xF5" => "\xD5", # LATIN LETTER O WITH HORN
238             "\xF6" => "\xD6", # LATIN LETTER O WITH DIAERESIS
239             "\xF8" => "\xD8", # LATIN LETTER O WITH STROKE
240             "\xF9" => "\xD9", # LATIN LETTER U WITH GRAVE
241             "\xFA" => "\xDA", # LATIN LETTER U WITH ACUTE
242             "\xFB" => "\xDB", # LATIN LETTER U WITH CIRCUMFLEX
243             "\xFC" => "\xDC", # LATIN LETTER U WITH DIAERESIS
244             "\xFD" => "\xDD", # LATIN LETTER U WITH HORN
245             );
246              
247             %fc = (%fc,
248             "\x8C" => "\x9C", # LATIN CAPITAL LIGATURE OE --> LATIN SMALL LIGATURE OE
249             "\x9F" => "\xFF", # LATIN CAPITAL LETTER Y WITH DIAERESIS --> LATIN SMALL LETTER Y WITH DIAERESIS
250             "\xC0" => "\xE0", # LATIN CAPITAL LETTER A WITH GRAVE --> LATIN SMALL LETTER A WITH GRAVE
251             "\xC1" => "\xE1", # LATIN CAPITAL LETTER A WITH ACUTE --> LATIN SMALL LETTER A WITH ACUTE
252             "\xC2" => "\xE2", # LATIN CAPITAL LETTER A WITH CIRCUMFLEX --> LATIN SMALL LETTER A WITH CIRCUMFLEX
253             "\xC3" => "\xE3", # LATIN CAPITAL LETTER A WITH BREVE --> LATIN SMALL LETTER A WITH BREVE
254             "\xC4" => "\xE4", # LATIN CAPITAL LETTER A WITH DIAERESIS --> LATIN SMALL LETTER A WITH DIAERESIS
255             "\xC5" => "\xE5", # LATIN CAPITAL LETTER A WITH RING ABOVE --> LATIN SMALL LETTER A WITH RING ABOVE
256             "\xC6" => "\xE6", # LATIN CAPITAL LETTER AE --> LATIN SMALL LETTER AE
257             "\xC7" => "\xE7", # LATIN CAPITAL LETTER C WITH CEDILLA --> LATIN SMALL LETTER C WITH CEDILLA
258             "\xC8" => "\xE8", # LATIN CAPITAL LETTER E WITH GRAVE --> LATIN SMALL LETTER E WITH GRAVE
259             "\xC9" => "\xE9", # LATIN CAPITAL LETTER E WITH ACUTE --> LATIN SMALL LETTER E WITH ACUTE
260             "\xCA" => "\xEA", # LATIN CAPITAL LETTER E WITH CIRCUMFLEX --> LATIN SMALL LETTER E WITH CIRCUMFLEX
261             "\xCB" => "\xEB", # LATIN CAPITAL LETTER E WITH DIAERESIS --> LATIN SMALL LETTER E WITH DIAERESIS
262             "\xCD" => "\xED", # LATIN CAPITAL LETTER I WITH ACUTE --> LATIN SMALL LETTER I WITH ACUTE
263             "\xCE" => "\xEE", # LATIN CAPITAL LETTER I WITH CIRCUMFLEX --> LATIN SMALL LETTER I WITH CIRCUMFLEX
264             "\xCF" => "\xEF", # LATIN CAPITAL LETTER I WITH DIAERESIS --> LATIN SMALL LETTER I WITH DIAERESIS
265             "\xD0" => "\xF0", # LATIN CAPITAL LETTER D WITH STROKE --> LATIN SMALL LETTER D WITH STROKE
266             "\xD1" => "\xF1", # LATIN CAPITAL LETTER N WITH TILDE --> LATIN SMALL LETTER N WITH TILDE
267             "\xD3" => "\xF3", # LATIN CAPITAL LETTER O WITH ACUTE --> LATIN SMALL LETTER O WITH ACUTE
268             "\xD4" => "\xF4", # LATIN CAPITAL LETTER O WITH CIRCUMFLEX --> LATIN SMALL LETTER O WITH CIRCUMFLEX
269             "\xD5" => "\xF5", # LATIN CAPITAL LETTER O WITH HORN --> LATIN SMALL LETTER O WITH HORN
270             "\xD6" => "\xF6", # LATIN CAPITAL LETTER O WITH DIAERESIS --> LATIN SMALL LETTER O WITH DIAERESIS
271             "\xD8" => "\xF8", # LATIN CAPITAL LETTER O WITH STROKE --> LATIN SMALL LETTER O WITH STROKE
272             "\xD9" => "\xF9", # LATIN CAPITAL LETTER U WITH GRAVE --> LATIN SMALL LETTER U WITH GRAVE
273             "\xDA" => "\xFA", # LATIN CAPITAL LETTER U WITH ACUTE --> LATIN SMALL LETTER U WITH ACUTE
274             "\xDB" => "\xFB", # LATIN CAPITAL LETTER U WITH CIRCUMFLEX --> LATIN SMALL LETTER U WITH CIRCUMFLEX
275             "\xDC" => "\xFC", # LATIN CAPITAL LETTER U WITH DIAERESIS --> LATIN SMALL LETTER U WITH DIAERESIS
276             "\xDD" => "\xFD", # LATIN CAPITAL LETTER U WITH HORN --> LATIN SMALL LETTER U WITH HORN
277             "\xDF" => "\x73\x73", # LATIN SMALL LETTER SHARP S --> LATIN SMALL LETTER S, LATIN SMALL LETTER S
278             );
279             }
280              
281             else {
282             croak "Don't know my package name '@{[__PACKAGE__]}'";
283             }
284              
285             #
286             # @ARGV wildcard globbing
287             #
288             sub import {
289              
290 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
291 0         0 my @argv = ();
292 0         0 for (@ARGV) {
293              
294             # has space
295 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
296 0 0       0 if (my @glob = Ewindows1258::glob(qq{"$_"})) {
297 0         0 push @argv, @glob;
298             }
299             else {
300 0         0 push @argv, $_;
301             }
302             }
303              
304             # has wildcard metachar
305             elsif (/\A (?:$q_char)*? [*?] /oxms) {
306 0 0       0 if (my @glob = Ewindows1258::glob($_)) {
307 0         0 push @argv, @glob;
308             }
309             else {
310 0         0 push @argv, $_;
311             }
312             }
313              
314             # no wildcard globbing
315             else {
316 0         0 push @argv, $_;
317             }
318             }
319 0         0 @ARGV = @argv;
320             }
321              
322 0         0 *Char::ord = \&Windows1258::ord;
323 0         0 *Char::ord_ = \&Windows1258::ord_;
324 0         0 *Char::reverse = \&Windows1258::reverse;
325 0         0 *Char::getc = \&Windows1258::getc;
326 0         0 *Char::length = \&Windows1258::length;
327 0         0 *Char::substr = \&Windows1258::substr;
328 0         0 *Char::index = \&Windows1258::index;
329 0         0 *Char::rindex = \&Windows1258::rindex;
330 0         0 *Char::eval = \&Windows1258::eval;
331 0         0 *Char::escape = \&Windows1258::escape;
332 0         0 *Char::escape_token = \&Windows1258::escape_token;
333 0         0 *Char::escape_script = \&Windows1258::escape_script;
334             }
335              
336             # P.230 Care with Prototypes
337             # in Chapter 6: Subroutines
338             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
339             #
340             # If you aren't careful, you can get yourself into trouble with prototypes.
341             # But if you are careful, you can do a lot of neat things with them. This is
342             # all very powerful, of course, and should only be used in moderation to make
343             # the world a better place.
344              
345             # P.332 Care with Prototypes
346             # in Chapter 7: Subroutines
347             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
348             #
349             # If you aren't careful, you can get yourself into trouble with prototypes.
350             # But if you are careful, you can do a lot of neat things with them. This is
351             # all very powerful, of course, and should only be used in moderation to make
352             # the world a better place.
353              
354             #
355             # Prototypes of subroutines
356             #
357       0     sub unimport {}
358             sub Ewindows1258::split(;$$$);
359             sub Ewindows1258::tr($$$$;$);
360             sub Ewindows1258::chop(@);
361             sub Ewindows1258::index($$;$);
362             sub Ewindows1258::rindex($$;$);
363             sub Ewindows1258::lcfirst(@);
364             sub Ewindows1258::lcfirst_();
365             sub Ewindows1258::lc(@);
366             sub Ewindows1258::lc_();
367             sub Ewindows1258::ucfirst(@);
368             sub Ewindows1258::ucfirst_();
369             sub Ewindows1258::uc(@);
370             sub Ewindows1258::uc_();
371             sub Ewindows1258::fc(@);
372             sub Ewindows1258::fc_();
373             sub Ewindows1258::ignorecase;
374             sub Ewindows1258::classic_character_class;
375             sub Ewindows1258::capture;
376             sub Ewindows1258::chr(;$);
377             sub Ewindows1258::chr_();
378             sub Ewindows1258::glob($);
379             sub Ewindows1258::glob_();
380              
381             sub Windows1258::ord(;$);
382             sub Windows1258::ord_();
383             sub Windows1258::reverse(@);
384             sub Windows1258::getc(;*@);
385             sub Windows1258::length(;$);
386             sub Windows1258::substr($$;$$);
387             sub Windows1258::index($$;$);
388             sub Windows1258::rindex($$;$);
389             sub Windows1258::escape(;$);
390              
391             #
392             # Regexp work
393             #
394 204         15135 use vars qw(
395             $re_a
396             $re_t
397             $re_n
398             $re_r
399 204     204   1443 );
  204         404  
400              
401             #
402             # Character class
403             #
404 204         1731497 use vars qw(
405             $dot
406             $dot_s
407             $eD
408             $eS
409             $eW
410             $eH
411             $eV
412             $eR
413             $eN
414             $not_alnum
415             $not_alpha
416             $not_ascii
417             $not_blank
418             $not_cntrl
419             $not_digit
420             $not_graph
421             $not_lower
422             $not_lower_i
423             $not_print
424             $not_punct
425             $not_space
426             $not_upper
427             $not_upper_i
428             $not_word
429             $not_xdigit
430             $eb
431             $eB
432 204     204   1189 );
  204         407  
433              
434             ${Ewindows1258::dot} = qr{(?>[^\x0A])};
435             ${Ewindows1258::dot_s} = qr{(?>[\x00-\xFF])};
436             ${Ewindows1258::eD} = qr{(?>[^0-9])};
437              
438             # Vertical tabs are now whitespace
439             # \s in a regex now matches a vertical tab in all circumstances.
440             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
441             # ${Ewindows1258::eS} = qr{(?>[^\x09\x0A \x0C\x0D\x20])};
442             # ${Ewindows1258::eS} = qr{(?>[^\x09\x0A\x0B\x0C\x0D\x20])};
443             ${Ewindows1258::eS} = qr{(?>[^\s])};
444              
445             ${Ewindows1258::eW} = qr{(?>[^0-9A-Z_a-z])};
446             ${Ewindows1258::eH} = qr{(?>[^\x09\x20])};
447             ${Ewindows1258::eV} = qr{(?>[^\x0A\x0B\x0C\x0D])};
448             ${Ewindows1258::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
449             ${Ewindows1258::eN} = qr{(?>[^\x0A])};
450             ${Ewindows1258::not_alnum} = qr{(?>[^\x30-\x39\x41-\x5A\x61-\x7A])};
451             ${Ewindows1258::not_alpha} = qr{(?>[^\x41-\x5A\x61-\x7A])};
452             ${Ewindows1258::not_ascii} = qr{(?>[^\x00-\x7F])};
453             ${Ewindows1258::not_blank} = qr{(?>[^\x09\x20])};
454             ${Ewindows1258::not_cntrl} = qr{(?>[^\x00-\x1F\x7F])};
455             ${Ewindows1258::not_digit} = qr{(?>[^\x30-\x39])};
456             ${Ewindows1258::not_graph} = qr{(?>[^\x21-\x7F])};
457             ${Ewindows1258::not_lower} = qr{(?>[^\x61-\x7A])};
458             ${Ewindows1258::not_lower_i} = qr{(?>[^\x41-\x5A\x61-\x7A])}; # Perl 5.16 compatible
459             # ${Ewindows1258::not_lower_i} = qr{(?>[\x00-\xFF])}; # older Perl compatible
460             ${Ewindows1258::not_print} = qr{(?>[^\x20-\x7F])};
461             ${Ewindows1258::not_punct} = qr{(?>[^\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E])};
462             ${Ewindows1258::not_space} = qr{(?>[^\s\x0B])};
463             ${Ewindows1258::not_upper} = qr{(?>[^\x41-\x5A])};
464             ${Ewindows1258::not_upper_i} = qr{(?>[^\x41-\x5A\x61-\x7A])}; # Perl 5.16 compatible
465             # ${Ewindows1258::not_upper_i} = qr{(?>[\x00-\xFF])}; # older Perl compatible
466             ${Ewindows1258::not_word} = qr{(?>[^\x30-\x39\x41-\x5A\x5F\x61-\x7A])};
467             ${Ewindows1258::not_xdigit} = qr{(?>[^\x30-\x39\x41-\x46\x61-\x66])};
468             ${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))};
469             ${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]))};
470              
471             # avoid: Name "Ewindows1258::foo" used only once: possible typo at here.
472             ${Ewindows1258::dot} = ${Ewindows1258::dot};
473             ${Ewindows1258::dot_s} = ${Ewindows1258::dot_s};
474             ${Ewindows1258::eD} = ${Ewindows1258::eD};
475             ${Ewindows1258::eS} = ${Ewindows1258::eS};
476             ${Ewindows1258::eW} = ${Ewindows1258::eW};
477             ${Ewindows1258::eH} = ${Ewindows1258::eH};
478             ${Ewindows1258::eV} = ${Ewindows1258::eV};
479             ${Ewindows1258::eR} = ${Ewindows1258::eR};
480             ${Ewindows1258::eN} = ${Ewindows1258::eN};
481             ${Ewindows1258::not_alnum} = ${Ewindows1258::not_alnum};
482             ${Ewindows1258::not_alpha} = ${Ewindows1258::not_alpha};
483             ${Ewindows1258::not_ascii} = ${Ewindows1258::not_ascii};
484             ${Ewindows1258::not_blank} = ${Ewindows1258::not_blank};
485             ${Ewindows1258::not_cntrl} = ${Ewindows1258::not_cntrl};
486             ${Ewindows1258::not_digit} = ${Ewindows1258::not_digit};
487             ${Ewindows1258::not_graph} = ${Ewindows1258::not_graph};
488             ${Ewindows1258::not_lower} = ${Ewindows1258::not_lower};
489             ${Ewindows1258::not_lower_i} = ${Ewindows1258::not_lower_i};
490             ${Ewindows1258::not_print} = ${Ewindows1258::not_print};
491             ${Ewindows1258::not_punct} = ${Ewindows1258::not_punct};
492             ${Ewindows1258::not_space} = ${Ewindows1258::not_space};
493             ${Ewindows1258::not_upper} = ${Ewindows1258::not_upper};
494             ${Ewindows1258::not_upper_i} = ${Ewindows1258::not_upper_i};
495             ${Ewindows1258::not_word} = ${Ewindows1258::not_word};
496             ${Ewindows1258::not_xdigit} = ${Ewindows1258::not_xdigit};
497             ${Ewindows1258::eb} = ${Ewindows1258::eb};
498             ${Ewindows1258::eB} = ${Ewindows1258::eB};
499              
500             #
501             # Windows-1258 split
502             #
503             sub Ewindows1258::split(;$$$) {
504              
505             # P.794 29.2.161. split
506             # in Chapter 29: Functions
507             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
508              
509             # P.951 split
510             # in Chapter 27: Functions
511             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
512              
513 0     0 0 0 my $pattern = $_[0];
514 0         0 my $string = $_[1];
515 0         0 my $limit = $_[2];
516              
517             # if $pattern is also omitted or is the literal space, " "
518 0 0       0 if (not defined $pattern) {
519 0         0 $pattern = ' ';
520             }
521              
522             # if $string is omitted, the function splits the $_ string
523 0 0       0 if (not defined $string) {
524 0 0       0 if (defined $_) {
525 0         0 $string = $_;
526             }
527             else {
528 0         0 $string = '';
529             }
530             }
531              
532 0         0 my @split = ();
533              
534             # when string is empty
535 0 0       0 if ($string eq '') {
    0          
536              
537             # resulting list value in list context
538 0 0       0 if (wantarray) {
539 0         0 return @split;
540             }
541              
542             # count of substrings in scalar context
543             else {
544 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
545 0         0 @_ = @split;
546 0         0 return scalar @_;
547             }
548             }
549              
550             # split's first argument is more consistently interpreted
551             #
552             # After some changes earlier in v5.17, split's behavior has been simplified:
553             # if the PATTERN argument evaluates to a string containing one space, it is
554             # treated the way that a literal string containing one space once was.
555             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
556              
557             # if $pattern is also omitted or is the literal space, " ", the function splits
558             # on whitespace, /\s+/, after skipping any leading whitespace
559             # (and so on)
560              
561             elsif ($pattern eq ' ') {
562 0 0       0 if (not defined $limit) {
563 0         0 return CORE::split(' ', $string);
564             }
565             else {
566 0         0 return CORE::split(' ', $string, $limit);
567             }
568             }
569              
570             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
571 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
572              
573             # a pattern capable of matching either the null string or something longer than the
574             # null string will split the value of $string into separate characters wherever it
575             # matches the null string between characters
576             # (and so on)
577              
578 0 0       0 if ('' =~ / \A $pattern \z /xms) {
579 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
580 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
581              
582             # P.1024 Appendix W.10 Multibyte Processing
583             # of ISBN 1-56592-224-7 CJKV Information Processing
584             # (and so on)
585              
586             # the //m modifier is assumed when you split on the pattern /^/
587             # (and so on)
588              
589             # V
590 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
591              
592             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
593             # is included in the resulting list, interspersed with the fields that are ordinarily returned
594             # (and so on)
595              
596 0         0 local $@;
597 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
598 0         0 push @split, CORE::eval('$' . $digit);
599             }
600             }
601             }
602              
603             else {
604 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
605              
606             # V
607 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
608 0         0 local $@;
609 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
610 0         0 push @split, CORE::eval('$' . $digit);
611             }
612             }
613             }
614             }
615              
616             elsif ($limit > 0) {
617 0 0       0 if ('' =~ / \A $pattern \z /xms) {
618 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
619 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
620              
621             # V
622 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
623 0         0 local $@;
624 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
625 0         0 push @split, CORE::eval('$' . $digit);
626             }
627             }
628             }
629             }
630             else {
631 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
632 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
633              
634             # V
635 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
636 0         0 local $@;
637 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
638 0         0 push @split, CORE::eval('$' . $digit);
639             }
640             }
641             }
642             }
643             }
644              
645 0 0       0 if (CORE::length($string) > 0) {
646 0         0 push @split, $string;
647             }
648              
649             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
650 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
651 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
652 0         0 pop @split;
653             }
654             }
655              
656             # resulting list value in list context
657 0 0       0 if (wantarray) {
658 0         0 return @split;
659             }
660              
661             # count of substrings in scalar context
662             else {
663 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
664 0         0 @_ = @split;
665 0         0 return scalar @_;
666             }
667             }
668              
669             #
670             # get last subexpression offsets
671             #
672             sub _last_subexpression_offsets {
673 0     0   0 my $pattern = $_[0];
674              
675             # remove comment
676 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
677              
678 0         0 my $modifier = '';
679 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
680 0         0 $modifier = $1;
681 0         0 $modifier =~ s/-[A-Za-z]*//;
682             }
683              
684             # with /x modifier
685 0         0 my @char = ();
686 0 0       0 if ($modifier =~ /x/oxms) {
687 0         0 @char = $pattern =~ /\G((?>
688             [^\\\#\[\(] |
689             \\ $q_char |
690             \# (?>[^\n]*) $ |
691             \[ (?>(?:[^\\\]]|\\\\|\\\]|$q_char)+) \] |
692             \(\? |
693             $q_char
694             ))/oxmsg;
695             }
696              
697             # without /x modifier
698             else {
699 0         0 @char = $pattern =~ /\G((?>
700             [^\\\[\(] |
701             \\ $q_char |
702             \[ (?>(?:[^\\\]]|\\\\|\\\]|$q_char)+) \] |
703             \(\? |
704             $q_char
705             ))/oxmsg;
706             }
707              
708 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
709             }
710              
711             #
712             # Windows-1258 transliteration (tr///)
713             #
714             sub Ewindows1258::tr($$$$;$) {
715              
716 0     0 0 0 my $bind_operator = $_[1];
717 0         0 my $searchlist = $_[2];
718 0         0 my $replacementlist = $_[3];
719 0   0     0 my $modifier = $_[4] || '';
720              
721 0 0       0 if ($modifier =~ /r/oxms) {
722 0 0       0 if ($bind_operator =~ / !~ /oxms) {
723 0         0 croak "Using !~ with tr///r doesn't make sense";
724             }
725             }
726              
727 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
728 0         0 my @searchlist = _charlist_tr($searchlist);
729 0         0 my @replacementlist = _charlist_tr($replacementlist);
730              
731 0         0 my %tr = ();
732 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
733 0 0       0 if (not exists $tr{$searchlist[$i]}) {
734 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
735 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
736             }
737             elsif ($modifier =~ /d/oxms) {
738 0         0 $tr{$searchlist[$i]} = '';
739             }
740             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
741 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
742             }
743             else {
744 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
745             }
746             }
747             }
748              
749 0         0 my $tr = 0;
750 0         0 my $replaced = '';
751 0 0       0 if ($modifier =~ /c/oxms) {
752 0         0 while (defined(my $char = shift @char)) {
753 0 0       0 if (not exists $tr{$char}) {
754 0 0       0 if (defined $replacementlist[0]) {
755 0         0 $replaced .= $replacementlist[0];
756             }
757 0         0 $tr++;
758 0 0       0 if ($modifier =~ /s/oxms) {
759 0   0     0 while (@char and (not exists $tr{$char[0]})) {
760 0         0 shift @char;
761 0         0 $tr++;
762             }
763             }
764             }
765             else {
766 0         0 $replaced .= $char;
767             }
768             }
769             }
770             else {
771 0         0 while (defined(my $char = shift @char)) {
772 0 0       0 if (exists $tr{$char}) {
773 0         0 $replaced .= $tr{$char};
774 0         0 $tr++;
775 0 0       0 if ($modifier =~ /s/oxms) {
776 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
777 0         0 shift @char;
778 0         0 $tr++;
779             }
780             }
781             }
782             else {
783 0         0 $replaced .= $char;
784             }
785             }
786             }
787              
788 0 0       0 if ($modifier =~ /r/oxms) {
789 0         0 return $replaced;
790             }
791             else {
792 0         0 $_[0] = $replaced;
793 0 0       0 if ($bind_operator =~ / !~ /oxms) {
794 0         0 return not $tr;
795             }
796             else {
797 0         0 return $tr;
798             }
799             }
800             }
801              
802             #
803             # Windows-1258 chop
804             #
805             sub Ewindows1258::chop(@) {
806              
807 0     0 0 0 my $chop;
808 0 0       0 if (@_ == 0) {
809 0         0 my @char = /\G (?>$q_char) /oxmsg;
810 0         0 $chop = pop @char;
811 0         0 $_ = join '', @char;
812             }
813             else {
814 0         0 for (@_) {
815 0         0 my @char = /\G (?>$q_char) /oxmsg;
816 0         0 $chop = pop @char;
817 0         0 $_ = join '', @char;
818             }
819             }
820 0         0 return $chop;
821             }
822              
823             #
824             # Windows-1258 index by octet
825             #
826             sub Ewindows1258::index($$;$) {
827              
828 0     0 1 0 my($str,$substr,$position) = @_;
829 0   0     0 $position ||= 0;
830 0         0 my $pos = 0;
831              
832 0         0 while ($pos < CORE::length($str)) {
833 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
834 0 0       0 if ($pos >= $position) {
835 0         0 return $pos;
836             }
837             }
838 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
839 0         0 $pos += CORE::length($1);
840             }
841             else {
842 0         0 $pos += 1;
843             }
844             }
845 0         0 return -1;
846             }
847              
848             #
849             # Windows-1258 reverse index
850             #
851             sub Ewindows1258::rindex($$;$) {
852              
853 0     0 0 0 my($str,$substr,$position) = @_;
854 0   0     0 $position ||= CORE::length($str) - 1;
855 0         0 my $pos = 0;
856 0         0 my $rindex = -1;
857              
858 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
859 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
860 0         0 $rindex = $pos;
861             }
862 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
863 0         0 $pos += CORE::length($1);
864             }
865             else {
866 0         0 $pos += 1;
867             }
868             }
869 0         0 return $rindex;
870             }
871              
872             #
873             # Windows-1258 lower case first with parameter
874             #
875             sub Ewindows1258::lcfirst(@) {
876 0 0   0 0 0 if (@_) {
877 0         0 my $s = shift @_;
878 0 0 0     0 if (@_ and wantarray) {
879 0         0 return Ewindows1258::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
880             }
881             else {
882 0         0 return Ewindows1258::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
883             }
884             }
885             else {
886 0         0 return Ewindows1258::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
887             }
888             }
889              
890             #
891             # Windows-1258 lower case first without parameter
892             #
893             sub Ewindows1258::lcfirst_() {
894 0     0 0 0 return Ewindows1258::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
895             }
896              
897             #
898             # Windows-1258 lower case with parameter
899             #
900             sub Ewindows1258::lc(@) {
901 0 0   0 0 0 if (@_) {
902 0         0 my $s = shift @_;
903 0 0 0     0 if (@_ and wantarray) {
904 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
905             }
906             else {
907 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
908             }
909             }
910             else {
911 0         0 return Ewindows1258::lc_();
912             }
913             }
914              
915             #
916             # Windows-1258 lower case without parameter
917             #
918             sub Ewindows1258::lc_() {
919 0     0 0 0 my $s = $_;
920 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
921             }
922              
923             #
924             # Windows-1258 upper case first with parameter
925             #
926             sub Ewindows1258::ucfirst(@) {
927 0 0   0 0 0 if (@_) {
928 0         0 my $s = shift @_;
929 0 0 0     0 if (@_ and wantarray) {
930 0         0 return Ewindows1258::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
931             }
932             else {
933 0         0 return Ewindows1258::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
934             }
935             }
936             else {
937 0         0 return Ewindows1258::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
938             }
939             }
940              
941             #
942             # Windows-1258 upper case first without parameter
943             #
944             sub Ewindows1258::ucfirst_() {
945 0     0 0 0 return Ewindows1258::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
946             }
947              
948             #
949             # Windows-1258 upper case with parameter
950             #
951             sub Ewindows1258::uc(@) {
952 0 50   174 0 0 if (@_) {
953 174         285 my $s = shift @_;
954 174 50 33     225 if (@_ and wantarray) {
955 174 0       319 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
956             }
957             else {
958 0 100       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  174         563  
959             }
960             }
961             else {
962 174         633 return Ewindows1258::uc_();
963             }
964             }
965              
966             #
967             # Windows-1258 upper case without parameter
968             #
969             sub Ewindows1258::uc_() {
970 0     0 0 0 my $s = $_;
971 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
972             }
973              
974             #
975             # Windows-1258 fold case with parameter
976             #
977             sub Ewindows1258::fc(@) {
978 0 50   197 0 0 if (@_) {
979 197         290 my $s = shift @_;
980 197 50 33     234 if (@_ and wantarray) {
981 197 0       363 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
982             }
983             else {
984 0 100       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  197         498  
985             }
986             }
987             else {
988 197         1020 return Ewindows1258::fc_();
989             }
990             }
991              
992             #
993             # Windows-1258 fold case without parameter
994             #
995             sub Ewindows1258::fc_() {
996 0     0 0 0 my $s = $_;
997 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
998             }
999              
1000             #
1001             # Windows-1258 regexp capture
1002             #
1003             {
1004             sub Ewindows1258::capture {
1005 0     0 1 0 return $_[0];
1006             }
1007             }
1008              
1009             #
1010             # Windows-1258 regexp ignore case modifier
1011             #
1012             sub Ewindows1258::ignorecase {
1013              
1014 0     0 0 0 my @string = @_;
1015 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
1016              
1017             # ignore case of $scalar or @array
1018 0         0 for my $string (@string) {
1019              
1020             # split regexp
1021 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
1022              
1023             # unescape character
1024 0         0 for (my $i=0; $i <= $#char; $i++) {
1025 0 0       0 next if not defined $char[$i];
1026              
1027             # open character class [...]
1028 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
1029 0         0 my $left = $i;
1030              
1031             # [] make die "unmatched [] in regexp ...\n"
1032              
1033 0 0       0 if ($char[$i+1] eq ']') {
1034 0         0 $i++;
1035             }
1036              
1037 0         0 while (1) {
1038 0 0       0 if (++$i > $#char) {
1039 0         0 croak "Unmatched [] in regexp";
1040             }
1041 0 0       0 if ($char[$i] eq ']') {
1042 0         0 my $right = $i;
1043 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
1044              
1045             # escape character
1046 0         0 for my $char (@charlist) {
1047 0 0       0 if (0) {
1048             }
1049              
1050 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1051 0         0 $char = '\\' . $char;
1052             }
1053             }
1054              
1055             # [...]
1056 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
1057              
1058 0         0 $i = $left;
1059 0         0 last;
1060             }
1061             }
1062             }
1063              
1064             # open character class [^...]
1065             elsif ($char[$i] eq '[^') {
1066 0         0 my $left = $i;
1067              
1068             # [^] make die "unmatched [] in regexp ...\n"
1069              
1070 0 0       0 if ($char[$i+1] eq ']') {
1071 0         0 $i++;
1072             }
1073              
1074 0         0 while (1) {
1075 0 0       0 if (++$i > $#char) {
1076 0         0 croak "Unmatched [] in regexp";
1077             }
1078 0 0       0 if ($char[$i] eq ']') {
1079 0         0 my $right = $i;
1080 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
1081              
1082             # escape character
1083 0         0 for my $char (@charlist) {
1084 0 0       0 if (0) {
1085             }
1086              
1087 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1088 0         0 $char = '\\' . $char;
1089             }
1090             }
1091              
1092             # [^...]
1093 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
1094              
1095 0         0 $i = $left;
1096 0         0 last;
1097             }
1098             }
1099             }
1100              
1101             # rewrite classic character class or escape character
1102             elsif (my $char = classic_character_class($char[$i])) {
1103 0         0 $char[$i] = $char;
1104             }
1105              
1106             # with /i modifier
1107             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1108 0         0 my $uc = Ewindows1258::uc($char[$i]);
1109 0         0 my $fc = Ewindows1258::fc($char[$i]);
1110 0 0       0 if ($uc ne $fc) {
1111 0 0       0 if (CORE::length($fc) == 1) {
1112 0         0 $char[$i] = '[' . $uc . $fc . ']';
1113             }
1114             else {
1115 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
1116             }
1117             }
1118             }
1119             }
1120              
1121             # characterize
1122 0         0 for (my $i=0; $i <= $#char; $i++) {
1123 0 0       0 next if not defined $char[$i];
1124              
1125 0 0       0 if (0) {
1126             }
1127              
1128             # quote character before ? + * {
1129 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
1130 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
1131 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
1132             }
1133             }
1134             }
1135              
1136 0         0 $string = join '', @char;
1137             }
1138              
1139             # make regexp string
1140 0         0 return @string;
1141             }
1142              
1143             #
1144             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
1145             #
1146             sub Ewindows1258::classic_character_class {
1147 0     1867 0 0 my($char) = @_;
1148              
1149             return {
1150             '\D' => '${Ewindows1258::eD}',
1151             '\S' => '${Ewindows1258::eS}',
1152             '\W' => '${Ewindows1258::eW}',
1153             '\d' => '[0-9]',
1154              
1155             # Before Perl 5.6, \s only matched the five whitespace characters
1156             # tab, newline, form-feed, carriage return, and the space character
1157             # itself, which, taken together, is the character class [\t\n\f\r ].
1158              
1159             # Vertical tabs are now whitespace
1160             # \s in a regex now matches a vertical tab in all circumstances.
1161             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1162             # \t \n \v \f \r space
1163             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1164             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1165             '\s' => '\s',
1166              
1167             '\w' => '[0-9A-Z_a-z]',
1168             '\C' => '[\x00-\xFF]',
1169             '\X' => 'X',
1170              
1171             # \h \v \H \V
1172              
1173             # P.114 Character Class Shortcuts
1174             # in Chapter 7: In the World of Regular Expressions
1175             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
1176              
1177             # P.357 13.2.3 Whitespace
1178             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
1179             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1180             #
1181             # 0x00009 CHARACTER TABULATION h s
1182             # 0x0000a LINE FEED (LF) vs
1183             # 0x0000b LINE TABULATION v
1184             # 0x0000c FORM FEED (FF) vs
1185             # 0x0000d CARRIAGE RETURN (CR) vs
1186             # 0x00020 SPACE h s
1187              
1188             # P.196 Table 5-9. Alphanumeric regex metasymbols
1189             # in Chapter 5. Pattern Matching
1190             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1191              
1192             # (and so on)
1193              
1194             '\H' => '${Ewindows1258::eH}',
1195             '\V' => '${Ewindows1258::eV}',
1196             '\h' => '[\x09\x20]',
1197             '\v' => '[\x0A\x0B\x0C\x0D]',
1198             '\R' => '${Ewindows1258::eR}',
1199              
1200             # \N
1201             #
1202             # http://perldoc.perl.org/perlre.html
1203             # Character Classes and other Special Escapes
1204             # Any character but \n (experimental). Not affected by /s modifier
1205              
1206             '\N' => '${Ewindows1258::eN}',
1207              
1208             # \b \B
1209              
1210             # P.180 Boundaries: The \b and \B Assertions
1211             # in Chapter 5: Pattern Matching
1212             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1213              
1214             # P.219 Boundaries: The \b and \B Assertions
1215             # in Chapter 5: Pattern Matching
1216             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1217              
1218             # \b really means (?:(?<=\w)(?!\w)|(?
1219             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
1220             '\b' => '${Ewindows1258::eb}',
1221              
1222             # \B really means (?:(?<=\w)(?=\w)|(?
1223             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
1224             '\B' => '${Ewindows1258::eB}',
1225              
1226 1867   100     2542 }->{$char} || '';
1227             }
1228              
1229             #
1230             # prepare Windows-1258 characters per length
1231             #
1232              
1233             # 1 octet characters
1234             my @chars1 = ();
1235             sub chars1 {
1236 1867 0   0 0 60969 if (@chars1) {
1237 0         0 return @chars1;
1238             }
1239 0 0       0 if (exists $range_tr{1}) {
1240 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
1241 0         0 while (my @range = splice(@ranges,0,1)) {
1242 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1243 0         0 push @chars1, pack 'C', $oct0;
1244             }
1245             }
1246             }
1247 0         0 return @chars1;
1248             }
1249              
1250             # 2 octets characters
1251             my @chars2 = ();
1252             sub chars2 {
1253 0 0   0 0 0 if (@chars2) {
1254 0         0 return @chars2;
1255             }
1256 0 0       0 if (exists $range_tr{2}) {
1257 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
1258 0         0 while (my @range = splice(@ranges,0,2)) {
1259 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1260 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1261 0         0 push @chars2, pack 'CC', $oct0,$oct1;
1262             }
1263             }
1264             }
1265             }
1266 0         0 return @chars2;
1267             }
1268              
1269             # 3 octets characters
1270             my @chars3 = ();
1271             sub chars3 {
1272 0 0   0 0 0 if (@chars3) {
1273 0         0 return @chars3;
1274             }
1275 0 0       0 if (exists $range_tr{3}) {
1276 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
1277 0         0 while (my @range = splice(@ranges,0,3)) {
1278 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1279 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1280 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1281 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
1282             }
1283             }
1284             }
1285             }
1286             }
1287 0         0 return @chars3;
1288             }
1289              
1290             # 4 octets characters
1291             my @chars4 = ();
1292             sub chars4 {
1293 0 0   0 0 0 if (@chars4) {
1294 0         0 return @chars4;
1295             }
1296 0 0       0 if (exists $range_tr{4}) {
1297 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
1298 0         0 while (my @range = splice(@ranges,0,4)) {
1299 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1300 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1301 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1302 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
1303 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
1304             }
1305             }
1306             }
1307             }
1308             }
1309             }
1310 0         0 return @chars4;
1311             }
1312              
1313             #
1314             # Windows-1258 open character list for tr
1315             #
1316             sub _charlist_tr {
1317              
1318 0     0   0 local $_ = shift @_;
1319              
1320             # unescape character
1321 0         0 my @char = ();
1322 0         0 while (not /\G \z/oxmsgc) {
1323 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
1324 0         0 push @char, '\-';
1325             }
1326             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
1327 0         0 push @char, CORE::chr(oct $1);
1328             }
1329             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
1330 0         0 push @char, CORE::chr(hex $1);
1331             }
1332             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
1333 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
1334             }
1335             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
1336             push @char, {
1337             '\0' => "\0",
1338             '\n' => "\n",
1339             '\r' => "\r",
1340             '\t' => "\t",
1341             '\f' => "\f",
1342             '\b' => "\x08", # \b means backspace in character class
1343             '\a' => "\a",
1344             '\e' => "\e",
1345 0         0 }->{$1};
1346             }
1347             elsif (/\G \\ ($q_char) /oxmsgc) {
1348 0         0 push @char, $1;
1349             }
1350             elsif (/\G ($q_char) /oxmsgc) {
1351 0         0 push @char, $1;
1352             }
1353             }
1354              
1355             # join separated multiple-octet
1356 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
1357              
1358             # unescape '-'
1359 0         0 my @i = ();
1360 0         0 for my $i (0 .. $#char) {
1361 0 0       0 if ($char[$i] eq '\-') {
    0          
1362 0         0 $char[$i] = '-';
1363             }
1364             elsif ($char[$i] eq '-') {
1365 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
1366 0         0 push @i, $i;
1367             }
1368             }
1369             }
1370              
1371             # open character list (reverse for splice)
1372 0         0 for my $i (CORE::reverse @i) {
1373 0         0 my @range = ();
1374              
1375             # range error
1376 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
1377 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1378             }
1379              
1380             # range of multiple-octet code
1381 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
1382 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
1383 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
1384             }
1385             elsif (CORE::length($char[$i+1]) == 2) {
1386 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1387 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
1388             }
1389             elsif (CORE::length($char[$i+1]) == 3) {
1390 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1391 0         0 push @range, chars2();
1392 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1393             }
1394             elsif (CORE::length($char[$i+1]) == 4) {
1395 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1396 0         0 push @range, chars2();
1397 0         0 push @range, chars3();
1398 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1399             }
1400             else {
1401 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1402             }
1403             }
1404             elsif (CORE::length($char[$i-1]) == 2) {
1405 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
1406 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
1407             }
1408             elsif (CORE::length($char[$i+1]) == 3) {
1409 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1410 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1411             }
1412             elsif (CORE::length($char[$i+1]) == 4) {
1413 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1414 0         0 push @range, chars3();
1415 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1416             }
1417             else {
1418 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1419             }
1420             }
1421             elsif (CORE::length($char[$i-1]) == 3) {
1422 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
1423 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
1424             }
1425             elsif (CORE::length($char[$i+1]) == 4) {
1426 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
1427 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1428             }
1429             else {
1430 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1431             }
1432             }
1433             elsif (CORE::length($char[$i-1]) == 4) {
1434 0 0       0 if (CORE::length($char[$i+1]) == 4) {
1435 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
1436             }
1437             else {
1438 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1439             }
1440             }
1441             else {
1442 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1443             }
1444              
1445 0         0 splice @char, $i-1, 3, @range;
1446             }
1447              
1448 0         0 return @char;
1449             }
1450              
1451             #
1452             # Windows-1258 open character class
1453             #
1454             sub _cc {
1455 0 0   0   0 if (scalar(@_) == 0) {
    0          
    0          
1456 0         0 die __FILE__, ": subroutine cc got no parameter.\n";
1457             }
1458             elsif (scalar(@_) == 1) {
1459 0         0 return sprintf('\x%02X',$_[0]);
1460             }
1461             elsif (scalar(@_) == 2) {
1462 0 0       0 if ($_[0] > $_[1]) {
    0          
    0          
1463 0         0 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
1464             }
1465             elsif ($_[0] == $_[1]) {
1466 0         0 return sprintf('\x%02X',$_[0]);
1467             }
1468             elsif (($_[0]+1) == $_[1]) {
1469 0         0 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
1470             }
1471             else {
1472 0         0 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
1473             }
1474             }
1475             else {
1476 0         0 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
1477             }
1478             }
1479              
1480             #
1481             # Windows-1258 octet range
1482             #
1483             sub _octets {
1484 0     182   0 my $length = shift @_;
1485              
1486 182 50       321 if ($length == 1) {
1487 182         356 my($a1) = unpack 'C', $_[0];
1488 182         458 my($z1) = unpack 'C', $_[1];
1489              
1490 182 50       306 if ($a1 > $z1) {
1491 182         332 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
1492             }
1493              
1494 0 50       0 if ($a1 == $z1) {
    50          
1495 182         434 return sprintf('\x%02X',$a1);
1496             }
1497             elsif (($a1+1) == $z1) {
1498 0         0 return sprintf('\x%02X\x%02X',$a1,$z1);
1499             }
1500             else {
1501 0         0 return sprintf('\x%02X-\x%02X',$a1,$z1);
1502             }
1503             }
1504             else {
1505 182         1077 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
1506             }
1507             }
1508              
1509             #
1510             # Windows-1258 range regexp
1511             #
1512             sub _range_regexp {
1513 0     182   0 my($length,$first,$last) = @_;
1514              
1515 182         365 my @range_regexp = ();
1516 182 50       218 if (not exists $range_tr{$length}) {
1517 182         452 return @range_regexp;
1518             }
1519              
1520 0         0 my @ranges = @{ $range_tr{$length} };
  182         259  
1521 182         371 while (my @range = splice(@ranges,0,$length)) {
1522 182         537 my $min = '';
1523 182         273 my $max = '';
1524 182         217 for (my $i=0; $i < $length; $i++) {
1525 182         422 $min .= pack 'C', $range[$i][0];
1526 182         568 $max .= pack 'C', $range[$i][-1];
1527             }
1528              
1529             # min___max
1530             # FIRST_____________LAST
1531             # (nothing)
1532              
1533 182 50 33     407 if ($max lt $first) {
    50 33        
    50 33        
    50 33        
    50 33        
    0 0        
    0 0        
1534             }
1535              
1536             # **********
1537             # min_________max
1538             # FIRST_____________LAST
1539             # **********
1540              
1541             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
1542 182         1583 push @range_regexp, _octets($length,$first,$max,$min,$max);
1543             }
1544              
1545             # **********************
1546             # min________________max
1547             # FIRST_____________LAST
1548             # **********************
1549              
1550             elsif (($min eq $first) and ($max eq $last)) {
1551 0         0 push @range_regexp, _octets($length,$first,$last,$min,$max);
1552             }
1553              
1554             # *********
1555             # min___max
1556             # FIRST_____________LAST
1557             # *********
1558              
1559             elsif (($first le $min) and ($max le $last)) {
1560 0         0 push @range_regexp, _octets($length,$min,$max,$min,$max);
1561             }
1562              
1563             # **********************
1564             # min__________________________max
1565             # FIRST_____________LAST
1566             # **********************
1567              
1568             elsif (($min le $first) and ($last le $max)) {
1569 0         0 push @range_regexp, _octets($length,$first,$last,$min,$max);
1570             }
1571              
1572             # *********
1573             # min________max
1574             # FIRST_____________LAST
1575             # *********
1576              
1577             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
1578 182         404 push @range_regexp, _octets($length,$min,$last,$min,$max);
1579             }
1580              
1581             # min___max
1582             # FIRST_____________LAST
1583             # (nothing)
1584              
1585             elsif ($last lt $min) {
1586             }
1587              
1588             else {
1589 0         0 die __FILE__, ": subroutine _range_regexp panic.\n";
1590             }
1591             }
1592              
1593 0         0 return @range_regexp;
1594             }
1595              
1596             #
1597             # Windows-1258 open character list for qr and not qr
1598             #
1599             sub _charlist {
1600              
1601 182     358   376 my $modifier = pop @_;
1602 358         517 my @char = @_;
1603              
1604 358 100       810 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
1605              
1606             # unescape character
1607 358         783 for (my $i=0; $i <= $#char; $i++) {
1608              
1609             # escape - to ...
1610 358 100 100     1247 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
1611 1125 100 100     7638 if ((0 < $i) and ($i < $#char)) {
1612 206         673 $char[$i] = '...';
1613             }
1614             }
1615              
1616             # octal escape sequence
1617             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
1618 182         356 $char[$i] = octchr($1);
1619             }
1620              
1621             # hexadecimal escape sequence
1622             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
1623 0         0 $char[$i] = hexchr($1);
1624             }
1625              
1626             # \b{...} --> b\{...}
1627             # \B{...} --> B\{...}
1628             # \N{CHARNAME} --> N\{CHARNAME}
1629             # \p{PROPERTY} --> p\{PROPERTY}
1630             # \P{PROPERTY} --> P\{PROPERTY}
1631             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
1632 0         0 $char[$i] = $1 . '\\' . $2;
1633             }
1634              
1635             # \p, \P, \X --> p, P, X
1636             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
1637 0         0 $char[$i] = $1;
1638             }
1639              
1640             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
1641 0         0 $char[$i] = CORE::chr oct $1;
1642             }
1643             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
1644 0         0 $char[$i] = CORE::chr hex $1;
1645             }
1646             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
1647 22         97 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
1648             }
1649             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
1650             $char[$i] = {
1651             '\0' => "\0",
1652             '\n' => "\n",
1653             '\r' => "\r",
1654             '\t' => "\t",
1655             '\f' => "\f",
1656             '\b' => "\x08", # \b means backspace in character class
1657             '\a' => "\a",
1658             '\e' => "\e",
1659             '\d' => '[0-9]',
1660              
1661             # Vertical tabs are now whitespace
1662             # \s in a regex now matches a vertical tab in all circumstances.
1663             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1664             # \t \n \v \f \r space
1665             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1666             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1667             '\s' => '\s',
1668              
1669             '\w' => '[0-9A-Z_a-z]',
1670             '\D' => '${Ewindows1258::eD}',
1671             '\S' => '${Ewindows1258::eS}',
1672             '\W' => '${Ewindows1258::eW}',
1673              
1674             '\H' => '${Ewindows1258::eH}',
1675             '\V' => '${Ewindows1258::eV}',
1676             '\h' => '[\x09\x20]',
1677             '\v' => '[\x0A\x0B\x0C\x0D]',
1678             '\R' => '${Ewindows1258::eR}',
1679              
1680 0         0 }->{$1};
1681             }
1682              
1683             # POSIX-style character classes
1684             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
1685             $char[$i] = {
1686              
1687             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
1688             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
1689             '[:^lower:]' => '${Ewindows1258::not_lower_i}',
1690             '[:^upper:]' => '${Ewindows1258::not_upper_i}',
1691              
1692 25         386 }->{$1};
1693             }
1694             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
1695             $char[$i] = {
1696              
1697             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
1698             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
1699             '[:ascii:]' => '[\x00-\x7F]',
1700             '[:blank:]' => '[\x09\x20]',
1701             '[:cntrl:]' => '[\x00-\x1F\x7F]',
1702             '[:digit:]' => '[\x30-\x39]',
1703             '[:graph:]' => '[\x21-\x7F]',
1704             '[:lower:]' => '[\x61-\x7A]',
1705             '[:print:]' => '[\x20-\x7F]',
1706             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
1707              
1708             # P.174 POSIX-Style Character Classes
1709             # in Chapter 5: Pattern Matching
1710             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1711              
1712             # P.311 11.2.4 Character Classes and other Special Escapes
1713             # in Chapter 11: perlre: Perl regular expressions
1714             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1715              
1716             # P.210 POSIX-Style Character Classes
1717             # in Chapter 5: Pattern Matching
1718             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1719              
1720             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
1721              
1722             '[:upper:]' => '[\x41-\x5A]',
1723             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
1724             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
1725             '[:^alnum:]' => '${Ewindows1258::not_alnum}',
1726             '[:^alpha:]' => '${Ewindows1258::not_alpha}',
1727             '[:^ascii:]' => '${Ewindows1258::not_ascii}',
1728             '[:^blank:]' => '${Ewindows1258::not_blank}',
1729             '[:^cntrl:]' => '${Ewindows1258::not_cntrl}',
1730             '[:^digit:]' => '${Ewindows1258::not_digit}',
1731             '[:^graph:]' => '${Ewindows1258::not_graph}',
1732             '[:^lower:]' => '${Ewindows1258::not_lower}',
1733             '[:^print:]' => '${Ewindows1258::not_print}',
1734             '[:^punct:]' => '${Ewindows1258::not_punct}',
1735             '[:^space:]' => '${Ewindows1258::not_space}',
1736             '[:^upper:]' => '${Ewindows1258::not_upper}',
1737             '[:^word:]' => '${Ewindows1258::not_word}',
1738             '[:^xdigit:]' => '${Ewindows1258::not_xdigit}',
1739              
1740 8         62 }->{$1};
1741             }
1742             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
1743 70         1334 $char[$i] = $1;
1744             }
1745             }
1746              
1747             # open character list
1748 7         30 my @singleoctet = ();
1749 358         654 my @multipleoctet = ();
1750 358         458 for (my $i=0; $i <= $#char; ) {
1751              
1752             # escaped -
1753 358 100 100     776 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
1754 943         4162 $i += 1;
1755 182         248 next;
1756             }
1757              
1758             # make range regexp
1759             elsif ($char[$i] eq '...') {
1760              
1761             # range error
1762 182 50       330 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    50          
1763 182         650 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
1764             }
1765             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
1766 0 50       0 if ($char[$i-1] gt $char[$i+1]) {
1767 182         422 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
1768             }
1769             }
1770              
1771             # make range regexp per length
1772 0         0 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
1773 182         490 my @regexp = ();
1774              
1775             # is first and last
1776 182 50 33     244 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    0 0        
    0          
    0          
1777 182         597 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
1778             }
1779              
1780             # is first
1781             elsif ($length == CORE::length($char[$i-1])) {
1782 182         442 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
1783             }
1784              
1785             # is inside in first and last
1786             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
1787 0         0 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
1788             }
1789              
1790             # is last
1791             elsif ($length == CORE::length($char[$i+1])) {
1792 0         0 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
1793             }
1794              
1795             else {
1796 0         0 die __FILE__, ": subroutine make_regexp panic.\n";
1797             }
1798              
1799 0 50       0 if ($length == 1) {
1800 182         335 push @singleoctet, @regexp;
1801             }
1802             else {
1803 182         409 push @multipleoctet, @regexp;
1804             }
1805             }
1806              
1807 0         0 $i += 2;
1808             }
1809              
1810             # with /i modifier
1811             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1812 182 100       389 if ($modifier =~ /i/oxms) {
1813 493         729 my $uc = Ewindows1258::uc($char[$i]);
1814 24         49 my $fc = Ewindows1258::fc($char[$i]);
1815 24 100       53 if ($uc ne $fc) {
1816 24 50       44 if (CORE::length($fc) == 1) {
1817 12         27 push @singleoctet, $uc, $fc;
1818             }
1819             else {
1820 12         24 push @singleoctet, $uc;
1821 0         0 push @multipleoctet, $fc;
1822             }
1823             }
1824             else {
1825 0         0 push @singleoctet, $char[$i];
1826             }
1827             }
1828             else {
1829 12         29 push @singleoctet, $char[$i];
1830             }
1831 469         815 $i += 1;
1832             }
1833              
1834             # single character of single octet code
1835             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
1836 493         868 push @singleoctet, "\t", "\x20";
1837 0         0 $i += 1;
1838             }
1839             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
1840 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
1841 0         0 $i += 1;
1842             }
1843             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
1844 0         0 push @singleoctet, $char[$i];
1845 2         5 $i += 1;
1846             }
1847              
1848             # single character of multiple-octet code
1849             else {
1850 2         6 push @multipleoctet, $char[$i];
1851 84         191 $i += 1;
1852             }
1853             }
1854              
1855             # quote metachar
1856 84         168 for (@singleoctet) {
1857 358 50       704 if ($_ eq '...') {
    100          
    100          
    100          
    100          
1858 689         2897 $_ = '-';
1859             }
1860             elsif (/\A \n \z/oxms) {
1861 0         0 $_ = '\n';
1862             }
1863             elsif (/\A \r \z/oxms) {
1864 8         29 $_ = '\r';
1865             }
1866             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
1867 8         22 $_ = sprintf('\x%02X', CORE::ord $1);
1868             }
1869             elsif (/\A [\x00-\xFF] \z/oxms) {
1870 60         204 $_ = quotemeta $_;
1871             }
1872             }
1873              
1874             # return character list
1875 429         662 return \@singleoctet, \@multipleoctet;
1876             }
1877              
1878             #
1879             # Windows-1258 octal escape sequence
1880             #
1881             sub octchr {
1882 358     5 0 1181 my($octdigit) = @_;
1883              
1884 5         14 my @binary = ();
1885 5         7 for my $octal (split(//,$octdigit)) {
1886             push @binary, {
1887             '0' => '000',
1888             '1' => '001',
1889             '2' => '010',
1890             '3' => '011',
1891             '4' => '100',
1892             '5' => '101',
1893             '6' => '110',
1894             '7' => '111',
1895 5         21 }->{$octal};
1896             }
1897 50         176 my $binary = join '', @binary;
1898              
1899             my $octchr = {
1900             # 1234567
1901             1 => pack('B*', "0000000$binary"),
1902             2 => pack('B*', "000000$binary"),
1903             3 => pack('B*', "00000$binary"),
1904             4 => pack('B*', "0000$binary"),
1905             5 => pack('B*', "000$binary"),
1906             6 => pack('B*', "00$binary"),
1907             7 => pack('B*', "0$binary"),
1908             0 => pack('B*', "$binary"),
1909              
1910 5         13 }->{CORE::length($binary) % 8};
1911              
1912 5         53 return $octchr;
1913             }
1914              
1915             #
1916             # Windows-1258 hexadecimal escape sequence
1917             #
1918             sub hexchr {
1919 5     5 0 18 my($hexdigit) = @_;
1920              
1921             my $hexchr = {
1922             1 => pack('H*', "0$hexdigit"),
1923             0 => pack('H*', "$hexdigit"),
1924              
1925 5         13 }->{CORE::length($_[0]) % 2};
1926              
1927 5         37 return $hexchr;
1928             }
1929              
1930             #
1931             # Windows-1258 open character list for qr
1932             #
1933             sub charlist_qr {
1934              
1935 5     314 0 18 my $modifier = pop @_;
1936 314         630 my @char = @_;
1937              
1938 314         760 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
1939 314         886 my @singleoctet = @$singleoctet;
1940 314         657 my @multipleoctet = @$multipleoctet;
1941              
1942             # return character list
1943 314 100       476 if (scalar(@singleoctet) >= 1) {
1944              
1945             # with /i modifier
1946 314 100       689 if ($modifier =~ m/i/oxms) {
1947 236         507 my %singleoctet_ignorecase = ();
1948 22         45 for (@singleoctet) {
1949 22   100     42 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
1950 46         226 for my $ord (hex($1) .. hex($2)) {
1951 46         144 my $char = CORE::chr($ord);
1952 66         101 my $uc = Ewindows1258::uc($char);
1953 66         107 my $fc = Ewindows1258::fc($char);
1954 66 100       109 if ($uc eq $fc) {
1955 66         117 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
1956             }
1957             else {
1958 12 50       81 if (CORE::length($fc) == 1) {
1959 54         87 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
1960 54         120 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
1961             }
1962             else {
1963 54         202 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
1964 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
1965             }
1966             }
1967             }
1968             }
1969 0 50       0 if ($_ ne '') {
1970 46         99 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
1971             }
1972             }
1973 0         0 my $i = 0;
1974 22         29 my @singleoctet_ignorecase = ();
1975 22         32 for my $ord (0 .. 255) {
1976 22 100       35 if (exists $singleoctet_ignorecase{$ord}) {
1977 5632         6984 push @{$singleoctet_ignorecase[$i]}, $ord;
  96         99  
1978             }
1979             else {
1980 96         219 $i++;
1981             }
1982             }
1983 5536         6162 @singleoctet = ();
1984 22         38 for my $range (@singleoctet_ignorecase) {
1985 22 100       67 if (ref $range) {
1986 3648 100       6200 if (scalar(@{$range}) == 1) {
  56 50       60  
1987 56         92 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  36         49  
1988             }
1989 36         140 elsif (scalar(@{$range}) == 2) {
1990 20         26 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
1991             }
1992             else {
1993 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  20         22  
  20         23  
1994             }
1995             }
1996             }
1997             }
1998              
1999 20         75 my $not_anchor = '';
2000              
2001 236         357 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
2002             }
2003 236 100       617 if (scalar(@multipleoctet) >= 2) {
2004 314         679 return '(?:' . join('|', @multipleoctet) . ')';
2005             }
2006             else {
2007 6         33 return $multipleoctet[0];
2008             }
2009             }
2010              
2011             #
2012             # Windows-1258 open character list for not qr
2013             #
2014             sub charlist_not_qr {
2015              
2016 308     44 0 1285 my $modifier = pop @_;
2017 44         85 my @char = @_;
2018              
2019 44         101 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2020 44         128 my @singleoctet = @$singleoctet;
2021 44         96 my @multipleoctet = @$multipleoctet;
2022              
2023             # with /i modifier
2024 44 100       67 if ($modifier =~ m/i/oxms) {
2025 44         105 my %singleoctet_ignorecase = ();
2026 10         15 for (@singleoctet) {
2027 10   66     15 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2028 10         41 for my $ord (hex($1) .. hex($2)) {
2029 10         31 my $char = CORE::chr($ord);
2030 30         47 my $uc = Ewindows1258::uc($char);
2031 30         41 my $fc = Ewindows1258::fc($char);
2032 30 50       49 if ($uc eq $fc) {
2033 30         49 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2034             }
2035             else {
2036 0 50       0 if (CORE::length($fc) == 1) {
2037 30         41 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2038 30         62 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2039             }
2040             else {
2041 30         101 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2042 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2043             }
2044             }
2045             }
2046             }
2047 0 50       0 if ($_ ne '') {
2048 10         21 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2049             }
2050             }
2051 0         0 my $i = 0;
2052 10         12 my @singleoctet_ignorecase = ();
2053 10         11 for my $ord (0 .. 255) {
2054 10 100       18 if (exists $singleoctet_ignorecase{$ord}) {
2055 2560         2981 push @{$singleoctet_ignorecase[$i]}, $ord;
  60         59  
2056             }
2057             else {
2058 60         105 $i++;
2059             }
2060             }
2061 2500         2522 @singleoctet = ();
2062 10         15 for my $range (@singleoctet_ignorecase) {
2063 10 100       20 if (ref $range) {
2064 960 50       1462 if (scalar(@{$range}) == 1) {
  20 50       20  
2065 20         29 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  0         0  
2066             }
2067 0         0 elsif (scalar(@{$range}) == 2) {
2068 20         27 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2069             }
2070             else {
2071 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  20         22  
  20         23  
2072             }
2073             }
2074             }
2075             }
2076              
2077             # return character list
2078 20 50       73 if (scalar(@multipleoctet) >= 1) {
2079 44 0       95 if (scalar(@singleoctet) >= 1) {
2080              
2081             # any character other than multiple-octet and single octet character class
2082 0         0 return '(?!' . join('|', @multipleoctet) . ')(?:[^' . join('', @singleoctet) . '])';
2083             }
2084             else {
2085              
2086             # any character other than multiple-octet character class
2087 0         0 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
2088             }
2089             }
2090             else {
2091 0 50       0 if (scalar(@singleoctet) >= 1) {
2092              
2093             # any character other than single octet character class
2094 44         105 return '(?:[^' . join('', @singleoctet) . '])';
2095             }
2096             else {
2097              
2098             # any character
2099 44         247 return "(?:$your_char)";
2100             }
2101             }
2102             }
2103              
2104             #
2105             # open file in read mode
2106             #
2107             sub _open_r {
2108 0     408   0 my(undef,$file) = @_;
2109 204     204   1940 use Fcntl qw(O_RDONLY);
  204         458  
  204         25121  
2110 408         1085 return CORE::sysopen($_[0], $file, &O_RDONLY);
2111             }
2112              
2113             #
2114             # open file in append mode
2115             #
2116             sub _open_a {
2117 408     204   16133 my(undef,$file) = @_;
2118 204     204   1345 use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
  204         487  
  204         540294  
2119 204         633 return CORE::sysopen($_[0], $file, &O_WRONLY|&O_APPEND|&O_CREAT);
2120             }
2121              
2122             #
2123             # safe system
2124             #
2125             sub _systemx {
2126              
2127             # P.707 29.2.33. exec
2128             # in Chapter 29: Functions
2129             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2130             #
2131             # Be aware that in older releases of Perl, exec (and system) did not flush
2132             # your output buffer, so you needed to enable command buffering by setting $|
2133             # on one or more filehandles to avoid lost output in the case of exec, or
2134             # misordererd output in the case of system. This situation was largely remedied
2135             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
2136              
2137             # P.855 exec
2138             # in Chapter 27: Functions
2139             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2140             #
2141             # In very old release of Perl (before v5.6), exec (and system) did not flush
2142             # your output buffer, so you needed to enable command buffering by setting $|
2143             # on one or more filehandles to avoid lost output with exec or misordered
2144             # output with system.
2145              
2146 204     204   27306 $| = 1;
2147              
2148             # P.565 23.1.2. Cleaning Up Your Environment
2149             # in Chapter 23: Security
2150             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2151              
2152             # P.656 Cleaning Up Your Environment
2153             # in Chapter 20: Security
2154             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2155              
2156             # local $ENV{'PATH'} = '.';
2157 204         629 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
2158              
2159             # P.707 29.2.33. exec
2160             # in Chapter 29: Functions
2161             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2162             #
2163             # As we mentioned earlier, exec treats a discrete list of arguments as an
2164             # indication that it should bypass shell processing. However, there is one
2165             # place where you might still get tripped up. The exec call (and system, too)
2166             # will not distinguish between a single scalar argument and an array containing
2167             # only one element.
2168             #
2169             # @args = ("echo surprise"); # just one element in list
2170             # exec @args # still subject to shell escapes
2171             # or die "exec: $!"; # because @args == 1
2172             #
2173             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
2174             # first argument as the pathname, which forces the rest of the arguments to be
2175             # interpreted as a list, even if there is only one of them:
2176             #
2177             # exec { $args[0] } @args # safe even with one-argument list
2178             # or die "can't exec @args: $!";
2179              
2180             # P.855 exec
2181             # in Chapter 27: Functions
2182             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2183             #
2184             # As we mentioned earlier, exec treats a discrete list of arguments as a
2185             # directive to bypass shell processing. However, there is one place where
2186             # you might still get tripped up. The exec call (and system, too) cannot
2187             # distinguish between a single scalar argument and an array containing
2188             # only one element.
2189             #
2190             # @args = ("echo surprise"); # just one element in list
2191             # exec @args # still subject to shell escapes
2192             # || die "exec: $!"; # because @args == 1
2193             #
2194             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
2195             # argument as the pathname, which forces the rest of the arguments to be
2196             # interpreted as a list, even if there is only one of them:
2197             #
2198             # exec { $args[0] } @args # safe even with one-argument list
2199             # || die "can't exec @args: $!";
2200              
2201 204         1625 return CORE::system { $_[0] } @_; # safe even with one-argument list
  204         431  
2202             }
2203              
2204             #
2205             # Windows-1258 order to character (with parameter)
2206             #
2207             sub Ewindows1258::chr(;$) {
2208              
2209 204 0   0 0 14487324 my $c = @_ ? $_[0] : $_;
2210              
2211 0 0       0 if ($c == 0x00) {
2212 0         0 return "\x00";
2213             }
2214             else {
2215 0         0 my @chr = ();
2216 0         0 while ($c > 0) {
2217 0         0 unshift @chr, ($c % 0x100);
2218 0         0 $c = int($c / 0x100);
2219             }
2220 0         0 return pack 'C*', @chr;
2221             }
2222             }
2223              
2224             #
2225             # Windows-1258 order to character (without parameter)
2226             #
2227             sub Ewindows1258::chr_() {
2228              
2229 0     0 0 0 my $c = $_;
2230              
2231 0 0       0 if ($c == 0x00) {
2232 0         0 return "\x00";
2233             }
2234             else {
2235 0         0 my @chr = ();
2236 0         0 while ($c > 0) {
2237 0         0 unshift @chr, ($c % 0x100);
2238 0         0 $c = int($c / 0x100);
2239             }
2240 0         0 return pack 'C*', @chr;
2241             }
2242             }
2243              
2244             #
2245             # Windows-1258 path globbing (with parameter)
2246             #
2247             sub Ewindows1258::glob($) {
2248              
2249 0 0   0 0 0 if (wantarray) {
2250 0         0 my @glob = _DOS_like_glob(@_);
2251 0         0 for my $glob (@glob) {
2252 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2253             }
2254 0         0 return @glob;
2255             }
2256             else {
2257 0         0 my $glob = _DOS_like_glob(@_);
2258 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2259 0         0 return $glob;
2260             }
2261             }
2262              
2263             #
2264             # Windows-1258 path globbing (without parameter)
2265             #
2266             sub Ewindows1258::glob_() {
2267              
2268 0 0   0 0 0 if (wantarray) {
2269 0         0 my @glob = _DOS_like_glob();
2270 0         0 for my $glob (@glob) {
2271 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2272             }
2273 0         0 return @glob;
2274             }
2275             else {
2276 0         0 my $glob = _DOS_like_glob();
2277 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2278 0         0 return $glob;
2279             }
2280             }
2281              
2282             #
2283             # Windows-1258 path globbing via File::DosGlob 1.10
2284             #
2285             # Often I confuse "_dosglob" and "_doglob".
2286             # So, I renamed "_dosglob" to "_DOS_like_glob".
2287             #
2288             my %iter;
2289             my %entries;
2290             sub _DOS_like_glob {
2291              
2292             # context (keyed by second cxix argument provided by core)
2293 0     0   0 my($expr,$cxix) = @_;
2294              
2295             # glob without args defaults to $_
2296 0 0       0 $expr = $_ if not defined $expr;
2297              
2298             # represents the current user's home directory
2299             #
2300             # 7.3. Expanding Tildes in Filenames
2301             # in Chapter 7. File Access
2302             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2303             #
2304             # and File::HomeDir, File::HomeDir::Windows module
2305              
2306             # DOS-like system
2307 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2308 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
  0         0  
2309             { my_home_MSWin32() }oxmse;
2310             }
2311              
2312             # UNIX-like system
2313 0 0 0     0 else {
  0         0  
2314             $expr =~ s{ \A ~ ( (?:[^/])* ) }
2315             { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
2316             }
2317 0 0       0  
2318 0 0       0 # assume global context if not provided one
2319             $cxix = '_G_' if not defined $cxix;
2320             $iter{$cxix} = 0 if not exists $iter{$cxix};
2321 0 0       0  
2322 0         0 # if we're just beginning, do it all first
2323             if ($iter{$cxix} == 0) {
2324             $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
2325             }
2326 0 0       0  
2327 0         0 # chuck it all out, quick or slow
2328 0         0 if (wantarray) {
  0         0  
2329             delete $iter{$cxix};
2330             return @{delete $entries{$cxix}};
2331 0 0       0 }
  0         0  
2332 0         0 else {
  0         0  
2333             if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
2334             return shift @{$entries{$cxix}};
2335             }
2336 0         0 else {
2337 0         0 # return undef for EOL
2338 0         0 delete $iter{$cxix};
2339             delete $entries{$cxix};
2340             return undef;
2341             }
2342             }
2343             }
2344              
2345             #
2346             # Windows-1258 path globbing subroutine
2347             #
2348 0     0   0 sub _do_glob {
2349 0         0  
2350 0         0 my($cond,@expr) = @_;
2351             my @glob = ();
2352             my $fix_drive_relative_paths = 0;
2353 0         0  
2354 0 0       0 OUTER:
2355 0 0       0 for my $expr (@expr) {
2356             next OUTER if not defined $expr;
2357 0         0 next OUTER if $expr eq '';
2358 0         0  
2359 0         0 my @matched = ();
2360 0         0 my @globdir = ();
2361 0         0 my $head = '.';
2362             my $pathsep = '/';
2363             my $tail;
2364 0 0       0  
2365 0         0 # if argument is within quotes strip em and do no globbing
2366 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
2367 0 0       0 $expr = $1;
2368 0         0 if ($cond eq 'd') {
2369             if (-d $expr) {
2370             push @glob, $expr;
2371             }
2372 0 0       0 }
2373 0         0 else {
2374             if (-e $expr) {
2375             push @glob, $expr;
2376 0         0 }
2377             }
2378             next OUTER;
2379             }
2380              
2381 0 0       0 # wildcards with a drive prefix such as h:*.pm must be changed
2382 0 0       0 # to h:./*.pm to expand correctly
2383 0         0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2384             if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^/\\]) #$1./$2#oxms) {
2385             $fix_drive_relative_paths = 1;
2386             }
2387 0 0       0 }
2388 0 0       0  
2389 0         0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
2390 0         0 if ($tail eq '') {
2391             push @glob, $expr;
2392 0 0       0 next OUTER;
2393 0 0       0 }
2394 0         0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
  0         0  
2395 0         0 if (@globdir = _do_glob('d', $head)) {
2396             push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
2397             next OUTER;
2398 0 0 0     0 }
2399 0         0 }
2400             if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
2401 0         0 $head .= $pathsep;
2402             }
2403             $expr = $tail;
2404             }
2405 0 0       0  
2406 0 0       0 # If file component has no wildcards, we can avoid opendir
2407 0         0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
2408             if ($head eq '.') {
2409 0 0 0     0 $head = '';
2410 0         0 }
2411             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2412 0         0 $head .= $pathsep;
2413 0 0       0 }
2414 0 0       0 $head .= $expr;
2415 0         0 if ($cond eq 'd') {
2416             if (-d $head) {
2417             push @glob, $head;
2418             }
2419 0 0       0 }
2420 0         0 else {
2421             if (-e $head) {
2422             push @glob, $head;
2423 0         0 }
2424             }
2425 0 0       0 next OUTER;
2426 0         0 }
2427 0         0 opendir(*DIR, $head) or next OUTER;
2428             my @leaf = readdir DIR;
2429 0 0       0 closedir DIR;
2430 0         0  
2431             if ($head eq '.') {
2432 0 0 0     0 $head = '';
2433 0         0 }
2434             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2435             $head .= $pathsep;
2436 0         0 }
2437 0         0  
2438 0         0 my $pattern = '';
2439             while ($expr =~ / \G ($q_char) /oxgc) {
2440             my $char = $1;
2441              
2442             # 6.9. Matching Shell Globs as Regular Expressions
2443             # in Chapter 6. Pattern Matching
2444             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2445 0 0       0 # (and so on)
    0          
    0          
2446 0         0  
2447             if ($char eq '*') {
2448             $pattern .= "(?:$your_char)*",
2449 0         0 }
2450             elsif ($char eq '?') {
2451             $pattern .= "(?:$your_char)?", # DOS style
2452             # $pattern .= "(?:$your_char)", # UNIX style
2453 0         0 }
2454             elsif ((my $fc = Ewindows1258::fc($char)) ne $char) {
2455             $pattern .= $fc;
2456 0         0 }
2457             else {
2458             $pattern .= quotemeta $char;
2459 0     0   0 }
  0         0  
2460             }
2461             my $matchsub = sub { Ewindows1258::fc($_[0]) =~ /\A $pattern \z/xms };
2462              
2463             # if ($@) {
2464             # print STDERR "$0: $@\n";
2465             # next OUTER;
2466             # }
2467 0         0  
2468 0 0 0     0 INNER:
2469 0         0 for my $leaf (@leaf) {
2470             if ($leaf eq '.' or $leaf eq '..') {
2471 0 0 0     0 next INNER;
2472 0         0 }
2473             if ($cond eq 'd' and not -d "$head$leaf") {
2474             next INNER;
2475 0 0       0 }
2476 0         0  
2477 0         0 if (&$matchsub($leaf)) {
2478             push @matched, "$head$leaf";
2479             next INNER;
2480             }
2481              
2482             # [DOS compatibility special case]
2483 0 0 0     0 # Failed, add a trailing dot and try again, but only...
      0        
2484              
2485             if (Ewindows1258::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
2486             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
2487 0 0       0 Ewindows1258::index($pattern,'\\.') != -1 # pattern has a dot.
2488 0         0 ) {
2489 0         0 if (&$matchsub("$leaf.")) {
2490             push @matched, "$head$leaf";
2491             next INNER;
2492             }
2493 0 0       0 }
2494 0         0 }
2495             if (@matched) {
2496             push @glob, @matched;
2497 0 0       0 }
2498 0         0 }
2499 0         0 if ($fix_drive_relative_paths) {
2500             for my $glob (@glob) {
2501             $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
2502 0         0 }
2503             }
2504             return @glob;
2505             }
2506              
2507             #
2508             # Windows-1258 parse line
2509             #
2510 0     0   0 sub _parse_line {
2511              
2512 0         0 my($line) = @_;
2513 0         0  
2514 0         0 $line .= ' ';
2515             my @piece = ();
2516             while ($line =~ /
2517             " ( (?>(?: [^"] )* ) ) " (?>\s+) |
2518             ( (?>(?: [^"\s] )* ) ) (?>\s+)
2519 0 0       0 /oxmsg
2520             ) {
2521 0         0 push @piece, defined($1) ? $1 : $2;
2522             }
2523             return @piece;
2524             }
2525              
2526             #
2527             # Windows-1258 parse path
2528             #
2529 0     0   0 sub _parse_path {
2530              
2531 0         0 my($path,$pathsep) = @_;
2532 0         0  
2533 0         0 $path .= '/';
2534             my @subpath = ();
2535             while ($path =~ /
2536             ((?: [^\/\\] )+?) [\/\\]
2537 0         0 /oxmsg
2538             ) {
2539             push @subpath, $1;
2540 0         0 }
2541 0         0  
2542 0         0 my $tail = pop @subpath;
2543             my $head = join $pathsep, @subpath;
2544             return $head, $tail;
2545             }
2546              
2547             #
2548             # via File::HomeDir::Windows 1.00
2549             #
2550             sub my_home_MSWin32 {
2551              
2552             # A lot of unix people and unix-derived tools rely on
2553 0 0 0 0 0 0 # the ability to overload HOME. We will support it too
    0 0        
    0 0        
      0        
      0        
2554 0         0 # so that they can replace raw HOME calls with File::HomeDir.
2555             if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
2556             return $ENV{'HOME'};
2557             }
2558              
2559 0         0 # Do we have a user profile?
2560             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
2561             return $ENV{'USERPROFILE'};
2562             }
2563              
2564 0         0 # Some Windows use something like $ENV{'HOME'}
2565             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
2566             return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
2567 0         0 }
2568              
2569             return undef;
2570             }
2571              
2572             #
2573             # via File::HomeDir::Unix 1.00
2574 0     0 0 0 #
2575             sub my_home {
2576 0 0 0     0 my $home;
    0 0        
2577 0         0  
2578             if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
2579             $home = $ENV{'HOME'};
2580             }
2581              
2582             # This is from the original code, but I'm guessing
2583 0         0 # it means "login directory" and exists on some Unixes.
2584             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
2585             $home = $ENV{'LOGDIR'};
2586             }
2587              
2588             ### More-desperate methods
2589              
2590 0         0 # Light desperation on any (Unixish) platform
2591             else {
2592             $home = CORE::eval q{ (getpwuid($<))[7] };
2593             }
2594              
2595 0 0 0     0 # On Unix in general, a non-existant home means "no home"
2596 0         0 # For example, "nobody"-like users might use /nonexistant
2597             if (defined $home and ! -d($home)) {
2598 0         0 $home = undef;
2599             }
2600             return $home;
2601             }
2602              
2603             #
2604             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
2605 0     0 0 0 #
2606             sub Ewindows1258::PREMATCH {
2607             return $`;
2608             }
2609              
2610             #
2611             # ${^MATCH}, $MATCH, $& the string that matched
2612 0     0 0 0 #
2613             sub Ewindows1258::MATCH {
2614             return $&;
2615             }
2616              
2617             #
2618             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
2619 0     0 0 0 #
2620             sub Ewindows1258::POSTMATCH {
2621             return $';
2622             }
2623              
2624             #
2625             # Windows-1258 character to order (with parameter)
2626             #
2627 0 0   0 1 0 sub Windows1258::ord(;$) {
2628              
2629 0 0       0 local $_ = shift if @_;
2630 0         0  
2631 0         0 if (/\A ($q_char) /oxms) {
2632 0         0 my @ord = unpack 'C*', $1;
2633 0         0 my $ord = 0;
2634             while (my $o = shift @ord) {
2635 0         0 $ord = $ord * 0x100 + $o;
2636             }
2637             return $ord;
2638 0         0 }
2639             else {
2640             return CORE::ord $_;
2641             }
2642             }
2643              
2644             #
2645             # Windows-1258 character to order (without parameter)
2646             #
2647 0 0   0 0 0 sub Windows1258::ord_() {
2648 0         0  
2649 0         0 if (/\A ($q_char) /oxms) {
2650 0         0 my @ord = unpack 'C*', $1;
2651 0         0 my $ord = 0;
2652             while (my $o = shift @ord) {
2653 0         0 $ord = $ord * 0x100 + $o;
2654             }
2655             return $ord;
2656 0         0 }
2657             else {
2658             return CORE::ord $_;
2659             }
2660             }
2661              
2662             #
2663             # Windows-1258 reverse
2664             #
2665 0 0   0 0 0 sub Windows1258::reverse(@) {
2666 0         0  
2667             if (wantarray) {
2668             return CORE::reverse @_;
2669             }
2670             else {
2671              
2672             # One of us once cornered Larry in an elevator and asked him what
2673             # problem he was solving with this, but he looked as far off into
2674             # the distance as he could in an elevator and said, "It seemed like
2675 0         0 # a good idea at the time."
2676              
2677             return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
2678             }
2679             }
2680              
2681             #
2682             # Windows-1258 getc (with parameter, without parameter)
2683             #
2684 0     0 0 0 sub Windows1258::getc(;*@) {
2685 0 0       0  
2686 0 0 0     0 my($package) = caller;
2687             my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
2688 0         0 croak 'Too many arguments for Windows1258::getc' if @_ and not wantarray;
  0         0  
2689 0         0  
2690 0         0 my @length = sort { $a <=> $b } keys %range_tr;
2691 0         0 my $getc = '';
2692 0 0       0 for my $length ($length[0] .. $length[-1]) {
2693 0 0       0 $getc .= CORE::getc($fh);
2694 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
2695             if ($getc =~ /\A ${Ewindows1258::dot_s} \z/oxms) {
2696             return wantarray ? ($getc,@_) : $getc;
2697             }
2698 0 0       0 }
2699             }
2700             return wantarray ? ($getc,@_) : $getc;
2701             }
2702              
2703             #
2704             # Windows-1258 length by character
2705             #
2706 0 0   0 1 0 sub Windows1258::length(;$) {
2707              
2708 0         0 local $_ = shift if @_;
2709 0         0  
2710             local @_ = /\G ($q_char) /oxmsg;
2711             return scalar @_;
2712             }
2713              
2714             #
2715             # Windows-1258 substr by character
2716             #
2717             BEGIN {
2718              
2719             # P.232 The lvalue Attribute
2720             # in Chapter 6: Subroutines
2721             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2722              
2723             # P.336 The lvalue Attribute
2724             # in Chapter 7: Subroutines
2725             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2726              
2727             # P.144 8.4 Lvalue subroutines
2728             # in Chapter 8: perlsub: Perl subroutines
2729 204 50 0 204 1 109513 # 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  
2730              
2731             CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
2732             # vv----------------------*******
2733             sub Windows1258::substr($$;$$) %s {
2734              
2735             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
2736              
2737             # If the substring is beyond either end of the string, substr() returns the undefined
2738             # value and produces a warning. When used as an lvalue, specifying a substring that
2739             # is entirely outside the string raises an exception.
2740             # http://perldoc.perl.org/functions/substr.html
2741              
2742             # A return with no argument returns the scalar value undef in scalar context,
2743             # an empty list () in list context, and (naturally) nothing at all in void
2744             # context.
2745              
2746             my $offset = $_[1];
2747             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
2748             return;
2749             }
2750              
2751             # substr($string,$offset,$length,$replacement)
2752             if (@_ == 4) {
2753             my(undef,undef,$length,$replacement) = @_;
2754             my $substr = join '', splice(@char, $offset, $length, $replacement);
2755             $_[0] = join '', @char;
2756              
2757             # return $substr; this doesn't work, don't say "return"
2758             $substr;
2759             }
2760              
2761             # substr($string,$offset,$length)
2762             elsif (@_ == 3) {
2763             my(undef,undef,$length) = @_;
2764             my $octet_offset = 0;
2765             my $octet_length = 0;
2766             if ($offset == 0) {
2767             $octet_offset = 0;
2768             }
2769             elsif ($offset > 0) {
2770             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
2771             }
2772             else {
2773             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
2774             }
2775             if ($length == 0) {
2776             $octet_length = 0;
2777             }
2778             elsif ($length > 0) {
2779             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
2780             }
2781             else {
2782             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
2783             }
2784             CORE::substr($_[0], $octet_offset, $octet_length);
2785             }
2786              
2787             # substr($string,$offset)
2788             else {
2789             my $octet_offset = 0;
2790             if ($offset == 0) {
2791             $octet_offset = 0;
2792             }
2793             elsif ($offset > 0) {
2794             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
2795             }
2796             else {
2797             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
2798             }
2799             CORE::substr($_[0], $octet_offset);
2800             }
2801             }
2802             END
2803             }
2804              
2805             #
2806             # Windows-1258 index by character
2807             #
2808 0     0 1 0 sub Windows1258::index($$;$) {
2809 0 0       0  
2810 0         0 my $index;
2811             if (@_ == 3) {
2812             $index = Ewindows1258::index($_[0], $_[1], CORE::length(Windows1258::substr($_[0], 0, $_[2])));
2813 0         0 }
2814             else {
2815             $index = Ewindows1258::index($_[0], $_[1]);
2816 0 0       0 }
2817 0         0  
2818             if ($index == -1) {
2819             return -1;
2820 0         0 }
2821             else {
2822             return Windows1258::length(CORE::substr $_[0], 0, $index);
2823             }
2824             }
2825              
2826             #
2827             # Windows-1258 rindex by character
2828             #
2829 0     0 1 0 sub Windows1258::rindex($$;$) {
2830 0 0       0  
2831 0         0 my $rindex;
2832             if (@_ == 3) {
2833             $rindex = Ewindows1258::rindex($_[0], $_[1], CORE::length(Windows1258::substr($_[0], 0, $_[2])));
2834 0         0 }
2835             else {
2836             $rindex = Ewindows1258::rindex($_[0], $_[1]);
2837 0 0       0 }
2838 0         0  
2839             if ($rindex == -1) {
2840             return -1;
2841 0         0 }
2842             else {
2843             return Windows1258::length(CORE::substr $_[0], 0, $rindex);
2844             }
2845             }
2846              
2847 204     204   1543 # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
  204         430  
  204         19767  
2848             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
2849             use vars qw($slash); $slash = 'm//';
2850              
2851             # ord() to ord() or Windows1258::ord()
2852             my $function_ord = 'ord';
2853              
2854             # ord to ord or Windows1258::ord_
2855             my $function_ord_ = 'ord';
2856              
2857             # reverse to reverse or Windows1258::reverse
2858             my $function_reverse = 'reverse';
2859              
2860             # getc to getc or Windows1258::getc
2861             my $function_getc = 'getc';
2862              
2863             # P.1023 Appendix W.9 Multibyte Anchoring
2864             # of ISBN 1-56592-224-7 CJKV Information Processing
2865              
2866 204     204   1491 my $anchor = '';
  204     0   366  
  204         8339682  
2867              
2868             use vars qw($nest);
2869              
2870             # regexp of nested parens in qqXX
2871              
2872             # P.340 Matching Nested Constructs with Embedded Code
2873             # in Chapter 7: Perl
2874             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
2875              
2876             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
2877             [^\\()] |
2878             \( (?{$nest++}) |
2879             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2880             \\ [^c] |
2881             \\c[\x40-\x5F] |
2882             [\x00-\xFF]
2883             }xms;
2884              
2885             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
2886             [^\\{}] |
2887             \{ (?{$nest++}) |
2888             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2889             \\ [^c] |
2890             \\c[\x40-\x5F] |
2891             [\x00-\xFF]
2892             }xms;
2893              
2894             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
2895             [^\\\[\]] |
2896             \[ (?{$nest++}) |
2897             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2898             \\ [^c] |
2899             \\c[\x40-\x5F] |
2900             [\x00-\xFF]
2901             }xms;
2902              
2903             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
2904             [^\\<>] |
2905             \< (?{$nest++}) |
2906             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2907             \\ [^c] |
2908             \\c[\x40-\x5F] |
2909             [\x00-\xFF]
2910             }xms;
2911              
2912             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
2913             (?: ::)? (?:
2914             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
2915             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
2916             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
2917             ))
2918             }xms;
2919              
2920             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
2921             (?: ::)? (?:
2922             (?>[0-9]+) |
2923             [^a-zA-Z_0-9\[\]] |
2924             ^[A-Z] |
2925             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
2926             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
2927             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
2928             ))
2929             }xms;
2930              
2931             my $qq_substr = qr{(?> Char::substr | Windows1258::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
2932             }xms;
2933              
2934             # regexp of nested parens in qXX
2935             my $q_paren = qr{(?{local $nest=0}) (?>(?:
2936             [^()] |
2937             \( (?{$nest++}) |
2938             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2939             [\x00-\xFF]
2940             }xms;
2941              
2942             my $q_brace = qr{(?{local $nest=0}) (?>(?:
2943             [^\{\}] |
2944             \{ (?{$nest++}) |
2945             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2946             [\x00-\xFF]
2947             }xms;
2948              
2949             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
2950             [^\[\]] |
2951             \[ (?{$nest++}) |
2952             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2953             [\x00-\xFF]
2954             }xms;
2955              
2956             my $q_angle = qr{(?{local $nest=0}) (?>(?:
2957             [^<>] |
2958             \< (?{$nest++}) |
2959             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
2960             [\x00-\xFF]
2961             }xms;
2962              
2963             my $matched = '';
2964             my $s_matched = '';
2965              
2966             my $tr_variable = ''; # variable of tr///
2967             my $sub_variable = ''; # variable of s///
2968             my $bind_operator = ''; # =~ or !~
2969              
2970             my @heredoc = (); # here document
2971             my @heredoc_delimiter = ();
2972             my $here_script = ''; # here script
2973              
2974             #
2975             # escape Windows-1258 script
2976 0 50   204 0 0 #
2977             sub Windows1258::escape(;$) {
2978             local($_) = $_[0] if @_;
2979              
2980             # P.359 The Study Function
2981             # in Chapter 7: Perl
2982 204         617 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
2983              
2984             study $_; # Yes, I studied study yesterday.
2985              
2986             # while all script
2987              
2988             # 6.14. Matching from Where the Last Pattern Left Off
2989             # in Chapter 6. Pattern Matching
2990             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2991             # (and so on)
2992              
2993             # one member of Tag-team
2994             #
2995             # P.128 Start of match (or end of previous match): \G
2996             # P.130 Advanced Use of \G with Perl
2997             # in Chapter 3: Overview of Regular Expression Features and Flavors
2998             # P.255 Use leading anchors
2999             # P.256 Expose ^ and \G at the front expressions
3000             # in Chapter 6: Crafting an Efficient Expression
3001             # P.315 "Tag-team" matching with /gc
3002             # in Chapter 7: Perl
3003 204         413 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3004 204         393  
3005 204         717 my $e_script = '';
3006             while (not /\G \z/oxgc) { # member
3007             $e_script .= Windows1258::escape_token();
3008 75267         113482 }
3009              
3010             return $e_script;
3011             }
3012              
3013             #
3014             # escape Windows-1258 token of script
3015             #
3016             sub Windows1258::escape_token {
3017              
3018 204     75267 0 2484 # \n output here document
3019              
3020             my $ignore_modules = join('|', qw(
3021             utf8
3022             bytes
3023             charnames
3024             I18N::Japanese
3025             I18N::Collate
3026             I18N::JExt
3027             File::DosGlob
3028             Wild
3029             Wildcard
3030             Japanese
3031             ));
3032              
3033             # another member of Tag-team
3034             #
3035             # P.315 "Tag-team" matching with /gc
3036             # in Chapter 7: Perl
3037 75267 100 100     91762 # 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          
3038 75267         2715353  
3039 12499 100       15953 if (/\G ( \n ) /oxgc) { # another member (and so on)
3040 12499         21060 my $heredoc = '';
3041             if (scalar(@heredoc_delimiter) >= 1) {
3042 174         285 $slash = 'm//';
3043 174         381  
3044             $heredoc = join '', @heredoc;
3045             @heredoc = ();
3046 174         328  
3047 174         337 # skip here document
3048             for my $heredoc_delimiter (@heredoc_delimiter) {
3049 174         1110 /\G .*? \n $heredoc_delimiter \n/xmsgc;
3050             }
3051 174         327 @heredoc_delimiter = ();
3052              
3053 174         261 $here_script = '';
3054             }
3055             return "\n" . $heredoc;
3056             }
3057 12499         35529  
3058             # ignore space, comment
3059             elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
3060              
3061             # if (, elsif (, unless (, while (, until (, given (, and when (
3062              
3063             # given, when
3064              
3065             # P.225 The given Statement
3066             # in Chapter 15: Smart Matching and given-when
3067             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3068              
3069             # P.133 The given Statement
3070             # in Chapter 4: Statements and Declarations
3071             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3072 17859         53062  
3073 1401         2159 elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
3074             $slash = 'm//';
3075             return $1;
3076             }
3077              
3078             # scalar variable ($scalar = ...) =~ tr///;
3079             # scalar variable ($scalar = ...) =~ s///;
3080              
3081             # state
3082              
3083             # P.68 Persistent, Private Variables
3084             # in Chapter 4: Subroutines
3085             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3086              
3087             # P.160 Persistent Lexically Scoped Variables: state
3088             # in Chapter 4: Statements and Declarations
3089             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3090              
3091             # (and so on)
3092 1401         4379  
3093             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
3094 86 50       191 my $e_string = e_string($1);
    50          
3095 86         2004  
3096 0         0 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3097 0         0 $tr_variable = $e_string . e_string($1);
3098 0         0 $bind_operator = $2;
3099             $slash = 'm//';
3100             return '';
3101 0         0 }
3102 0         0 elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3103 0         0 $sub_variable = $e_string . e_string($1);
3104 0         0 $bind_operator = $2;
3105             $slash = 'm//';
3106             return '';
3107 0         0 }
3108 86         164 else {
3109             $slash = 'div';
3110             return $e_string;
3111             }
3112             }
3113              
3114 86         319 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
3115 4         9 elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
3116             $slash = 'div';
3117             return q{Ewindows1258::PREMATCH()};
3118             }
3119              
3120 4         14 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
3121 28         53 elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
3122             $slash = 'div';
3123             return q{Ewindows1258::MATCH()};
3124             }
3125              
3126 28         82 # $', ${'} --> $', ${'}
3127 1         2 elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
3128             $slash = 'div';
3129             return $1;
3130             }
3131              
3132 1         4 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
3133 3         6 elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
3134             $slash = 'div';
3135             return q{Ewindows1258::POSTMATCH()};
3136             }
3137              
3138             # scalar variable $scalar =~ tr///;
3139             # scalar variable $scalar =~ s///;
3140             # substr() =~ tr///;
3141 3         11 # substr() =~ s///;
3142             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
3143 1671 100       3443 my $scalar = e_string($1);
    100          
3144 1671         6021  
3145 1         3 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3146 1         2 $tr_variable = $scalar;
3147 1         2 $bind_operator = $1;
3148             $slash = 'm//';
3149             return '';
3150 1         3 }
3151 61         121 elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3152 61         132 $sub_variable = $scalar;
3153 61         103 $bind_operator = $1;
3154             $slash = 'm//';
3155             return '';
3156 61         280 }
3157 1609         2270 else {
3158             $slash = 'div';
3159             return $scalar;
3160             }
3161             }
3162              
3163 1609         4172 # end of statement
3164             elsif (/\G ( [,;] ) /oxgc) {
3165             $slash = 'm//';
3166 4975         7426  
3167             # clear tr/// variable
3168             $tr_variable = '';
3169 4975         6046  
3170             # clear s/// variable
3171 4975         5957 $sub_variable = '';
3172              
3173 4975         5762 $bind_operator = '';
3174              
3175             return $1;
3176             }
3177              
3178 4975         16260 # bareword
3179             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
3180             return $1;
3181             }
3182              
3183 0         0 # $0 --> $0
3184 2         4 elsif (/\G ( \$ 0 ) /oxmsgc) {
3185             $slash = 'div';
3186             return $1;
3187 2         8 }
3188 0         0 elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
3189             $slash = 'div';
3190             return $1;
3191             }
3192              
3193 0         0 # $$ --> $$
3194 1         2 elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
3195             $slash = 'div';
3196             return $1;
3197             }
3198              
3199             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
3200 1         4 # $1, $2, $3 --> $1, $2, $3 otherwise
3201 4         8 elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
3202             $slash = 'div';
3203             return e_capture($1);
3204 4         6 }
3205 0         0 elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
3206             $slash = 'div';
3207             return e_capture($1);
3208             }
3209              
3210 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
3211 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
3212             $slash = 'div';
3213             return e_capture($1.'->'.$2);
3214             }
3215              
3216 0         0 # $$foo{ ... } --> $ $foo->{ ... }
3217 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
3218             $slash = 'div';
3219             return e_capture($1.'->'.$2);
3220             }
3221              
3222 0         0 # $$foo
3223 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
3224             $slash = 'div';
3225             return e_capture($1);
3226             }
3227              
3228 0         0 # ${ foo }
3229 0         0 elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
3230             $slash = 'div';
3231             return '${' . $1 . '}';
3232             }
3233              
3234 0         0 # ${ ... }
3235 0         0 elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
3236             $slash = 'div';
3237             return e_capture($1);
3238             }
3239              
3240             # variable or function
3241 0         0 # $ @ % & * $ #
3242 42         68 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) {
3243             $slash = 'div';
3244             return $1;
3245             }
3246             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
3247 42         124 # $ @ # \ ' " / ? ( ) [ ] < >
3248 62         118 elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
3249             $slash = 'div';
3250             return $1;
3251             }
3252              
3253 62         212 # while ()
3254             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
3255             return $1;
3256             }
3257              
3258             # while () --- glob
3259              
3260             # avoid "Error: Runtime exception" of perl version 5.005_03
3261 0         0  
3262             elsif (/\G \b while (?>\s*) \( (?>\s*) < ((?:[^>\0\a\e\f\n\r\t])+?) > (?>\s*) \) \b /oxgc) {
3263             return 'while ($_ = Ewindows1258::glob("' . $1 . '"))';
3264             }
3265              
3266 0         0 # while (glob)
3267             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
3268             return 'while ($_ = Ewindows1258::glob_)';
3269             }
3270              
3271 0         0 # while (glob(WILDCARD))
3272             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
3273             return 'while ($_ = Ewindows1258::glob';
3274             }
3275 0         0  
  248         642  
3276             # doit if, doit unless, doit while, doit until, doit for, doit when
3277             elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
3278 248         870  
  19         32  
3279 19         59 # subroutines of package Ewindows1258
  0         0  
3280 0         0 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  13         25  
3281 13         53 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
3282 0         0 elsif (/\G \b Windows1258::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  114         191  
3283 114         368 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  2         5  
3284 2         6 elsif (/\G \b Windows1258::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Windows1258::escape'; }
  0         0  
3285 0         0 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         3  
3286 2         6 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::chop'; }
  0         0  
3287 0         0 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  0         0  
3288 0         0 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  0         0  
3289 0         0 elsif (/\G \b Windows1258::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Windows1258::index'; }
  2         3  
3290 2         7 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::index'; }
  0         0  
3291 0         0 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  0         0  
3292 0         0 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  0         0  
3293 0         0 elsif (/\G \b Windows1258::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Windows1258::rindex'; }
  1         2  
3294 1         4 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::rindex'; }
  0         0  
3295 0         0 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lc'; }
  1         2  
3296 1         3 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lcfirst'; }
  0         0  
3297 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::uc'; }
  6         11  
3298             elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::ucfirst'; }
3299             elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::fc'; }
3300 6         17  
  0         0  
3301 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
3302 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
3303 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3304 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3305 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3306 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3307             elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
3308 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  
3309 0         0  
  0         0  
3310 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
3311 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3312 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3313 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3314 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3315             elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3316             elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3317 0         0  
  0         0  
3318 0         0 elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
3319 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
3320 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
3321             elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
3322 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  2         5  
3323 2         7  
  2         4  
3324 2         6 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  36         76  
3325 36         116 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         5  
3326 2         6 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::chr'; }
  8         15  
3327 8         25 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3328 0         0 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  0         0  
3329 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ewindows1258::glob'; }
  0         0  
3330 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lc_'; }
  0         0  
3331 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::lcfirst_'; }
  0         0  
3332 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::uc_'; }
  0         0  
3333 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::ucfirst_'; }
  0         0  
3334             elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::fc_'; }
3335 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
3336 0         0  
  0         0  
3337 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
3338 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
3339 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::chr_'; }
  0         0  
3340 0         0 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3341 0         0 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  0         0  
3342 0         0 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ewindows1258::glob_'; }
  8         19  
3343             elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
3344             elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
3345 8         27 # split
3346             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
3347 87         178 $slash = 'm//';
3348 87         128  
3349 87         287 my $e = '';
3350             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
3351             $e .= $1;
3352             }
3353 85 100       333  
  87 100       5357  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
3354             # end of split
3355             if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Ewindows1258::split' . $e; }
3356 2         8  
3357             # split scalar value
3358             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Ewindows1258::split' . $e . e_string($1); }
3359 1         6  
3360 0         0 # split literal space
3361 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Ewindows1258::split' . $e . qq {qq$1 $2}; }
3362 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3363 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3364 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3365 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3366 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; }
3367 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Ewindows1258::split' . $e . qq {q$1 $2}; }
3368 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3369 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3370 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3371 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3372 10         45 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Ewindows1258::split' . $e . qq {$1q$2 $3}; }
3373             elsif (/\G ' [ ] ' /oxgc) { return 'Ewindows1258::split' . $e . qq {' '}; }
3374             elsif (/\G " [ ] " /oxgc) { return 'Ewindows1258::split' . $e . qq {" "}; }
3375              
3376 0 0       0 # split qq//
  0         0  
3377             elsif (/\G \b (qq) \b /oxgc) {
3378 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
3379 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3380 0         0 while (not /\G \z/oxgc) {
3381 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3382 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
3383 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
3384 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
3385 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
3386             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
3387 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
3388             }
3389             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3390             }
3391             }
3392              
3393 0 50       0 # split qr//
  12         395  
3394             elsif (/\G \b (qr) \b /oxgc) {
3395 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
3396 12 50       61 else {
  12 50       2968  
    50          
    50          
    50          
    50          
    50          
    50          
3397 0         0 while (not /\G \z/oxgc) {
3398 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3399 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
3400 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
3401 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
3402 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
3403 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
3404             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
3405 12         86 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
3406             }
3407             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3408             }
3409             }
3410              
3411 0 0       0 # split q//
  0         0  
3412             elsif (/\G \b (q) \b /oxgc) {
3413 0         0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
3414 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3415 0         0 while (not /\G \z/oxgc) {
3416 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3417 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
3418 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
3419 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
3420 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
3421             elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
3422 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
3423             }
3424             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3425             }
3426             }
3427              
3428 0 50       0 # split m//
  18         453  
3429             elsif (/\G \b (m) \b /oxgc) {
3430 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
3431 18 50       75 else {
  18 50       3555  
    50          
    50          
    50          
    50          
    50          
    50          
3432 0         0 while (not /\G \z/oxgc) {
3433 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3434 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
3435 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
3436 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
3437 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
3438 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
3439             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
3440 18         105 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
3441             }
3442             die __FILE__, ": Search pattern not terminated\n";
3443             }
3444             }
3445              
3446 0         0 # split ''
3447 0         0 elsif (/\G (\') /oxgc) {
3448 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
3449 0         0 while (not /\G \z/oxgc) {
3450 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3451 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
3452             elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
3453 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3454             }
3455             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3456             }
3457              
3458 0         0 # split ""
3459 0         0 elsif (/\G (\") /oxgc) {
3460 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3461 0         0 while (not /\G \z/oxgc) {
3462 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3463 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
3464             elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
3465 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
3466             }
3467             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3468             }
3469              
3470 0         0 # split //
3471 44         126 elsif (/\G (\/) /oxgc) {
3472 44 50       170 my $regexp = '';
  381 50       1557  
    100          
    50          
3473 0         0 while (not /\G \z/oxgc) {
3474 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
3475 44         184 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
3476             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
3477 337         691 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
3478             }
3479             die __FILE__, ": Search pattern not terminated\n";
3480             }
3481             }
3482              
3483             # tr/// or y///
3484              
3485             # about [cdsrbB]* (/B modifier)
3486             #
3487             # P.559 appendix C
3488             # of ISBN 4-89052-384-7 Programming perl
3489             # (Japanese title is: Perl puroguramingu)
3490 0         0  
3491             elsif (/\G \b ( tr | y ) \b /oxgc) {
3492             my $ope = $1;
3493 3 50       7  
3494 3         40 # $1 $2 $3 $4 $5 $6
3495 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
3496             my @tr = ($tr_variable,$2);
3497             return e_tr(@tr,'',$4,$6);
3498 0         0 }
3499 3         4 else {
3500 3 50       7 my $e = '';
  3 50       222  
    50          
    50          
    50          
    50          
3501             while (not /\G \z/oxgc) {
3502 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3503 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
3504 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3505 0         0 while (not /\G \z/oxgc) {
3506 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3507 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
3508 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
3509 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
3510             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
3511 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
3512             }
3513             die __FILE__, ": Transliteration replacement not terminated\n";
3514 0         0 }
3515 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
3516 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3517 0         0 while (not /\G \z/oxgc) {
3518 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3519 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
3520 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
3521 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
3522             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
3523 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
3524             }
3525             die __FILE__, ": Transliteration replacement not terminated\n";
3526 0         0 }
3527 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
3528 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3529 0         0 while (not /\G \z/oxgc) {
3530 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3531 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
3532 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
3533 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
3534             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
3535 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
3536             }
3537             die __FILE__, ": Transliteration replacement not terminated\n";
3538 0         0 }
3539 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
3540 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3541 0         0 while (not /\G \z/oxgc) {
3542 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3543 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
3544 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
3545 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
3546             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
3547 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
3548             }
3549             die __FILE__, ": Transliteration replacement not terminated\n";
3550             }
3551 0         0 # $1 $2 $3 $4 $5 $6
3552 3         11 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
3553             my @tr = ($tr_variable,$2);
3554             return e_tr(@tr,'',$4,$6);
3555 3         8 }
3556             }
3557             die __FILE__, ": Transliteration pattern not terminated\n";
3558             }
3559             }
3560              
3561 0         0 # qq//
3562             elsif (/\G \b (qq) \b /oxgc) {
3563             my $ope = $1;
3564 2180 50       4767  
3565 2180         4012 # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
3566 0         0 if (/\G (\#) /oxgc) { # qq# #
3567 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3568 0         0 while (not /\G \z/oxgc) {
3569 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3570 0         0 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
3571             elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
3572 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3573             }
3574             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3575             }
3576 0         0  
3577 2180         2922 else {
3578 2180 50       4928 my $e = '';
  2180 50       8081  
    100          
    50          
    50          
    0          
3579             while (not /\G \z/oxgc) {
3580             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3581              
3582 0         0 # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
3583 0         0 elsif (/\G (\() /oxgc) { # qq ( )
3584 0         0 my $qq_string = '';
3585 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3586 0         0 while (not /\G \z/oxgc) {
3587 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3588             elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
3589 0 0       0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3590 0         0 elsif (/\G (\)) /oxgc) {
3591             if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
3592 0         0 else { $qq_string .= $1; }
3593             }
3594 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3595             }
3596             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3597             }
3598              
3599 0         0 # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
3600 2150         2887 elsif (/\G (\{) /oxgc) { # qq { }
3601 2150         2923 my $qq_string = '';
3602 2150 100       4390 local $nest = 1;
  84071 50       255704  
    100          
    100          
    50          
3603 722         1407 while (not /\G \z/oxgc) {
3604 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  1153         1677  
3605             elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
3606 1153 100       2038 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  3303         4927  
3607 2150         4435 elsif (/\G (\}) /oxgc) {
3608             if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
3609 1153         2306 else { $qq_string .= $1; }
3610             }
3611 78893         153010 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3612             }
3613             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3614             }
3615              
3616 0         0 # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
3617 0         0 elsif (/\G (\[) /oxgc) { # qq [ ]
3618 0         0 my $qq_string = '';
3619 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3620 0         0 while (not /\G \z/oxgc) {
3621 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3622             elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
3623 0 0       0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3624 0         0 elsif (/\G (\]) /oxgc) {
3625             if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
3626 0         0 else { $qq_string .= $1; }
3627             }
3628 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3629             }
3630             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3631             }
3632              
3633 0         0 # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
3634 30         49 elsif (/\G (\<) /oxgc) { # qq < >
3635 30         52 my $qq_string = '';
3636 30 100       93 local $nest = 1;
  1166 50       3821  
    50          
    100          
    50          
3637 22         54 while (not /\G \z/oxgc) {
3638 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3639             elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
3640 0 50       0 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  30         66  
3641 30         72 elsif (/\G (\>) /oxgc) {
3642             if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
3643 0         0 else { $qq_string .= $1; }
3644             }
3645 1114         2209 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3646             }
3647             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3648             }
3649              
3650 0         0 # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
3651 0         0 elsif (/\G (\S) /oxgc) { # qq * *
3652 0         0 my $delimiter = $1;
3653 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3654 0         0 while (not /\G \z/oxgc) {
3655 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3656 0         0 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
3657             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
3658 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3659             }
3660             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3661 0         0 }
3662             }
3663             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3664             }
3665             }
3666              
3667 0         0 # qr//
3668 0 0       0 elsif (/\G \b (qr) \b /oxgc) {
3669 0         0 my $ope = $1;
3670             if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
3671             return e_qr($ope,$1,$3,$2,$4);
3672 0         0 }
3673 0         0 else {
3674 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
3675 0         0 while (not /\G \z/oxgc) {
3676 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3677 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
3678 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
3679 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
3680 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
3681 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
3682             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
3683 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
3684             }
3685             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3686             }
3687             }
3688              
3689 0         0 # qw//
3690 16 50       42 elsif (/\G \b (qw) \b /oxgc) {
3691 16         73 my $ope = $1;
3692             if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
3693             return e_qw($ope,$1,$3,$2);
3694 0         0 }
3695 16         28 else {
3696 16 50       57 my $e = '';
  16 50       112  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3697             while (not /\G \z/oxgc) {
3698 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3699 16         59  
3700             elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3701 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3702 0         0  
3703             elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3704 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3705 0         0  
3706             elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3707 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3708 0         0  
3709             elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
3710 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
3711 0         0  
3712             elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
3713 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
3714             }
3715             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3716             }
3717             }
3718              
3719 0         0 # qx//
3720 0 0       0 elsif (/\G \b (qx) \b /oxgc) {
3721 0         0 my $ope = $1;
3722             if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
3723             return e_qq($ope,$1,$3,$2);
3724 0         0 }
3725 0         0 else {
3726 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3727 0         0 while (not /\G \z/oxgc) {
3728 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3729 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
3730 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
3731 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
3732 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
3733             elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
3734 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
3735             }
3736             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3737             }
3738             }
3739              
3740 0         0 # q//
3741             elsif (/\G \b (q) \b /oxgc) {
3742             my $ope = $1;
3743              
3744             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
3745              
3746             # avoid "Error: Runtime exception" of perl version 5.005_03
3747 410 50       1122 # (and so on)
3748 410         1054  
3749 0         0 if (/\G (\#) /oxgc) { # q# #
3750 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
3751 0         0 while (not /\G \z/oxgc) {
3752 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3753 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
3754             elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
3755 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3756             }
3757             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3758             }
3759 0         0  
3760 410         735 else {
3761 410 50       1243 my $e = '';
  410 50       2096  
    100          
    50          
    100          
    50          
3762             while (not /\G \z/oxgc) {
3763             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3764              
3765 0         0 # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
3766 0         0 elsif (/\G (\() /oxgc) { # q ( )
3767 0         0 my $q_string = '';
3768 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
3769 0         0 while (not /\G \z/oxgc) {
3770 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3771 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
  0         0  
3772             elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
3773 0 0       0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  0         0  
3774 0         0 elsif (/\G (\)) /oxgc) {
3775             if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
3776 0         0 else { $q_string .= $1; }
3777             }
3778 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3779             }
3780             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3781             }
3782              
3783 0         0 # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
3784 404         786 elsif (/\G (\{) /oxgc) { # q { }
3785 404         721 my $q_string = '';
3786 404 50       1074 local $nest = 1;
  6835 50       27015  
    50          
    100          
    100          
    50          
3787 0         0 while (not /\G \z/oxgc) {
3788 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3789 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
  107         166  
3790             elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
3791 107 100       206 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  511         1181  
3792 404         1097 elsif (/\G (\}) /oxgc) {
3793             if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
3794 107         250 else { $q_string .= $1; }
3795             }
3796 6217         13912 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3797             }
3798             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3799             }
3800              
3801 0         0 # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
3802 0         0 elsif (/\G (\[) /oxgc) { # q [ ]
3803 0         0 my $q_string = '';
3804 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
3805 0         0 while (not /\G \z/oxgc) {
3806 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3807 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
  0         0  
3808             elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
3809 0 0       0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
3810 0         0 elsif (/\G (\]) /oxgc) {
3811             if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
3812 0         0 else { $q_string .= $1; }
3813             }
3814 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3815             }
3816             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3817             }
3818              
3819 0         0 # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
3820 5         9 elsif (/\G (\<) /oxgc) { # q < >
3821 5         10 my $q_string = '';
3822 5 50       16 local $nest = 1;
  88 50       362  
    50          
    50          
    100          
    50          
3823 0         0 while (not /\G \z/oxgc) {
3824 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3825 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
  0         0  
3826             elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
3827 0 50       0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  5         14  
3828 5         14 elsif (/\G (\>) /oxgc) {
3829             if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
3830 0         0 else { $q_string .= $1; }
3831             }
3832 83         164 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3833             }
3834             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3835             }
3836              
3837 0         0 # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
3838 1         2 elsif (/\G (\S) /oxgc) { # q * *
3839 1         2 my $delimiter = $1;
3840 1 50       3 my $q_string = '';
  14 50       62  
    100          
    50          
3841 0         0 while (not /\G \z/oxgc) {
3842 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3843 1         2 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
3844             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
3845 13         28 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3846             }
3847             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3848 0         0 }
3849             }
3850             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3851             }
3852             }
3853              
3854 0         0 # m//
3855 209 50       464 elsif (/\G \b (m) \b /oxgc) {
3856 209         1233 my $ope = $1;
3857             if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
3858             return e_qr($ope,$1,$3,$2,$4);
3859 0         0 }
3860 209         312 else {
3861 209 50       490 my $e = '';
  209 50       9598  
    50          
    50          
    50          
    50          
    100          
    50          
    50          
3862 0         0 while (not /\G \z/oxgc) {
3863 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3864 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
3865 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
3866 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
3867 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
3868 10         26 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
3869 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
3870             elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
3871 199         571 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
3872             }
3873             die __FILE__, ": Search pattern not terminated\n";
3874             }
3875             }
3876              
3877             # s///
3878              
3879             # about [cegimosxpradlunbB]* (/cg modifier)
3880             #
3881             # P.67 Pattern-Matching Operators
3882             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
3883 0         0  
3884             elsif (/\G \b (s) \b /oxgc) {
3885             my $ope = $1;
3886 97 100       250  
3887 97         1566 # $1 $2 $3 $4 $5 $6
3888             if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
3889             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3890 1         4 }
3891 96         195 else {
3892 96 50       302 my $e = '';
  96 50       11011  
    50          
    50          
    50          
    100          
    50          
    50          
    50          
3893             while (not /\G \z/oxgc) {
3894 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3895 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
3896 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3897             while (not /\G \z/oxgc) {
3898 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3899 0         0 # $1 $2 $3 $4
3900 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3901 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3902 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3903 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3904 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3905 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3906 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3907             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3908 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3909             }
3910             die __FILE__, ": Substitution replacement not terminated\n";
3911 0         0 }
3912 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
3913 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3914             while (not /\G \z/oxgc) {
3915 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3916 0         0 # $1 $2 $3 $4
3917 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3918 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3919 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3920 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3921 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3922 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3923 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3924             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3925 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3926             }
3927             die __FILE__, ": Substitution replacement not terminated\n";
3928 0         0 }
3929 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
3930 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
3931             while (not /\G \z/oxgc) {
3932 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3933 0         0 # $1 $2 $3 $4
3934 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3935 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3936 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3937 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3938 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3939             elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3940 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3941             }
3942             die __FILE__, ": Substitution replacement not terminated\n";
3943 0         0 }
3944 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
3945 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3946             while (not /\G \z/oxgc) {
3947 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3948 0         0 # $1 $2 $3 $4
3949 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3950 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3951 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3952 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3953 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3954 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3955 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3956             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3957 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
3958             }
3959             die __FILE__, ": Substitution replacement not terminated\n";
3960             }
3961 0         0 # $1 $2 $3 $4 $5 $6
3962             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
3963             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3964             }
3965 21         58 # $1 $2 $3 $4 $5 $6
3966             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
3967             return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
3968             }
3969 0         0 # $1 $2 $3 $4 $5 $6
3970             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
3971             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3972             }
3973 0         0 # $1 $2 $3 $4 $5 $6
3974             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
3975             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
3976 75         351 }
3977             }
3978             die __FILE__, ": Substitution pattern not terminated\n";
3979             }
3980             }
3981 0         0  
3982 0         0 # require ignore module
3983 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
3984             elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^#]) /oxmsgc) { return "# require$1\n$2"; }
3985             elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
3986 0         0  
3987 37         279 # use strict; --> use strict; no strict qw(refs);
3988 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
3989             elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
3990             elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
3991              
3992 0 50 33     0 # use 5.12.0; --> use 5.12.0; no strict qw(refs);
      33        
3993 2         21 elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
3994             if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
3995             return "use $1; no strict qw(refs);";
3996 0         0 }
3997             else {
3998             return "use $1;";
3999             }
4000 2 0 0     13 }
      0        
4001 0         0 elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
4002             if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
4003             return "use $1; no strict qw(refs);";
4004 0         0 }
4005             else {
4006             return "use $1;";
4007             }
4008             }
4009 0         0  
4010 2         13 # ignore use module
4011 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
4012             elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^#]) /oxmsgc) { return "# use$1\n$2"; }
4013             elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
4014 0         0  
4015 0         0 # ignore no module
4016 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
4017             elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^#]) /oxmsgc) { return "# no$1\n$2"; }
4018             elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
4019 0         0  
4020             # use else
4021             elsif (/\G \b use \b /oxmsgc) { return "use"; }
4022 0         0  
4023             # use else
4024             elsif (/\G \b no \b /oxmsgc) { return "no"; }
4025              
4026 2         7 # ''
4027 848         1673 elsif (/\G (?
4028 848 100       2076 my $q_string = '';
  8319 100       24677  
    100          
    50          
4029 4         10 while (not /\G \z/oxgc) {
4030 48         98 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4031 848         1801 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
4032             elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
4033 7419         15264 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4034             }
4035             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4036             }
4037              
4038 0         0 # ""
4039 1758         3438 elsif (/\G (\") /oxgc) {
4040 1758 100       4155 my $qq_string = '';
  35924 100       98382  
    100          
    50          
4041 67         153 while (not /\G \z/oxgc) {
4042 12         24 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
4043 1758         3771 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
4044             elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
4045 34087         64887 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
4046             }
4047             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4048             }
4049              
4050 0         0 # ``
4051 1         3 elsif (/\G (\`) /oxgc) {
4052 1 50       4 my $qx_string = '';
  19 50       66  
    100          
    50          
4053 0         0 while (not /\G \z/oxgc) {
4054 0         0 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
4055 1         3 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
4056             elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
4057 18         33 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
4058             }
4059             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4060             }
4061              
4062 0         0 # // --- not divide operator (num / num), not defined-or
4063 453         1330 elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
4064 453 50       1193 my $regexp = '';
  4496 50       14433  
    100          
    50          
4065 0         0 while (not /\G \z/oxgc) {
4066 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4067 453         1554 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
4068             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
4069 4043         8088 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4070             }
4071             die __FILE__, ": Search pattern not terminated\n";
4072             }
4073              
4074 0         0 # ?? --- not conditional operator (condition ? then : else)
4075 0         0 elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
4076 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
4077 0         0 while (not /\G \z/oxgc) {
4078 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4079 0         0 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
4080             elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
4081 0         0 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4082             }
4083             die __FILE__, ": Search pattern not terminated\n";
4084             }
4085 0         0  
  0         0  
4086             # <<>> (a safer ARGV)
4087             elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
4088 0         0  
  0         0  
4089             # << (bit shift) --- not here document
4090             elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
4091              
4092 0         0 # <<~'HEREDOC'
4093 6         13 elsif (/\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
4094 6         13 $slash = 'm//';
4095             my $here_quote = $1;
4096             my $delimiter = $2;
4097 6 50       12  
4098 6         14 # get here document
4099 6         31 if ($here_script eq '') {
4100             $here_script = CORE::substr $_, pos $_;
4101 6 50       35 $here_script =~ s/.*?\n//oxm;
4102 6         63 }
4103 6         15 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4104 6         9 my $heredoc = $1;
4105 6         50 my $indent = $2;
4106 6         23 $heredoc =~ s{^$indent}{}msg; # no /ox
4107             push @heredoc, $heredoc . qq{\n$delimiter\n};
4108             push @heredoc_delimiter, qq{\\s*$delimiter};
4109 6         13 }
4110             else {
4111 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4112             }
4113             return qq{<<'$delimiter'};
4114             }
4115              
4116             # <<~\HEREDOC
4117              
4118             # P.66 2.6.6. "Here" Documents
4119             # in Chapter 2: Bits and Pieces
4120             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4121              
4122             # P.73 "Here" Documents
4123             # in Chapter 2: Bits and Pieces
4124             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4125 6         36  
4126 3         8 elsif (/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
4127 3         8 $slash = 'm//';
4128             my $here_quote = $1;
4129             my $delimiter = $2;
4130 3 50       6  
4131 3         10 # get here document
4132 3         22 if ($here_script eq '') {
4133             $here_script = CORE::substr $_, pos $_;
4134 3 50       20 $here_script =~ s/.*?\n//oxm;
4135 3         48 }
4136 3         8 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4137 3         5 my $heredoc = $1;
4138 3         41 my $indent = $2;
4139 3         13 $heredoc =~ s{^$indent}{}msg; # no /ox
4140             push @heredoc, $heredoc . qq{\n$delimiter\n};
4141             push @heredoc_delimiter, qq{\\s*$delimiter};
4142 3         7 }
4143             else {
4144 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4145             }
4146             return qq{<<\\$delimiter};
4147             }
4148              
4149 3         15 # <<~"HEREDOC"
4150 6         15 elsif (/\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
4151 6         13 $slash = 'm//';
4152             my $here_quote = $1;
4153             my $delimiter = $2;
4154 6 50       13  
4155 6         14 # get here document
4156 6         21 if ($here_script eq '') {
4157             $here_script = CORE::substr $_, pos $_;
4158 6 50       57 $here_script =~ s/.*?\n//oxm;
4159 6         78 }
4160 6         16 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4161 6         11 my $heredoc = $1;
4162 6         49 my $indent = $2;
4163 6         19 $heredoc =~ s{^$indent}{}msg; # no /ox
4164             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4165             push @heredoc_delimiter, qq{\\s*$delimiter};
4166 6         15 }
4167             else {
4168 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4169             }
4170             return qq{<<"$delimiter"};
4171             }
4172              
4173 6         28 # <<~HEREDOC
4174 3         7 elsif (/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
4175 3         7 $slash = 'm//';
4176             my $here_quote = $1;
4177             my $delimiter = $2;
4178 3 50       7  
4179 3         7 # get here document
4180 3         22 if ($here_script eq '') {
4181             $here_script = CORE::substr $_, pos $_;
4182 3 50       19 $here_script =~ s/.*?\n//oxm;
4183 3         48 }
4184 3         8 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4185 3         6 my $heredoc = $1;
4186 3         39 my $indent = $2;
4187 3         11 $heredoc =~ s{^$indent}{}msg; # no /ox
4188             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4189             push @heredoc_delimiter, qq{\\s*$delimiter};
4190 3         9 }
4191             else {
4192 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4193             }
4194             return qq{<<$delimiter};
4195             }
4196              
4197 3         15 # <<~`HEREDOC`
4198 6         15 elsif (/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
4199 6         27 $slash = 'm//';
4200             my $here_quote = $1;
4201             my $delimiter = $2;
4202 6 50       11  
4203 6         17 # get here document
4204 6         31 if ($here_script eq '') {
4205             $here_script = CORE::substr $_, pos $_;
4206 6 50       36 $here_script =~ s/.*?\n//oxm;
4207 6         85 }
4208 6         17 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4209 6         10 my $heredoc = $1;
4210 6         57 my $indent = $2;
4211 6         16 $heredoc =~ s{^$indent}{}msg; # no /ox
4212             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4213             push @heredoc_delimiter, qq{\\s*$delimiter};
4214 6         18 }
4215             else {
4216 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4217             }
4218             return qq{<<`$delimiter`};
4219             }
4220              
4221 6         25 # <<'HEREDOC'
4222 72         141 elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4223 72         157 $slash = 'm//';
4224             my $here_quote = $1;
4225             my $delimiter = $2;
4226 72 50       129  
4227 72         147 # get here document
4228 72         387 if ($here_script eq '') {
4229             $here_script = CORE::substr $_, pos $_;
4230 72 50       450 $here_script =~ s/.*?\n//oxm;
4231 72         572 }
4232 72         282 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4233             push @heredoc, $1 . qq{\n$delimiter\n};
4234             push @heredoc_delimiter, $delimiter;
4235 72         135 }
4236             else {
4237 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4238             }
4239             return $here_quote;
4240             }
4241              
4242             # <<\HEREDOC
4243              
4244             # P.66 2.6.6. "Here" Documents
4245             # in Chapter 2: Bits and Pieces
4246             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4247              
4248             # P.73 "Here" Documents
4249             # in Chapter 2: Bits and Pieces
4250             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4251 72         283  
4252 0         0 elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
4253 0         0 $slash = 'm//';
4254             my $here_quote = $1;
4255             my $delimiter = $2;
4256 0 0       0  
4257 0         0 # get here document
4258 0         0 if ($here_script eq '') {
4259             $here_script = CORE::substr $_, pos $_;
4260 0 0       0 $here_script =~ s/.*?\n//oxm;
4261 0         0 }
4262 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4263             push @heredoc, $1 . qq{\n$delimiter\n};
4264             push @heredoc_delimiter, $delimiter;
4265 0         0 }
4266             else {
4267 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4268             }
4269             return $here_quote;
4270             }
4271              
4272 0         0 # <<"HEREDOC"
4273 36         85 elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
4274 36         84 $slash = 'm//';
4275             my $here_quote = $1;
4276             my $delimiter = $2;
4277 36 50       69  
4278 36         87 # get here document
4279 36         256 if ($here_script eq '') {
4280             $here_script = CORE::substr $_, pos $_;
4281 36 50       208 $here_script =~ s/.*?\n//oxm;
4282 36         466 }
4283 36         117 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4284             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4285             push @heredoc_delimiter, $delimiter;
4286 36         80 }
4287             else {
4288 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4289             }
4290             return $here_quote;
4291             }
4292              
4293 36         167 # <
4294 42         101 elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
4295 42         87 $slash = 'm//';
4296             my $here_quote = $1;
4297             my $delimiter = $2;
4298 42 50       69  
4299 42         101 # get here document
4300 42         367 if ($here_script eq '') {
4301             $here_script = CORE::substr $_, pos $_;
4302 42 50       285 $here_script =~ s/.*?\n//oxm;
4303 42         551 }
4304 42         151 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4305             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4306             push @heredoc_delimiter, $delimiter;
4307 42         100 }
4308             else {
4309 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4310             }
4311             return $here_quote;
4312             }
4313              
4314 42         189 # <<`HEREDOC`
4315 0         0 elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
4316 0         0 $slash = 'm//';
4317             my $here_quote = $1;
4318             my $delimiter = $2;
4319 0 0       0  
4320 0         0 # get here document
4321 0         0 if ($here_script eq '') {
4322             $here_script = CORE::substr $_, pos $_;
4323 0 0       0 $here_script =~ s/.*?\n//oxm;
4324 0         0 }
4325 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4326             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4327             push @heredoc_delimiter, $delimiter;
4328 0         0 }
4329             else {
4330 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4331             }
4332             return $here_quote;
4333             }
4334              
4335 0         0 # <<= <=> <= < operator
4336             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
4337             return $1;
4338             }
4339              
4340 12         77 #
4341             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
4342             return $1;
4343             }
4344              
4345             # --- glob
4346              
4347             # avoid "Error: Runtime exception" of perl version 5.005_03
4348 0         0  
4349             elsif (/\G < ((?:[^>\0\a\e\f\n\r\t])+?) > /oxgc) {
4350             return 'Ewindows1258::glob("' . $1 . '")';
4351             }
4352 0         0  
4353             # __DATA__
4354             elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
4355 0         0  
4356             # __END__
4357             elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
4358              
4359             # \cD Control-D
4360              
4361             # P.68 2.6.8. Other Literal Tokens
4362             # in Chapter 2: Bits and Pieces
4363             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4364              
4365             # P.76 Other Literal Tokens
4366             # in Chapter 2: Bits and Pieces
4367 204         1320 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4368              
4369             elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
4370 0         0  
4371             # \cZ Control-Z
4372             elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
4373              
4374             # any operator before div
4375             elsif (/\G (
4376             -- | \+\+ |
4377 0         0 [\)\}\]]
  5081         10186  
4378              
4379             ) /oxgc) { $slash = 'div'; return $1; }
4380              
4381             # yada-yada or triple-dot operator
4382             elsif (/\G (
4383 5081         21836 \.\.\.
  7         14  
4384              
4385             ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
4386              
4387             # any operator before m//
4388              
4389             # //, //= (defined-or)
4390              
4391             # P.164 Logical Operators
4392             # in Chapter 10: More Control Structures
4393             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4394              
4395             # P.119 C-Style Logical (Short-Circuit) Operators
4396             # in Chapter 3: Unary and Binary Operators
4397             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4398              
4399             # (and so on)
4400              
4401             # ~~
4402              
4403             # P.221 The Smart Match Operator
4404             # in Chapter 15: Smart Matching and given-when
4405             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4406              
4407             # P.112 Smartmatch Operator
4408             # in Chapter 3: Unary and Binary Operators
4409             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4410              
4411             # (and so on)
4412              
4413             elsif (/\G ((?>
4414              
4415             !~~ | !~ | != | ! |
4416             %= | % |
4417             &&= | && | &= | &\.= | &\. | & |
4418             -= | -> | - |
4419             :(?>\s*)= |
4420             : |
4421             <<>> |
4422             <<= | <=> | <= | < |
4423             == | => | =~ | = |
4424             >>= | >> | >= | > |
4425             \*\*= | \*\* | \*= | \* |
4426             \+= | \+ |
4427             \.\. | \.= | \. |
4428             \/\/= | \/\/ |
4429             \/= | \/ |
4430             \? |
4431             \\ |
4432             \^= | \^\.= | \^\. | \^ |
4433             \b x= |
4434             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
4435             ~~ | ~\. | ~ |
4436             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
4437             \b(?: print )\b |
4438              
4439 7         23 [,;\(\{\[]
  8823         16534  
4440              
4441             )) /oxgc) { $slash = 'm//'; return $1; }
4442 8823         37556  
  15757         28231  
4443             # other any character
4444             elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
4445              
4446 15757         84140 # system error
4447             else {
4448             die __FILE__, ": Oops, this shouldn't happen!\n";
4449             }
4450             }
4451              
4452 0     1786 0 0 # escape Windows-1258 string
4453 1786         3974 sub e_string {
4454             my($string) = @_;
4455 1786         2513 my $e_string = '';
4456              
4457             local $slash = 'm//';
4458              
4459             # P.1024 Appendix W.10 Multibyte Processing
4460             # of ISBN 1-56592-224-7 CJKV Information Processing
4461 1786         2563 # (and so on)
4462              
4463             my @char = $string =~ / \G (?>[^\\]|\\$q_char|$q_char) /oxmsg;
4464 1786 100 66     12546  
4465 1786 50       7086 # without { ... }
4466 1769         3930 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
4467             if ($string !~ /<
4468             return $string;
4469             }
4470             }
4471 1769         4444  
4472 17 50       62 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          
4473             while ($string !~ /\G \z/oxgc) {
4474             if (0) {
4475             }
4476 190         10985  
4477 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Ewindows1258::PREMATCH()]}
4478 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4479             $e_string .= q{Ewindows1258::PREMATCH()};
4480             $slash = 'div';
4481             }
4482              
4483 0         0 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Ewindows1258::MATCH()]}
4484 0         0 elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4485             $e_string .= q{Ewindows1258::MATCH()};
4486             $slash = 'div';
4487             }
4488              
4489 0         0 # $', ${'} --> $', ${'}
4490 0         0 elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
4491             $e_string .= $1;
4492             $slash = 'div';
4493             }
4494              
4495 0         0 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Ewindows1258::POSTMATCH()]}
4496 0         0 elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4497             $e_string .= q{Ewindows1258::POSTMATCH()};
4498             $slash = 'div';
4499             }
4500              
4501 0         0 # bareword
4502 0         0 elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
4503             $e_string .= $1;
4504             $slash = 'div';
4505             }
4506              
4507 0         0 # $0 --> $0
4508 0         0 elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
4509             $e_string .= $1;
4510             $slash = 'div';
4511 0         0 }
4512 0         0 elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
4513             $e_string .= $1;
4514             $slash = 'div';
4515             }
4516              
4517 0         0 # $$ --> $$
4518 0         0 elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
4519             $e_string .= $1;
4520             $slash = 'div';
4521             }
4522              
4523             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
4524 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
4525 0         0 elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
4526             $e_string .= e_capture($1);
4527             $slash = 'div';
4528 0         0 }
4529 0         0 elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
4530             $e_string .= e_capture($1);
4531             $slash = 'div';
4532             }
4533              
4534 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
4535 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
4536             $e_string .= e_capture($1.'->'.$2);
4537             $slash = 'div';
4538             }
4539              
4540 0         0 # $$foo{ ... } --> $ $foo->{ ... }
4541 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
4542             $e_string .= e_capture($1.'->'.$2);
4543             $slash = 'div';
4544             }
4545              
4546 0         0 # $$foo
4547 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
4548             $e_string .= e_capture($1);
4549             $slash = 'div';
4550             }
4551              
4552 0         0 # ${ foo }
4553 0         0 elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
4554             $e_string .= '${' . $1 . '}';
4555             $slash = 'div';
4556             }
4557              
4558 0         0 # ${ ... }
4559 3         10 elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
4560             $e_string .= e_capture($1);
4561             $slash = 'div';
4562             }
4563              
4564             # variable or function
4565 3         15 # $ @ % & * $ #
4566 7         30 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) {
4567             $e_string .= $1;
4568             $slash = 'div';
4569             }
4570             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
4571 7         24 # $ @ # \ ' " / ? ( ) [ ] < >
4572 0         0 elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
4573             $e_string .= $1;
4574             $slash = 'div';
4575             }
4576 0         0  
  0         0  
4577 0         0 # subroutines of package Ewindows1258
  0         0  
4578 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
4579 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4580 0         0 elsif ($string =~ /\G \b Windows1258::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4581 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
4582 0         0 elsif ($string =~ /\G \b Windows1258::eval \b /oxgc) { $e_string .= 'eval Windows1258::escape'; $slash = 'm//'; }
  0         0  
4583 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
4584 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Ewindows1258::chop'; $slash = 'm//'; }
  0         0  
4585 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
4586 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
4587 0         0 elsif ($string =~ /\G \b Windows1258::index \b /oxgc) { $e_string .= 'Windows1258::index'; $slash = 'm//'; }
  0         0  
4588 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Ewindows1258::index'; $slash = 'm//'; }
  0         0  
4589 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
4590 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
4591 0         0 elsif ($string =~ /\G \b Windows1258::rindex \b /oxgc) { $e_string .= 'Windows1258::rindex'; $slash = 'm//'; }
  0         0  
4592 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Ewindows1258::rindex'; $slash = 'm//'; }
  0         0  
4593 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::lc'; $slash = 'm//'; }
  0         0  
4594 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::lcfirst'; $slash = 'm//'; }
  0         0  
4595 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::uc'; $slash = 'm//'; }
  0         0  
4596             elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::ucfirst'; $slash = 'm//'; }
4597             elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::fc'; $slash = 'm//'; }
4598 0         0  
  0         0  
4599 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
4600 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4601 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  
4602 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  
4603 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  
4604 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  
4605             elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
4606 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  
4607 0         0  
  0         0  
4608 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4609 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  
4610 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  
4611 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  
4612 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  
4613             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4614             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4615 0         0  
  0         0  
4616 0         0 elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
  0         0  
4617 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4618 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
4619             elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
4620 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4621 0         0  
  0         0  
4622 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4623 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4624 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::chr'; $slash = 'm//'; }
  0         0  
4625 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4626 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
4627 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ewindows1258::glob'; $slash = 'm//'; }
  0         0  
4628 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Ewindows1258::lc_'; $slash = 'm//'; }
  0         0  
4629 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Ewindows1258::lcfirst_'; $slash = 'm//'; }
  0         0  
4630 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Ewindows1258::uc_'; $slash = 'm//'; }
  0         0  
4631 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Ewindows1258::ucfirst_'; $slash = 'm//'; }
  0         0  
4632             elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Ewindows1258::fc_'; $slash = 'm//'; }
4633 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
4634 0         0  
  0         0  
4635 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4636 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4637 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Ewindows1258::chr_'; $slash = 'm//'; }
  0         0  
4638 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4639 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
4640 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Ewindows1258::glob_'; $slash = 'm//'; }
  0         0  
4641             elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
4642             elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
4643 0         0 # split
4644             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
4645 0         0 $slash = 'm//';
4646 0         0  
4647 0         0 my $e = '';
4648             while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
4649             $e .= $1;
4650             }
4651 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          
4652             # end of split
4653             if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Ewindows1258::split' . $e; }
4654 0         0  
  0         0  
4655             # split scalar value
4656             elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . e_string($1); next E_STRING_LOOP; }
4657 0         0  
  0         0  
4658 0         0 # split literal space
  0         0  
4659 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
4660 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4661 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4662 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4663 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4664 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  
4665 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
4666 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4667 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4668 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4669 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4670 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  
4671             elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {' '}; next E_STRING_LOOP; }
4672             elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Ewindows1258::split' . $e . qq {" "}; next E_STRING_LOOP; }
4673              
4674 0 0       0 # split qq//
  0         0  
  0         0  
4675             elsif ($string =~ /\G \b (qq) \b /oxgc) {
4676 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
4677 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4678 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4679 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4680 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  
4681 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  
4682 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  
4683 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  
4684             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
4685 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 * *
4686             }
4687             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4688             }
4689             }
4690              
4691 0 0       0 # split qr//
  0         0  
  0         0  
4692             elsif ($string =~ /\G \b (qr) \b /oxgc) {
4693 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
4694 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4695 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4696 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4697 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  
4698 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  
4699 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  
4700 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  
4701 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  
4702             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
4703 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 * *
4704             }
4705             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4706             }
4707             }
4708              
4709 0 0       0 # split q//
  0         0  
  0         0  
4710             elsif ($string =~ /\G \b (q) \b /oxgc) {
4711 0         0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
4712 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4713 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4714 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4715 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  
4716 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  
4717 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  
4718 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  
4719             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
4720 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 * *
4721             }
4722             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4723             }
4724             }
4725              
4726 0 0       0 # split m//
  0         0  
  0         0  
4727             elsif ($string =~ /\G \b (m) \b /oxgc) {
4728 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 # #
4729 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4730 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4731 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4732 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  
4733 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  
4734 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  
4735 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  
4736 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  
4737             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
4738 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 * *
4739             }
4740             die __FILE__, ": Search pattern not terminated\n";
4741             }
4742             }
4743              
4744 0         0 # split ''
4745 0         0 elsif ($string =~ /\G (\') /oxgc) {
4746 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
4747 0         0 while ($string !~ /\G \z/oxgc) {
4748 0         0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0         0  
4749 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
4750             elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
4751 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
4752             }
4753             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4754             }
4755              
4756 0         0 # split ""
4757 0         0 elsif ($string =~ /\G (\") /oxgc) {
4758 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
4759 0         0 while ($string !~ /\G \z/oxgc) {
4760 0         0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
4761 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
4762             elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
4763 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
4764             }
4765             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4766             }
4767              
4768 0         0 # split //
4769 0         0 elsif ($string =~ /\G (\/) /oxgc) {
4770 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
4771 0         0 while ($string !~ /\G \z/oxgc) {
4772 0         0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0         0  
4773 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
4774             elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
4775 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
4776             }
4777             die __FILE__, ": Search pattern not terminated\n";
4778             }
4779             }
4780              
4781 0         0 # qq//
4782 0 0       0 elsif ($string =~ /\G \b (qq) \b /oxgc) {
4783 0         0 my $ope = $1;
4784             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
4785             $e_string .= e_qq($ope,$1,$3,$2);
4786 0         0 }
4787 0         0 else {
4788 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
4789 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4790 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4791 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
4792 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
4793 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
4794             elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
4795 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
4796             }
4797             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4798             }
4799             }
4800              
4801 0         0 # qx//
4802 0 0       0 elsif ($string =~ /\G \b (qx) \b /oxgc) {
4803 0         0 my $ope = $1;
4804             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4805             $e_string .= e_qq($ope,$1,$3,$2);
4806 0         0 }
4807 0         0 else {
4808 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4809 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4810 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4811 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
4812 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
4813 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
4814 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
4815             elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
4816 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
4817             }
4818             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4819             }
4820             }
4821              
4822 0         0 # q//
4823 0 0       0 elsif ($string =~ /\G \b (q) \b /oxgc) {
4824 0         0 my $ope = $1;
4825             if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
4826             $e_string .= e_q($ope,$1,$3,$2);
4827 0         0 }
4828 0         0 else {
4829 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
4830 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4831 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4832 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
4833 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
4834 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
4835             elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
4836 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 * *
4837             }
4838             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4839             }
4840             }
4841 0         0  
4842             # ''
4843             elsif ($string =~ /\G (?
4844 0         0  
4845             # ""
4846             elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
4847 0         0  
4848             # ``
4849             elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
4850 0         0  
4851             # <<>> (a safer ARGV)
4852             elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
4853 0         0  
4854             # <<= <=> <= < operator
4855             elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
4856 0         0  
4857             #
4858             elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
4859              
4860 0         0 # --- glob
4861             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
4862             $e_string .= 'Ewindows1258::glob("' . $1 . '")';
4863             }
4864              
4865 0         0 # << (bit shift) --- not here document
4866 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) {
4867             $slash = 'm//';
4868             $e_string .= $1;
4869             }
4870              
4871 0         0 # <<~'HEREDOC'
4872 0         0 elsif ($string =~ /\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
4873 0         0 $slash = 'm//';
4874             my $here_quote = $1;
4875             my $delimiter = $2;
4876 0 0       0  
4877 0         0 # get here document
4878 0         0 if ($here_script eq '') {
4879             $here_script = CORE::substr $_, pos $_;
4880 0 0       0 $here_script =~ s/.*?\n//oxm;
4881 0         0 }
4882 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4883 0         0 my $heredoc = $1;
4884 0         0 my $indent = $2;
4885 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4886             push @heredoc, $heredoc . qq{\n$delimiter\n};
4887             push @heredoc_delimiter, qq{\\s*$delimiter};
4888 0         0 }
4889             else {
4890 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4891             }
4892             $e_string .= qq{<<'$delimiter'};
4893             }
4894              
4895 0         0 # <<~\HEREDOC
4896 0         0 elsif ($string =~ /\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
4897 0         0 $slash = 'm//';
4898             my $here_quote = $1;
4899             my $delimiter = $2;
4900 0 0       0  
4901 0         0 # get here document
4902 0         0 if ($here_script eq '') {
4903             $here_script = CORE::substr $_, pos $_;
4904 0 0       0 $here_script =~ s/.*?\n//oxm;
4905 0         0 }
4906 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4907 0         0 my $heredoc = $1;
4908 0         0 my $indent = $2;
4909 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4910             push @heredoc, $heredoc . qq{\n$delimiter\n};
4911             push @heredoc_delimiter, qq{\\s*$delimiter};
4912 0         0 }
4913             else {
4914 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4915             }
4916             $e_string .= qq{<<\\$delimiter};
4917             }
4918              
4919 0         0 # <<~"HEREDOC"
4920 0         0 elsif ($string =~ /\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
4921 0         0 $slash = 'm//';
4922             my $here_quote = $1;
4923             my $delimiter = $2;
4924 0 0       0  
4925 0         0 # get here document
4926 0         0 if ($here_script eq '') {
4927             $here_script = CORE::substr $_, pos $_;
4928 0 0       0 $here_script =~ s/.*?\n//oxm;
4929 0         0 }
4930 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4931 0         0 my $heredoc = $1;
4932 0         0 my $indent = $2;
4933 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4934             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4935             push @heredoc_delimiter, qq{\\s*$delimiter};
4936 0         0 }
4937             else {
4938 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4939             }
4940             $e_string .= qq{<<"$delimiter"};
4941             }
4942              
4943 0         0 # <<~HEREDOC
4944 0         0 elsif ($string =~ /\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
4945 0         0 $slash = 'm//';
4946             my $here_quote = $1;
4947             my $delimiter = $2;
4948 0 0       0  
4949 0         0 # get here document
4950 0         0 if ($here_script eq '') {
4951             $here_script = CORE::substr $_, pos $_;
4952 0 0       0 $here_script =~ s/.*?\n//oxm;
4953 0         0 }
4954 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4955 0         0 my $heredoc = $1;
4956 0         0 my $indent = $2;
4957 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4958             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4959             push @heredoc_delimiter, qq{\\s*$delimiter};
4960 0         0 }
4961             else {
4962 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4963             }
4964             $e_string .= qq{<<$delimiter};
4965             }
4966              
4967 0         0 # <<~`HEREDOC`
4968 0         0 elsif ($string =~ /\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
4969 0         0 $slash = 'm//';
4970             my $here_quote = $1;
4971             my $delimiter = $2;
4972 0 0       0  
4973 0         0 # get here document
4974 0         0 if ($here_script eq '') {
4975             $here_script = CORE::substr $_, pos $_;
4976 0 0       0 $here_script =~ s/.*?\n//oxm;
4977 0         0 }
4978 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4979 0         0 my $heredoc = $1;
4980 0         0 my $indent = $2;
4981 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
4982             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4983             push @heredoc_delimiter, qq{\\s*$delimiter};
4984 0         0 }
4985             else {
4986 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4987             }
4988             $e_string .= qq{<<`$delimiter`};
4989             }
4990              
4991 0         0 # <<'HEREDOC'
4992 0         0 elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4993 0         0 $slash = 'm//';
4994             my $here_quote = $1;
4995             my $delimiter = $2;
4996 0 0       0  
4997 0         0 # get here document
4998 0         0 if ($here_script eq '') {
4999             $here_script = CORE::substr $_, pos $_;
5000 0 0       0 $here_script =~ s/.*?\n//oxm;
5001 0         0 }
5002 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5003             push @heredoc, $1 . qq{\n$delimiter\n};
5004             push @heredoc_delimiter, $delimiter;
5005 0         0 }
5006             else {
5007 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5008             }
5009             $e_string .= $here_quote;
5010             }
5011              
5012 0         0 # <<\HEREDOC
5013 0         0 elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
5014 0         0 $slash = 'm//';
5015             my $here_quote = $1;
5016             my $delimiter = $2;
5017 0 0       0  
5018 0         0 # get here document
5019 0         0 if ($here_script eq '') {
5020             $here_script = CORE::substr $_, pos $_;
5021 0 0       0 $here_script =~ s/.*?\n//oxm;
5022 0         0 }
5023 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5024             push @heredoc, $1 . qq{\n$delimiter\n};
5025             push @heredoc_delimiter, $delimiter;
5026 0         0 }
5027             else {
5028 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5029             }
5030             $e_string .= $here_quote;
5031             }
5032              
5033 0         0 # <<"HEREDOC"
5034 0         0 elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
5035 0         0 $slash = 'm//';
5036             my $here_quote = $1;
5037             my $delimiter = $2;
5038 0 0       0  
5039 0         0 # get here document
5040 0         0 if ($here_script eq '') {
5041             $here_script = CORE::substr $_, pos $_;
5042 0 0       0 $here_script =~ s/.*?\n//oxm;
5043 0         0 }
5044 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5045             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5046             push @heredoc_delimiter, $delimiter;
5047 0         0 }
5048             else {
5049 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5050             }
5051             $e_string .= $here_quote;
5052             }
5053              
5054 0         0 # <
5055 0         0 elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
5056 0         0 $slash = 'm//';
5057             my $here_quote = $1;
5058             my $delimiter = $2;
5059 0 0       0  
5060 0         0 # get here document
5061 0         0 if ($here_script eq '') {
5062             $here_script = CORE::substr $_, pos $_;
5063 0 0       0 $here_script =~ s/.*?\n//oxm;
5064 0         0 }
5065 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5066             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5067             push @heredoc_delimiter, $delimiter;
5068 0         0 }
5069             else {
5070 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5071             }
5072             $e_string .= $here_quote;
5073             }
5074              
5075 0         0 # <<`HEREDOC`
5076 0         0 elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
5077 0         0 $slash = 'm//';
5078             my $here_quote = $1;
5079             my $delimiter = $2;
5080 0 0       0  
5081 0         0 # get here document
5082 0         0 if ($here_script eq '') {
5083             $here_script = CORE::substr $_, pos $_;
5084 0 0       0 $here_script =~ s/.*?\n//oxm;
5085 0         0 }
5086 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5087             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5088             push @heredoc_delimiter, $delimiter;
5089 0         0 }
5090             else {
5091 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5092             }
5093             $e_string .= $here_quote;
5094             }
5095              
5096             # any operator before div
5097             elsif ($string =~ /\G (
5098             -- | \+\+ |
5099 0         0 [\)\}\]]
  18         30  
5100              
5101             ) /oxgc) { $slash = 'div'; $e_string .= $1; }
5102              
5103             # yada-yada or triple-dot operator
5104             elsif ($string =~ /\G (
5105 18         51 \.\.\.
  0         0  
5106              
5107             ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
5108              
5109             # any operator before m//
5110             elsif ($string =~ /\G ((?>
5111              
5112             !~~ | !~ | != | ! |
5113             %= | % |
5114             &&= | && | &= | &\.= | &\. | & |
5115             -= | -> | - |
5116             :(?>\s*)= |
5117             : |
5118             <<>> |
5119             <<= | <=> | <= | < |
5120             == | => | =~ | = |
5121             >>= | >> | >= | > |
5122             \*\*= | \*\* | \*= | \* |
5123             \+= | \+ |
5124             \.\. | \.= | \. |
5125             \/\/= | \/\/ |
5126             \/= | \/ |
5127             \? |
5128             \\ |
5129             \^= | \^\.= | \^\. | \^ |
5130             \b x= |
5131             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
5132             ~~ | ~\. | ~ |
5133             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
5134             \b(?: print )\b |
5135              
5136 0         0 [,;\(\{\[]
  31         60  
5137              
5138             )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
5139 31         117  
5140             # other any character
5141             elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
5142              
5143 131         365 # system error
5144             else {
5145             die __FILE__, ": Oops, this shouldn't happen!\n";
5146             }
5147 0         0 }
5148              
5149             return $e_string;
5150             }
5151              
5152             #
5153             # character class
5154 17     1919 0 92 #
5155             sub character_class {
5156 1919 100       3320 my($char,$modifier) = @_;
5157 1919 100       2997  
5158 52         102 if ($char eq '.') {
5159             if ($modifier =~ /s/) {
5160             return '${Ewindows1258::dot_s}';
5161 17         34 }
5162             else {
5163             return '${Ewindows1258::dot}';
5164             }
5165 35         71 }
5166             else {
5167             return Ewindows1258::classic_character_class($char);
5168             }
5169             }
5170              
5171             #
5172             # escape capture ($1, $2, $3, ...)
5173             #
5174 1867     212 0 3074 sub e_capture {
5175              
5176             return join '', '${', $_[0], '}';
5177             }
5178              
5179             #
5180             # escape transliteration (tr/// or y///)
5181 212     3 0 796 #
5182 3         16 sub e_tr {
5183 3   50     6 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
5184             my $e_tr = '';
5185 3         10 $modifier ||= '';
5186              
5187             $slash = 'div';
5188 3         6  
5189             # quote character class 1
5190             $charclass = q_tr($charclass);
5191 3         5  
5192             # quote character class 2
5193             $charclass2 = q_tr($charclass2);
5194 3 50       6  
5195 3 0       9 # /b /B modifier
5196 0         0 if ($modifier =~ tr/bB//d) {
5197             if ($variable eq '') {
5198             $e_tr = qq{tr$charclass$e$charclass2$modifier};
5199 0         0 }
5200             else {
5201             $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
5202             }
5203 0 100       0 }
5204 3         4 else {
5205             if ($variable eq '') {
5206             $e_tr = qq{Ewindows1258::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
5207 2         5 }
5208             else {
5209             $e_tr = qq{Ewindows1258::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
5210             }
5211             }
5212 1         4  
5213 3         5 # clear tr/// variable
5214             $tr_variable = '';
5215 3         3 $bind_operator = '';
5216              
5217             return $e_tr;
5218             }
5219              
5220             #
5221             # quote for escape transliteration (tr/// or y///)
5222 3     6 0 17 #
5223             sub q_tr {
5224             my($charclass) = @_;
5225 6 50       7  
    0          
    0          
    0          
    0          
    0          
5226 6         12 # quote character class
5227             if ($charclass !~ /'/oxms) {
5228             return e_q('', "'", "'", $charclass); # --> q' '
5229 6         10 }
5230             elsif ($charclass !~ /\//oxms) {
5231             return e_q('q', '/', '/', $charclass); # --> q/ /
5232 0         0 }
5233             elsif ($charclass !~ /\#/oxms) {
5234             return e_q('q', '#', '#', $charclass); # --> q# #
5235 0         0 }
5236             elsif ($charclass !~ /[\<\>]/oxms) {
5237             return e_q('q', '<', '>', $charclass); # --> q< >
5238 0         0 }
5239             elsif ($charclass !~ /[\(\)]/oxms) {
5240             return e_q('q', '(', ')', $charclass); # --> q( )
5241 0         0 }
5242             elsif ($charclass !~ /[\{\}]/oxms) {
5243             return e_q('q', '{', '}', $charclass); # --> q{ }
5244 0         0 }
5245 0 0       0 else {
5246 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5247             if ($charclass !~ /\Q$char\E/xms) {
5248             return e_q('q', $char, $char, $charclass);
5249             }
5250             }
5251 0         0 }
5252              
5253             return e_q('q', '{', '}', $charclass);
5254             }
5255              
5256             #
5257             # escape q string (q//, '')
5258 0     1264 0 0 #
5259             sub e_q {
5260 1264         2874 my($ope,$delimiter,$end_delimiter,$string) = @_;
5261              
5262 1264         1734 $slash = 'div';
5263              
5264             return join '', $ope, $delimiter, $string, $end_delimiter;
5265             }
5266              
5267             #
5268             # escape qq string (qq//, "", qx//, ``)
5269 1264     4020 0 6009 #
5270             sub e_qq {
5271 4020         8985 my($ope,$delimiter,$end_delimiter,$string) = @_;
5272              
5273 4020         7813 $slash = 'div';
5274 4020         4739  
5275             my $left_e = 0;
5276             my $right_e = 0;
5277 4020         4462  
5278             # split regexp
5279             my @char = $string =~ /\G((?>
5280             [^\\\$] |
5281             \\x\{ (?>[0-9A-Fa-f]+) \} |
5282             \\o\{ (?>[0-7]+) \} |
5283             \\N\{ (?>[^0-9\}][^\}]*) \} |
5284             \\ $q_char |
5285             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5286             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5287             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5288             \$ (?>\s* [0-9]+) |
5289             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5290             \$ \$ (?![\w\{]) |
5291             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5292             $q_char
5293 4020         126887 ))/oxmsg;
5294              
5295             for (my $i=0; $i <= $#char; $i++) {
5296 4020 50 33     11934  
    50 33        
    100          
    100          
    50          
5297 114733         352450 # "\L\u" --> "\u\L"
5298             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5299             @char[$i,$i+1] = @char[$i+1,$i];
5300             }
5301              
5302 0         0 # "\U\l" --> "\l\U"
5303             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5304             @char[$i,$i+1] = @char[$i+1,$i];
5305             }
5306              
5307 0         0 # octal escape sequence
5308             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5309             $char[$i] = Ewindows1258::octchr($1);
5310             }
5311              
5312 1         3 # hexadecimal escape sequence
5313             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5314             $char[$i] = Ewindows1258::hexchr($1);
5315             }
5316              
5317 1         4 # \N{CHARNAME} --> N{CHARNAME}
5318             elsif ($char[$i] =~ /\A \\ ( N\{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
5319             $char[$i] = $1;
5320 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          
5321              
5322             if (0) {
5323             }
5324              
5325             # \F
5326             #
5327             # P.69 Table 2-6. Translation escapes
5328             # in Chapter 2: Bits and Pieces
5329             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5330             # (and so on)
5331 114733         868643  
5332 0 50       0 # \u \l \U \L \F \Q \E
5333 484         1050 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5334             if ($right_e < $left_e) {
5335             $char[$i] = '\\' . $char[$i];
5336             }
5337             }
5338             elsif ($char[$i] eq '\u') {
5339              
5340             # "STRING @{[ LIST EXPR ]} MORE STRING"
5341              
5342             # P.257 Other Tricks You Can Do with Hard References
5343             # in Chapter 8: References
5344             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5345              
5346             # P.353 Other Tricks You Can Do with Hard References
5347             # in Chapter 8: References
5348             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5349              
5350 0         0 # (and so on)
5351 0         0  
5352             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
5353             $left_e++;
5354 0         0 }
5355 0         0 elsif ($char[$i] eq '\l') {
5356             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
5357             $left_e++;
5358 0         0 }
5359 0         0 elsif ($char[$i] eq '\U') {
5360             $char[$i] = '@{[Ewindows1258::uc qq<';
5361             $left_e++;
5362 0         0 }
5363 0         0 elsif ($char[$i] eq '\L') {
5364             $char[$i] = '@{[Ewindows1258::lc qq<';
5365             $left_e++;
5366 0         0 }
5367 24         30 elsif ($char[$i] eq '\F') {
5368             $char[$i] = '@{[Ewindows1258::fc qq<';
5369             $left_e++;
5370 24         47 }
5371 0         0 elsif ($char[$i] eq '\Q') {
5372             $char[$i] = '@{[CORE::quotemeta qq<';
5373             $left_e++;
5374 0 50       0 }
5375 24         37 elsif ($char[$i] eq '\E') {
5376 24         28 if ($right_e < $left_e) {
5377             $char[$i] = '>]}';
5378             $right_e++;
5379 24         41 }
5380             else {
5381             $char[$i] = '';
5382             }
5383 0         0 }
5384 0 0       0 elsif ($char[$i] eq '\Q') {
5385 0         0 while (1) {
5386             if (++$i > $#char) {
5387 0 0       0 last;
5388 0         0 }
5389             if ($char[$i] eq '\E') {
5390             last;
5391             }
5392             }
5393             }
5394             elsif ($char[$i] eq '\E') {
5395             }
5396              
5397             # $0 --> $0
5398             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5399             }
5400             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5401             }
5402              
5403             # $$ --> $$
5404             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5405             }
5406              
5407             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5408 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5409             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5410             $char[$i] = e_capture($1);
5411 205         370 }
5412             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5413             $char[$i] = e_capture($1);
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_bracket)*? \] ) \z/oxms) {
5418             $char[$i] = e_capture($1.'->'.$2);
5419             }
5420              
5421 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5422             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5423             $char[$i] = e_capture($1.'->'.$2);
5424             }
5425              
5426 0         0 # $$foo
5427             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5428             $char[$i] = e_capture($1);
5429             }
5430              
5431 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
5432             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5433             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
5434             }
5435              
5436 44         109 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
5437             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5438             $char[$i] = '@{[Ewindows1258::MATCH()]}';
5439             }
5440              
5441 45         120 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
5442             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5443             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
5444             }
5445              
5446             # ${ foo } --> ${ foo }
5447             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5448             }
5449              
5450 33         94 # ${ ... }
5451             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5452             $char[$i] = e_capture($1);
5453             }
5454             }
5455 0 50       0  
5456 4020         7653 # return string
5457             if ($left_e > $right_e) {
5458 0         0 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
5459             }
5460             return join '', $ope, $delimiter, @char, $end_delimiter;
5461             }
5462              
5463             #
5464             # escape qw string (qw//)
5465 4020     16 0 30206 #
5466             sub e_qw {
5467 16         72 my($ope,$delimiter,$end_delimiter,$string) = @_;
5468              
5469             $slash = 'div';
5470 16         41  
  16         230  
5471 483 50       718 # choice again delimiter
    0          
    0          
    0          
    0          
5472 16         102 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
5473             if (not $octet{$end_delimiter}) {
5474             return join '', $ope, $delimiter, $string, $end_delimiter;
5475 16         119 }
5476             elsif (not $octet{')'}) {
5477             return join '', $ope, '(', $string, ')';
5478 0         0 }
5479             elsif (not $octet{'}'}) {
5480             return join '', $ope, '{', $string, '}';
5481 0         0 }
5482             elsif (not $octet{']'}) {
5483             return join '', $ope, '[', $string, ']';
5484 0         0 }
5485             elsif (not $octet{'>'}) {
5486             return join '', $ope, '<', $string, '>';
5487 0         0 }
5488 0 0       0 else {
5489 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5490             if (not $octet{$char}) {
5491             return join '', $ope, $char, $string, $char;
5492             }
5493             }
5494             }
5495 0         0  
5496 0         0 # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
5497 0         0 my @string = CORE::split(/\s+/, $string);
5498 0         0 for my $string (@string) {
5499 0 0       0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
5500 0         0 for my $octet (@octet) {
5501             if ($octet =~ /\A (['\\]) \z/oxms) {
5502             $octet = '\\' . $1;
5503 0         0 }
5504             }
5505 0         0 $string = join '', @octet;
  0         0  
5506             }
5507             return join '', '(', (join ', ', map { "'$_'" } @string), ')';
5508             }
5509              
5510             #
5511             # escape here document (<<"HEREDOC", <
5512 0     93 0 0 #
5513             sub e_heredoc {
5514 93         249 my($string) = @_;
5515              
5516 93         152 $slash = 'm//';
5517              
5518 93         272 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
5519 93         170  
5520             my $left_e = 0;
5521             my $right_e = 0;
5522 93         123  
5523             # split regexp
5524             my @char = $string =~ /\G((?>
5525             [^\\\$] |
5526             \\x\{ (?>[0-9A-Fa-f]+) \} |
5527             \\o\{ (?>[0-7]+) \} |
5528             \\N\{ (?>[^0-9\}][^\}]*) \} |
5529             \\ $q_char |
5530             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5531             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5532             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5533             \$ (?>\s* [0-9]+) |
5534             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5535             \$ \$ (?![\w\{]) |
5536             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5537             $q_char
5538 93         8221 ))/oxmsg;
5539              
5540             for (my $i=0; $i <= $#char; $i++) {
5541 93 50 33     391  
    50 33        
    100          
    100          
    50          
5542 3307         10398 # "\L\u" --> "\u\L"
5543             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5544             @char[$i,$i+1] = @char[$i+1,$i];
5545             }
5546              
5547 0         0 # "\U\l" --> "\l\U"
5548             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5549             @char[$i,$i+1] = @char[$i+1,$i];
5550             }
5551              
5552 0         0 # octal escape sequence
5553             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5554             $char[$i] = Ewindows1258::octchr($1);
5555             }
5556              
5557 1         2 # hexadecimal escape sequence
5558             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5559             $char[$i] = Ewindows1258::hexchr($1);
5560             }
5561              
5562 1         3 # \N{CHARNAME} --> N{CHARNAME}
5563             elsif ($char[$i] =~ /\A \\ ( N\{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
5564             $char[$i] = $1;
5565 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          
5566              
5567             if (0) {
5568             }
5569 3307         27023  
5570 0 0       0 # \u \l \U \L \F \Q \E
5571 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5572             if ($right_e < $left_e) {
5573             $char[$i] = '\\' . $char[$i];
5574             }
5575 0         0 }
5576 0         0 elsif ($char[$i] eq '\u') {
5577             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
5578             $left_e++;
5579 0         0 }
5580 0         0 elsif ($char[$i] eq '\l') {
5581             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
5582             $left_e++;
5583 0         0 }
5584 0         0 elsif ($char[$i] eq '\U') {
5585             $char[$i] = '@{[Ewindows1258::uc qq<';
5586             $left_e++;
5587 0         0 }
5588 0         0 elsif ($char[$i] eq '\L') {
5589             $char[$i] = '@{[Ewindows1258::lc qq<';
5590             $left_e++;
5591 0         0 }
5592 0         0 elsif ($char[$i] eq '\F') {
5593             $char[$i] = '@{[Ewindows1258::fc qq<';
5594             $left_e++;
5595 0         0 }
5596 0         0 elsif ($char[$i] eq '\Q') {
5597             $char[$i] = '@{[CORE::quotemeta qq<';
5598             $left_e++;
5599 0 0       0 }
5600 0         0 elsif ($char[$i] eq '\E') {
5601 0         0 if ($right_e < $left_e) {
5602             $char[$i] = '>]}';
5603             $right_e++;
5604 0         0 }
5605             else {
5606             $char[$i] = '';
5607             }
5608 0         0 }
5609 0 0       0 elsif ($char[$i] eq '\Q') {
5610 0         0 while (1) {
5611             if (++$i > $#char) {
5612 0 0       0 last;
5613 0         0 }
5614             if ($char[$i] eq '\E') {
5615             last;
5616             }
5617             }
5618             }
5619             elsif ($char[$i] eq '\E') {
5620             }
5621              
5622             # $0 --> $0
5623             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5624             }
5625             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5626             }
5627              
5628             # $$ --> $$
5629             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5630             }
5631              
5632             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5633 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5634             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5635             $char[$i] = e_capture($1);
5636 0         0 }
5637             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5638             $char[$i] = e_capture($1);
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_bracket)*? \] ) \z/oxms) {
5643             $char[$i] = e_capture($1.'->'.$2);
5644             }
5645              
5646 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5647             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5648             $char[$i] = e_capture($1.'->'.$2);
5649             }
5650              
5651 0         0 # $$foo
5652             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5653             $char[$i] = e_capture($1);
5654             }
5655              
5656 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
5657             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5658             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
5659             }
5660              
5661 8         41 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
5662             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5663             $char[$i] = '@{[Ewindows1258::MATCH()]}';
5664             }
5665              
5666 8         49 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
5667             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5668             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
5669             }
5670              
5671             # ${ foo } --> ${ foo }
5672             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5673             }
5674              
5675 6         32 # ${ ... }
5676             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5677             $char[$i] = e_capture($1);
5678             }
5679             }
5680 0 50       0  
5681 93         201 # return string
5682             if ($left_e > $right_e) {
5683 0         0 return join '', @char, '>]}' x ($left_e - $right_e);
5684             }
5685             return join '', @char;
5686             }
5687              
5688             #
5689             # escape regexp (m//, qr//)
5690 93     652 0 734 #
5691 652   100     2545 sub e_qr {
5692             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
5693 652         2486 $modifier ||= '';
5694 652 50       1077  
5695 652         1416 $modifier =~ tr/p//d;
5696 0         0 if ($modifier =~ /([adlu])/oxms) {
5697 0 0       0 my $line = 0;
5698 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
5699 0         0 if ($filename ne __FILE__) {
5700             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
5701             last;
5702 0         0 }
5703             }
5704             die qq{Unsupported modifier "$1" used at line $line.\n};
5705 0         0 }
5706              
5707             $slash = 'div';
5708 652 100       1015  
    100          
5709 652         1781 # literal null string pattern
5710 8         12 if ($string eq '') {
5711 8         10 $modifier =~ tr/bB//d;
5712             $modifier =~ tr/i//d;
5713             return join '', $ope, $delimiter, $end_delimiter, $modifier;
5714             }
5715              
5716             # /b /B modifier
5717             elsif ($modifier =~ tr/bB//d) {
5718 8 50       35  
5719 2         7 # choice again delimiter
5720 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
5721 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
5722 0         0 my %octet = map {$_ => 1} @char;
5723 0         0 if (not $octet{')'}) {
5724             $delimiter = '(';
5725             $end_delimiter = ')';
5726 0         0 }
5727 0         0 elsif (not $octet{'}'}) {
5728             $delimiter = '{';
5729             $end_delimiter = '}';
5730 0         0 }
5731 0         0 elsif (not $octet{']'}) {
5732             $delimiter = '[';
5733             $end_delimiter = ']';
5734 0         0 }
5735 0         0 elsif (not $octet{'>'}) {
5736             $delimiter = '<';
5737             $end_delimiter = '>';
5738 0         0 }
5739 0 0       0 else {
5740 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5741 0         0 if (not $octet{$char}) {
5742 0         0 $delimiter = $char;
5743             $end_delimiter = $char;
5744             last;
5745             }
5746             }
5747             }
5748 0 50 33     0 }
5749 2         10  
5750             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
5751             return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
5752 0         0 }
5753             else {
5754             return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
5755             }
5756 2 100       10 }
5757 642         1358  
5758             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
5759             my $metachar = qr/[\@\\|[\]{^]/oxms;
5760 642         2220  
5761             # split regexp
5762             my @char = $string =~ /\G((?>
5763             [^\\\$\@\[\(] |
5764             \\x (?>[0-9A-Fa-f]{1,2}) |
5765             \\ (?>[0-7]{2,3}) |
5766             \\c [\x40-\x5F] |
5767             \\x\{ (?>[0-9A-Fa-f]+) \} |
5768             \\o\{ (?>[0-7]+) \} |
5769             \\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
5770             \\ $q_char |
5771             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5772             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5773             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5774             [\$\@] $qq_variable |
5775             \$ (?>\s* [0-9]+) |
5776             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5777             \$ \$ (?![\w\{]) |
5778             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5779             \[\^ |
5780             \[\: (?>[a-z]+) :\] |
5781             \[\:\^ (?>[a-z]+) :\] |
5782             \(\? |
5783             $q_char
5784             ))/oxmsg;
5785 642 50       60461  
5786 642         2530 # choice again delimiter
  0         0  
5787 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
5788 0         0 my %octet = map {$_ => 1} @char;
5789 0         0 if (not $octet{')'}) {
5790             $delimiter = '(';
5791             $end_delimiter = ')';
5792 0         0 }
5793 0         0 elsif (not $octet{'}'}) {
5794             $delimiter = '{';
5795             $end_delimiter = '}';
5796 0         0 }
5797 0         0 elsif (not $octet{']'}) {
5798             $delimiter = '[';
5799             $end_delimiter = ']';
5800 0         0 }
5801 0         0 elsif (not $octet{'>'}) {
5802             $delimiter = '<';
5803             $end_delimiter = '>';
5804 0         0 }
5805 0 0       0 else {
5806 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5807 0         0 if (not $octet{$char}) {
5808 0         0 $delimiter = $char;
5809             $end_delimiter = $char;
5810             last;
5811             }
5812             }
5813             }
5814 0         0 }
5815 642         949  
5816 642         843 my $left_e = 0;
5817             my $right_e = 0;
5818             for (my $i=0; $i <= $#char; $i++) {
5819 642 50 66     1625  
    50 66        
    100          
    100          
    100          
    100          
5820 1872         9139 # "\L\u" --> "\u\L"
5821             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5822             @char[$i,$i+1] = @char[$i+1,$i];
5823             }
5824              
5825 0         0 # "\U\l" --> "\l\U"
5826             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5827             @char[$i,$i+1] = @char[$i+1,$i];
5828             }
5829              
5830 0         0 # octal escape sequence
5831             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5832             $char[$i] = Ewindows1258::octchr($1);
5833             }
5834              
5835 1         3 # hexadecimal escape sequence
5836             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5837             $char[$i] = Ewindows1258::hexchr($1);
5838             }
5839              
5840             # \b{...} --> b\{...}
5841             # \B{...} --> B\{...}
5842             # \N{CHARNAME} --> N\{CHARNAME}
5843             # \p{PROPERTY} --> p\{PROPERTY}
5844 1         3 # \P{PROPERTY} --> P\{PROPERTY}
5845             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
5846             $char[$i] = $1 . '\\' . $2;
5847             }
5848              
5849 6         19 # \p, \P, \X --> p, P, X
5850             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
5851             $char[$i] = $1;
5852 4 100 100     10 }
    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          
5853              
5854             if (0) {
5855             }
5856 1872         5058  
5857 0 50 33     0 # join separated multiple-octet
    50 33        
    50 33        
      33        
      66        
      33        
5858 6         79 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
5859             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)) {
5860             $char[$i] .= join '', splice @char, $i+1, 3;
5861 0         0 }
5862             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)) {
5863             $char[$i] .= join '', splice @char, $i+1, 2;
5864 0         0 }
5865             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)) {
5866             $char[$i] .= join '', splice @char, $i+1, 1;
5867             }
5868             }
5869              
5870 0         0 # open character class [...]
5871             elsif ($char[$i] eq '[') {
5872             my $left = $i;
5873              
5874             # [] make die "Unmatched [] in regexp ...\n"
5875 328 100       552 # (and so on)
5876 328         783  
5877             if ($char[$i+1] eq ']') {
5878             $i++;
5879 3         7 }
5880 328 50       413  
5881 1379         1971 while (1) {
5882             if (++$i > $#char) {
5883 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
5884 1379         2122 }
5885             if ($char[$i] eq ']') {
5886             my $right = $i;
5887 328 100       425  
5888 328         1631 # [...]
  30         71  
5889             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5890             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);
5891 90         135 }
5892             else {
5893             splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
5894 298         1050 }
5895 328         563  
5896             $i = $left;
5897             last;
5898             }
5899             }
5900             }
5901              
5902 328         829 # open character class [^...]
5903             elsif ($char[$i] eq '[^') {
5904             my $left = $i;
5905              
5906             # [^] make die "Unmatched [] in regexp ...\n"
5907 74 100       98 # (and so on)
5908 74         153  
5909             if ($char[$i+1] eq ']') {
5910             $i++;
5911 4         7 }
5912 74 50       92  
5913 272         392 while (1) {
5914             if (++$i > $#char) {
5915 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
5916 272         411 }
5917             if ($char[$i] eq ']') {
5918             my $right = $i;
5919 74 100       94  
5920 74         564 # [^...]
  30         94  
5921             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5922             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);
5923 90         146 }
5924             else {
5925             splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
5926 44         157 }
5927 74         133  
5928             $i = $left;
5929             last;
5930             }
5931             }
5932             }
5933              
5934 74         196 # rewrite character class or escape character
5935             elsif (my $char = character_class($char[$i],$modifier)) {
5936             $char[$i] = $char;
5937             }
5938              
5939 139 50       349 # /i modifier
5940 20         32 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
5941             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
5942             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
5943 20         36 }
5944             else {
5945             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
5946             }
5947             }
5948              
5949 0 50       0 # \u \l \U \L \F \Q \E
5950 1         5 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
5951             if ($right_e < $left_e) {
5952             $char[$i] = '\\' . $char[$i];
5953             }
5954 0         0 }
5955 0         0 elsif ($char[$i] eq '\u') {
5956             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
5957             $left_e++;
5958 0         0 }
5959 0         0 elsif ($char[$i] eq '\l') {
5960             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
5961             $left_e++;
5962 0         0 }
5963 1         3 elsif ($char[$i] eq '\U') {
5964             $char[$i] = '@{[Ewindows1258::uc qq<';
5965             $left_e++;
5966 1         3 }
5967 1         2 elsif ($char[$i] eq '\L') {
5968             $char[$i] = '@{[Ewindows1258::lc qq<';
5969             $left_e++;
5970 1         3 }
5971 18         30 elsif ($char[$i] eq '\F') {
5972             $char[$i] = '@{[Ewindows1258::fc qq<';
5973             $left_e++;
5974 18         41 }
5975 1         2 elsif ($char[$i] eq '\Q') {
5976             $char[$i] = '@{[CORE::quotemeta qq<';
5977             $left_e++;
5978 1 50       3 }
5979 21         37 elsif ($char[$i] eq '\E') {
5980 21         32 if ($right_e < $left_e) {
5981             $char[$i] = '>]}';
5982             $right_e++;
5983 21         44 }
5984             else {
5985             $char[$i] = '';
5986             }
5987 0         0 }
5988 0 0       0 elsif ($char[$i] eq '\Q') {
5989 0         0 while (1) {
5990             if (++$i > $#char) {
5991 0 0       0 last;
5992 0         0 }
5993             if ($char[$i] eq '\E') {
5994             last;
5995             }
5996             }
5997             }
5998             elsif ($char[$i] eq '\E') {
5999             }
6000              
6001 0 0       0 # $0 --> $0
6002 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6003             if ($ignorecase) {
6004             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6005             }
6006 0 0       0 }
6007 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6008             if ($ignorecase) {
6009             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6010             }
6011             }
6012              
6013             # $$ --> $$
6014             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6015             }
6016              
6017             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6018 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6019 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6020 0         0 $char[$i] = e_capture($1);
6021             if ($ignorecase) {
6022             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6023             }
6024 0         0 }
6025 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6026 0         0 $char[$i] = e_capture($1);
6027             if ($ignorecase) {
6028             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6029             }
6030             }
6031              
6032 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6033 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) {
6034 0         0 $char[$i] = e_capture($1.'->'.$2);
6035             if ($ignorecase) {
6036             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6037             }
6038             }
6039              
6040 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6041 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) {
6042 0         0 $char[$i] = e_capture($1.'->'.$2);
6043             if ($ignorecase) {
6044             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6045             }
6046             }
6047              
6048 0         0 # $$foo
6049 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6050 0         0 $char[$i] = e_capture($1);
6051             if ($ignorecase) {
6052             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6053             }
6054             }
6055              
6056 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
6057 8         21 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6058             if ($ignorecase) {
6059             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::PREMATCH())]}';
6060 0         0 }
6061             else {
6062             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
6063             }
6064             }
6065              
6066 8 50       24 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
6067 8         19 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6068             if ($ignorecase) {
6069             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::MATCH())]}';
6070 0         0 }
6071             else {
6072             $char[$i] = '@{[Ewindows1258::MATCH()]}';
6073             }
6074             }
6075              
6076 8 50       23 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
6077 6         16 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6078             if ($ignorecase) {
6079             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::POSTMATCH())]}';
6080 0         0 }
6081             else {
6082             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
6083             }
6084             }
6085              
6086 6 0       17 # ${ foo }
6087 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) {
6088             if ($ignorecase) {
6089             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6090             }
6091             }
6092              
6093 0         0 # ${ ... }
6094 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6095 0         0 $char[$i] = e_capture($1);
6096             if ($ignorecase) {
6097             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6098             }
6099             }
6100              
6101 0         0 # $scalar or @array
6102 21 100       48 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6103 21         124 $char[$i] = e_string($char[$i]);
6104             if ($ignorecase) {
6105             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6106             }
6107             }
6108              
6109 11 100 33     35 # quote character before ? + * {
    50          
6110             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6111             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6112 138         958 }
6113 0 0       0 elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6114 0         0 my $char = $char[$i-1];
6115             if ($char[$i] eq '{') {
6116             die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
6117 0         0 }
6118             else {
6119             die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
6120             }
6121 0         0 }
6122             else {
6123             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6124             }
6125             }
6126             }
6127 127         444  
6128 642 50       1098 # make regexp string
6129 642 0 0     1286 $modifier =~ tr/i//d;
6130 0         0 if ($left_e > $right_e) {
6131             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6132             return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
6133 0         0 }
6134             else {
6135             return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6136 0 50 33     0 }
6137 642         3197 }
6138             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6139             return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
6140 0         0 }
6141             else {
6142             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6143             }
6144             }
6145              
6146             #
6147             # double quote stuff
6148 642     180 0 4827 #
6149             sub qq_stuff {
6150             my($delimiter,$end_delimiter,$stuff) = @_;
6151 180 100       270  
6152 180         354 # scalar variable or array variable
6153             if ($stuff =~ /\A [\$\@] /oxms) {
6154             return $stuff;
6155             }
6156 100         319  
  80         177  
6157 80         210 # quote by delimiter
6158 80 50       183 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
6159 80 50       139 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6160 80 50       119 next if $char eq $delimiter;
6161 80         143 next if $char eq $end_delimiter;
6162             if (not $octet{$char}) {
6163             return join '', 'qq', $char, $stuff, $char;
6164 80         297 }
6165             }
6166             return join '', 'qq', '<', $stuff, '>';
6167             }
6168              
6169             #
6170             # escape regexp (m'', qr'', and m''b, qr''b)
6171 0     10 0 0 #
6172 10   50     39 sub e_qr_q {
6173             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6174 10         43 $modifier ||= '';
6175 10 50       13  
6176 10         19 $modifier =~ tr/p//d;
6177 0         0 if ($modifier =~ /([adlu])/oxms) {
6178 0 0       0 my $line = 0;
6179 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6180 0         0 if ($filename ne __FILE__) {
6181             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6182             last;
6183 0         0 }
6184             }
6185             die qq{Unsupported modifier "$1" used at line $line.\n};
6186 0         0 }
6187              
6188             $slash = 'div';
6189 10 100       15  
    50          
6190 10         25 # literal null string pattern
6191 8         10 if ($string eq '') {
6192 8         9 $modifier =~ tr/bB//d;
6193             $modifier =~ tr/i//d;
6194             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6195             }
6196              
6197 8         37 # with /b /B modifier
6198             elsif ($modifier =~ tr/bB//d) {
6199             return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6200             }
6201              
6202 0         0 # without /b /B modifier
6203             else {
6204             return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6205             }
6206             }
6207              
6208             #
6209             # escape regexp (m'', qr'')
6210 2     2 0 6 #
6211             sub e_qr_qt {
6212 2 50       7 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6213              
6214             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6215 2         6  
6216             # split regexp
6217             my @char = $string =~ /\G((?>
6218             [^\\\[\$\@\/] |
6219             [\x00-\xFF] |
6220             \[\^ |
6221             \[\: (?>[a-z]+) \:\] |
6222             \[\:\^ (?>[a-z]+) \:\] |
6223             [\$\@\/] |
6224             \\ (?:$q_char) |
6225             (?:$q_char)
6226             ))/oxmsg;
6227 2         57  
6228 2 50 33     9 # unescape character
    50 33        
    50 33        
    50          
    50          
    50          
6229             for (my $i=0; $i <= $#char; $i++) {
6230             if (0) {
6231             }
6232 2         14  
6233 0         0 # open character class [...]
6234 0 0       0 elsif ($char[$i] eq '[') {
6235 0         0 my $left = $i;
6236             if ($char[$i+1] eq ']') {
6237 0         0 $i++;
6238 0 0       0 }
6239 0         0 while (1) {
6240             if (++$i > $#char) {
6241 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6242 0         0 }
6243             if ($char[$i] eq ']') {
6244             my $right = $i;
6245 0         0  
6246             # [...]
6247 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
6248 0         0  
6249             $i = $left;
6250             last;
6251             }
6252             }
6253             }
6254              
6255 0         0 # open character class [^...]
6256 0 0       0 elsif ($char[$i] eq '[^') {
6257 0         0 my $left = $i;
6258             if ($char[$i+1] eq ']') {
6259 0         0 $i++;
6260 0 0       0 }
6261 0         0 while (1) {
6262             if (++$i > $#char) {
6263 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6264 0         0 }
6265             if ($char[$i] eq ']') {
6266             my $right = $i;
6267 0         0  
6268             # [^...]
6269 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6270 0         0  
6271             $i = $left;
6272             last;
6273             }
6274             }
6275             }
6276              
6277 0         0 # escape $ @ / and \
6278             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6279             $char[$i] = '\\' . $char[$i];
6280             }
6281              
6282 0         0 # rewrite character class or escape character
6283             elsif (my $char = character_class($char[$i],$modifier)) {
6284             $char[$i] = $char;
6285             }
6286              
6287 0 0       0 # /i modifier
6288 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
6289             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
6290             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
6291 0         0 }
6292             else {
6293             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
6294             }
6295             }
6296              
6297 0 0       0 # quote character before ? + * {
6298             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6299             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6300 0         0 }
6301             else {
6302             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6303             }
6304             }
6305 0         0 }
6306 2         5  
6307             $delimiter = '/';
6308 2         3 $end_delimiter = '/';
6309 2         3  
6310             $modifier =~ tr/i//d;
6311             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6312             }
6313              
6314             #
6315             # escape regexp (m''b, qr''b)
6316 2     0 0 14 #
6317             sub e_qr_qb {
6318             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6319 0         0  
6320             # split regexp
6321             my @char = $string =~ /\G ((?>[^\\]|\\\\)) /oxmsg;
6322 0         0  
6323 0 0       0 # unescape character
    0          
6324             for (my $i=0; $i <= $#char; $i++) {
6325             if (0) {
6326             }
6327 0         0  
6328             # remain \\
6329             elsif ($char[$i] eq '\\\\') {
6330             }
6331              
6332 0         0 # escape $ @ / and \
6333             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6334             $char[$i] = '\\' . $char[$i];
6335             }
6336 0         0 }
6337 0         0  
6338 0         0 $delimiter = '/';
6339             $end_delimiter = '/';
6340             return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6341             }
6342              
6343             #
6344             # escape regexp (s/here//)
6345 0     76 0 0 #
6346 76   100     211 sub e_s1 {
6347             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6348 76         326 $modifier ||= '';
6349 76 50       113  
6350 76         205 $modifier =~ tr/p//d;
6351 0         0 if ($modifier =~ /([adlu])/oxms) {
6352 0 0       0 my $line = 0;
6353 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6354 0         0 if ($filename ne __FILE__) {
6355             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6356             last;
6357 0         0 }
6358             }
6359             die qq{Unsupported modifier "$1" used at line $line.\n};
6360 0         0 }
6361              
6362             $slash = 'div';
6363 76 100       138  
    50          
6364 76         256 # literal null string pattern
6365 8         10 if ($string eq '') {
6366 8         10 $modifier =~ tr/bB//d;
6367             $modifier =~ tr/i//d;
6368             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6369             }
6370              
6371             # /b /B modifier
6372             elsif ($modifier =~ tr/bB//d) {
6373 8 0       44  
6374 0         0 # choice again delimiter
6375 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
6376 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
6377 0         0 my %octet = map {$_ => 1} @char;
6378 0         0 if (not $octet{')'}) {
6379             $delimiter = '(';
6380             $end_delimiter = ')';
6381 0         0 }
6382 0         0 elsif (not $octet{'}'}) {
6383             $delimiter = '{';
6384             $end_delimiter = '}';
6385 0         0 }
6386 0         0 elsif (not $octet{']'}) {
6387             $delimiter = '[';
6388             $end_delimiter = ']';
6389 0         0 }
6390 0         0 elsif (not $octet{'>'}) {
6391             $delimiter = '<';
6392             $end_delimiter = '>';
6393 0         0 }
6394 0 0       0 else {
6395 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6396 0         0 if (not $octet{$char}) {
6397 0         0 $delimiter = $char;
6398             $end_delimiter = $char;
6399             last;
6400             }
6401             }
6402             }
6403 0         0 }
6404 0         0  
6405             my $prematch = '';
6406             return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6407 0 100       0 }
6408 68         178  
6409             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6410             my $metachar = qr/[\@\\|[\]{^]/oxms;
6411 68         293  
6412             # split regexp
6413             my @char = $string =~ /\G((?>
6414             [^\\\$\@\[\(] |
6415             \\ (?>[1-9][0-9]*) |
6416             \\g (?>\s*) (?>[1-9][0-9]*) |
6417             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6418             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6419             \\x (?>[0-9A-Fa-f]{1,2}) |
6420             \\ (?>[0-7]{2,3}) |
6421             \\c [\x40-\x5F] |
6422             \\x\{ (?>[0-9A-Fa-f]+) \} |
6423             \\o\{ (?>[0-7]+) \} |
6424             \\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
6425             \\ $q_char |
6426             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6427             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6428             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6429             [\$\@] $qq_variable |
6430             \$ (?>\s* [0-9]+) |
6431             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6432             \$ \$ (?![\w\{]) |
6433             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6434             \[\^ |
6435             \[\: (?>[a-z]+) :\] |
6436             \[\:\^ (?>[a-z]+) :\] |
6437             \(\? |
6438             $q_char
6439             ))/oxmsg;
6440 68 50       18642  
6441 68         501 # choice again delimiter
  0         0  
6442 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
6443 0         0 my %octet = map {$_ => 1} @char;
6444 0         0 if (not $octet{')'}) {
6445             $delimiter = '(';
6446             $end_delimiter = ')';
6447 0         0 }
6448 0         0 elsif (not $octet{'}'}) {
6449             $delimiter = '{';
6450             $end_delimiter = '}';
6451 0         0 }
6452 0         0 elsif (not $octet{']'}) {
6453             $delimiter = '[';
6454             $end_delimiter = ']';
6455 0         0 }
6456 0         0 elsif (not $octet{'>'}) {
6457             $delimiter = '<';
6458             $end_delimiter = '>';
6459 0         0 }
6460 0 0       0 else {
6461 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6462 0         0 if (not $octet{$char}) {
6463 0         0 $delimiter = $char;
6464             $end_delimiter = $char;
6465             last;
6466             }
6467             }
6468             }
6469             }
6470 0         0  
  68         153  
6471             # count '('
6472 253         437 my $parens = grep { $_ eq '(' } @char;
6473 68         121  
6474 68         108 my $left_e = 0;
6475             my $right_e = 0;
6476             for (my $i=0; $i <= $#char; $i++) {
6477 68 50 33     202  
    50 33        
    100          
    100          
    50          
    50          
6478 195         1095 # "\L\u" --> "\u\L"
6479             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6480             @char[$i,$i+1] = @char[$i+1,$i];
6481             }
6482              
6483 0         0 # "\U\l" --> "\l\U"
6484             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6485             @char[$i,$i+1] = @char[$i+1,$i];
6486             }
6487              
6488 0         0 # octal escape sequence
6489             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6490             $char[$i] = Ewindows1258::octchr($1);
6491             }
6492              
6493 1         2 # hexadecimal escape sequence
6494             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6495             $char[$i] = Ewindows1258::hexchr($1);
6496             }
6497              
6498             # \b{...} --> b\{...}
6499             # \B{...} --> B\{...}
6500             # \N{CHARNAME} --> N\{CHARNAME}
6501             # \p{PROPERTY} --> p\{PROPERTY}
6502 1         3 # \P{PROPERTY} --> P\{PROPERTY}
6503             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
6504             $char[$i] = $1 . '\\' . $2;
6505             }
6506              
6507 0         0 # \p, \P, \X --> p, P, X
6508             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6509             $char[$i] = $1;
6510 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          
6511              
6512             if (0) {
6513             }
6514 195         686  
6515 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
6516 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6517             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)) {
6518             $char[$i] .= join '', splice @char, $i+1, 3;
6519 0         0 }
6520             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)) {
6521             $char[$i] .= join '', splice @char, $i+1, 2;
6522 0         0 }
6523             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)) {
6524             $char[$i] .= join '', splice @char, $i+1, 1;
6525             }
6526             }
6527              
6528 0         0 # open character class [...]
6529 13 50       21 elsif ($char[$i] eq '[') {
6530 13         44 my $left = $i;
6531             if ($char[$i+1] eq ']') {
6532 0         0 $i++;
6533 13 50       19 }
6534 58         96 while (1) {
6535             if (++$i > $#char) {
6536 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6537 58         146 }
6538             if ($char[$i] eq ']') {
6539             my $right = $i;
6540 13 50       24  
6541 13         75 # [...]
  0         0  
6542             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6543             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);
6544 0         0 }
6545             else {
6546             splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
6547 13         48 }
6548 13         24  
6549             $i = $left;
6550             last;
6551             }
6552             }
6553             }
6554              
6555 13         38 # open character class [^...]
6556 0 0       0 elsif ($char[$i] eq '[^') {
6557 0         0 my $left = $i;
6558             if ($char[$i+1] eq ']') {
6559 0         0 $i++;
6560 0 0       0 }
6561 0         0 while (1) {
6562             if (++$i > $#char) {
6563 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6564 0         0 }
6565             if ($char[$i] eq ']') {
6566             my $right = $i;
6567 0 0       0  
6568 0         0 # [^...]
  0         0  
6569             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6570             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);
6571 0         0 }
6572             else {
6573             splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6574 0         0 }
6575 0         0  
6576             $i = $left;
6577             last;
6578             }
6579             }
6580             }
6581              
6582 0         0 # rewrite character class or escape character
6583             elsif (my $char = character_class($char[$i],$modifier)) {
6584             $char[$i] = $char;
6585             }
6586              
6587 7 50       16 # /i modifier
6588 3         6 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
6589             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
6590             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
6591 3         15 }
6592             else {
6593             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
6594             }
6595             }
6596              
6597 0 0       0 # \u \l \U \L \F \Q \E
6598 0         0 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6599             if ($right_e < $left_e) {
6600             $char[$i] = '\\' . $char[$i];
6601             }
6602 0         0 }
6603 0         0 elsif ($char[$i] eq '\u') {
6604             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
6605             $left_e++;
6606 0         0 }
6607 0         0 elsif ($char[$i] eq '\l') {
6608             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
6609             $left_e++;
6610 0         0 }
6611 0         0 elsif ($char[$i] eq '\U') {
6612             $char[$i] = '@{[Ewindows1258::uc qq<';
6613             $left_e++;
6614 0         0 }
6615 0         0 elsif ($char[$i] eq '\L') {
6616             $char[$i] = '@{[Ewindows1258::lc qq<';
6617             $left_e++;
6618 0         0 }
6619 0         0 elsif ($char[$i] eq '\F') {
6620             $char[$i] = '@{[Ewindows1258::fc qq<';
6621             $left_e++;
6622 0         0 }
6623 0         0 elsif ($char[$i] eq '\Q') {
6624             $char[$i] = '@{[CORE::quotemeta qq<';
6625             $left_e++;
6626 0 0       0 }
6627 0         0 elsif ($char[$i] eq '\E') {
6628 0         0 if ($right_e < $left_e) {
6629             $char[$i] = '>]}';
6630             $right_e++;
6631 0         0 }
6632             else {
6633             $char[$i] = '';
6634             }
6635 0         0 }
6636 0 0       0 elsif ($char[$i] eq '\Q') {
6637 0         0 while (1) {
6638             if (++$i > $#char) {
6639 0 0       0 last;
6640 0         0 }
6641             if ($char[$i] eq '\E') {
6642             last;
6643             }
6644             }
6645             }
6646             elsif ($char[$i] eq '\E') {
6647             }
6648              
6649             # \0 --> \0
6650             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
6651             }
6652              
6653             # \g{N}, \g{-N}
6654              
6655             # P.108 Using Simple Patterns
6656             # in Chapter 7: In the World of Regular Expressions
6657             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
6658              
6659             # P.221 Capturing
6660             # in Chapter 5: Pattern Matching
6661             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6662              
6663             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
6664             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6665             }
6666              
6667             # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
6668             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6669             }
6670              
6671             # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
6672             elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6673             }
6674              
6675             # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
6676             elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6677             }
6678              
6679 0 0       0 # $0 --> $0
6680 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6681             if ($ignorecase) {
6682             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6683             }
6684 0 0       0 }
6685 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6686             if ($ignorecase) {
6687             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6688             }
6689             }
6690              
6691             # $$ --> $$
6692             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6693             }
6694              
6695             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6696 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6697 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6698 0         0 $char[$i] = e_capture($1);
6699             if ($ignorecase) {
6700             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6701             }
6702 0         0 }
6703 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6704 0         0 $char[$i] = e_capture($1);
6705             if ($ignorecase) {
6706             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6707             }
6708             }
6709              
6710 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6711 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) {
6712 0         0 $char[$i] = e_capture($1.'->'.$2);
6713             if ($ignorecase) {
6714             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6715             }
6716             }
6717              
6718 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6719 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) {
6720 0         0 $char[$i] = e_capture($1.'->'.$2);
6721             if ($ignorecase) {
6722             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6723             }
6724             }
6725              
6726 0         0 # $$foo
6727 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6728 0         0 $char[$i] = e_capture($1);
6729             if ($ignorecase) {
6730             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6731             }
6732             }
6733              
6734 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
6735 4         13 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6736             if ($ignorecase) {
6737             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::PREMATCH())]}';
6738 0         0 }
6739             else {
6740             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
6741             }
6742             }
6743              
6744 4 50       13 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
6745 4         14 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6746             if ($ignorecase) {
6747             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::MATCH())]}';
6748 0         0 }
6749             else {
6750             $char[$i] = '@{[Ewindows1258::MATCH()]}';
6751             }
6752             }
6753              
6754 4 50       14 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
6755 3         10 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6756             if ($ignorecase) {
6757             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::POSTMATCH())]}';
6758 0         0 }
6759             else {
6760             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
6761             }
6762             }
6763              
6764 3 0       10 # ${ foo }
6765 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) {
6766             if ($ignorecase) {
6767             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6768             }
6769             }
6770              
6771 0         0 # ${ ... }
6772 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6773 0         0 $char[$i] = e_capture($1);
6774             if ($ignorecase) {
6775             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6776             }
6777             }
6778              
6779 0         0 # $scalar or @array
6780 4 50       27 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6781 4         23 $char[$i] = e_string($char[$i]);
6782             if ($ignorecase) {
6783             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
6784             }
6785             }
6786              
6787 0 50       0 # quote character before ? + * {
6788             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6789             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6790 13         58 }
6791             else {
6792             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6793             }
6794             }
6795             }
6796 13         64  
6797 68         161 # make regexp string
6798 68 50       115 my $prematch = '';
6799 68         170 $modifier =~ tr/i//d;
6800             if ($left_e > $right_e) {
6801 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6802             }
6803             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6804             }
6805              
6806             #
6807             # escape regexp (s'here'' or s'here''b)
6808 68     21 0 746 #
6809 21   100     47 sub e_s1_q {
6810             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6811 21         66 $modifier ||= '';
6812 21 50       27  
6813 21         42 $modifier =~ tr/p//d;
6814 0         0 if ($modifier =~ /([adlu])/oxms) {
6815 0 0       0 my $line = 0;
6816 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6817 0         0 if ($filename ne __FILE__) {
6818             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6819             last;
6820 0         0 }
6821             }
6822             die qq{Unsupported modifier "$1" used at line $line.\n};
6823 0         0 }
6824              
6825             $slash = 'div';
6826 21 100       30  
    50          
6827 21         52 # literal null string pattern
6828 8         11 if ($string eq '') {
6829 8         12 $modifier =~ tr/bB//d;
6830             $modifier =~ tr/i//d;
6831             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6832             }
6833              
6834 8         40 # with /b /B modifier
6835             elsif ($modifier =~ tr/bB//d) {
6836             return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6837             }
6838              
6839 0         0 # without /b /B modifier
6840             else {
6841             return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6842             }
6843             }
6844              
6845             #
6846             # escape regexp (s'here'')
6847 13     13 0 26 #
6848             sub e_s1_qt {
6849 13 50       31 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6850              
6851             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6852 13         24  
6853             # split regexp
6854             my @char = $string =~ /\G((?>
6855             [^\\\[\$\@\/] |
6856             [\x00-\xFF] |
6857             \[\^ |
6858             \[\: (?>[a-z]+) \:\] |
6859             \[\:\^ (?>[a-z]+) \:\] |
6860             [\$\@\/] |
6861             \\ (?:$q_char) |
6862             (?:$q_char)
6863             ))/oxmsg;
6864 13         196  
6865 13 50 33     40 # unescape character
    50 33        
    50 66        
    100          
    50          
    50          
6866             for (my $i=0; $i <= $#char; $i++) {
6867             if (0) {
6868             }
6869 25         100  
6870 0         0 # open character class [...]
6871 0 0       0 elsif ($char[$i] eq '[') {
6872 0         0 my $left = $i;
6873             if ($char[$i+1] eq ']') {
6874 0         0 $i++;
6875 0 0       0 }
6876 0         0 while (1) {
6877             if (++$i > $#char) {
6878 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6879 0         0 }
6880             if ($char[$i] eq ']') {
6881             my $right = $i;
6882 0         0  
6883             # [...]
6884 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
6885 0         0  
6886             $i = $left;
6887             last;
6888             }
6889             }
6890             }
6891              
6892 0         0 # open character class [^...]
6893 0 0       0 elsif ($char[$i] eq '[^') {
6894 0         0 my $left = $i;
6895             if ($char[$i+1] eq ']') {
6896 0         0 $i++;
6897 0 0       0 }
6898 0         0 while (1) {
6899             if (++$i > $#char) {
6900 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6901 0         0 }
6902             if ($char[$i] eq ']') {
6903             my $right = $i;
6904 0         0  
6905             # [^...]
6906 0         0 splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6907 0         0  
6908             $i = $left;
6909             last;
6910             }
6911             }
6912             }
6913              
6914 0         0 # escape $ @ / and \
6915             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6916             $char[$i] = '\\' . $char[$i];
6917             }
6918              
6919 0         0 # rewrite character class or escape character
6920             elsif (my $char = character_class($char[$i],$modifier)) {
6921             $char[$i] = $char;
6922             }
6923              
6924 6 0       14 # /i modifier
6925 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
6926             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
6927             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
6928 0         0 }
6929             else {
6930             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
6931             }
6932             }
6933              
6934 0 0       0 # quote character before ? + * {
6935             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6936             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6937 0         0 }
6938             else {
6939             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6940             }
6941             }
6942 0         0 }
6943 13         24  
6944 13         20 $modifier =~ tr/i//d;
6945 13         25 $delimiter = '/';
6946 13         19 $end_delimiter = '/';
6947             my $prematch = '';
6948             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6949             }
6950              
6951             #
6952             # escape regexp (s'here''b)
6953 13     0 0 91 #
6954             sub e_s1_qb {
6955             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6956 0         0  
6957             # split regexp
6958             my @char = $string =~ /\G (?>[^\\]|\\\\) /oxmsg;
6959 0         0  
6960 0 0       0 # unescape character
    0          
6961             for (my $i=0; $i <= $#char; $i++) {
6962             if (0) {
6963             }
6964 0         0  
6965             # remain \\
6966             elsif ($char[$i] eq '\\\\') {
6967             }
6968              
6969 0         0 # escape $ @ / and \
6970             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6971             $char[$i] = '\\' . $char[$i];
6972             }
6973 0         0 }
6974 0         0  
6975 0         0 $delimiter = '/';
6976 0         0 $end_delimiter = '/';
6977             my $prematch = '';
6978             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6979             }
6980              
6981             #
6982             # escape regexp (s''here')
6983 0     16 0 0 #
6984             sub e_s2_q {
6985 16         33 my($ope,$delimiter,$end_delimiter,$string) = @_;
6986              
6987 16         23 $slash = 'div';
6988 16         85  
6989 16 100       41 my @char = $string =~ / \G (?>[^\\]|\\\\|$q_char) /oxmsg;
    100          
6990             for (my $i=0; $i <= $#char; $i++) {
6991             if (0) {
6992             }
6993 9         33  
6994             # not escape \\
6995             elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
6996             }
6997              
6998 0         0 # escape $ @ / and \
6999             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7000             $char[$i] = '\\' . $char[$i];
7001             }
7002 5         12 }
7003              
7004             return join '', $ope, $delimiter, @char, $end_delimiter;
7005             }
7006              
7007             #
7008             # escape regexp (s/here/and here/modifier)
7009 16     97 0 48 #
7010 97   100     733 sub e_sub {
7011             my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
7012 97         393 $modifier ||= '';
7013 97 50       188  
7014 97         257 $modifier =~ tr/p//d;
7015 0         0 if ($modifier =~ /([adlu])/oxms) {
7016 0 0       0 my $line = 0;
7017 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7018 0         0 if ($filename ne __FILE__) {
7019             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7020             last;
7021 0         0 }
7022             }
7023             die qq{Unsupported modifier "$1" used at line $line.\n};
7024 0 100       0 }
7025 97         240  
7026 36         43 if ($variable eq '') {
7027             $variable = '$_';
7028             $bind_operator = ' =~ ';
7029 36         46 }
7030              
7031             $slash = 'div';
7032              
7033             # P.128 Start of match (or end of previous match): \G
7034             # P.130 Advanced Use of \G with Perl
7035             # in Chapter 3: Overview of Regular Expression Features and Flavors
7036             # P.312 Iterative Matching: Scalar Context, with /g
7037             # in Chapter 7: Perl
7038             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
7039              
7040             # P.181 Where You Left Off: The \G Assertion
7041             # in Chapter 5: Pattern Matching
7042             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7043              
7044             # P.220 Where You Left Off: The \G Assertion
7045             # in Chapter 5: Pattern Matching
7046 97         152 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7047 97         165  
7048             my $e_modifier = $modifier =~ tr/e//d;
7049 97         150 my $r_modifier = $modifier =~ tr/r//d;
7050 97 50       142  
7051 97         263 my $my = '';
7052 0         0 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
7053 0         0 $my = $variable;
7054             $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
7055             $variable =~ s/ = .+ \z//oxms;
7056 0         0 }
7057 97         222  
7058             (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
7059             $variable_basename =~ s/ \s+ \z//oxms;
7060 97         164  
7061 97 100       143 # quote replacement string
7062 97         202 my $e_replacement = '';
7063 17         36 if ($e_modifier >= 1) {
7064             $e_replacement = e_qq('', '', '', $replacement);
7065             $e_modifier--;
7066 17 100       25 }
7067 80         197 else {
7068             if ($delimiter2 eq "'") {
7069             $e_replacement = e_s2_q('qq', '/', '/', $replacement);
7070 16         28 }
7071             else {
7072             $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
7073             }
7074 64         164 }
7075              
7076             my $sub = '';
7077 97 100       171  
7078 97 100       212 # with /r
7079             if ($r_modifier) {
7080             if (0) {
7081             }
7082 8         24  
7083 0 50       0 # s///gr without multibyte anchoring
7084             elsif ($modifier =~ /g/oxms) {
7085             $sub = sprintf(
7086             # 1 2 3 4 5
7087             q,
7088              
7089             $variable, # 1
7090             ($delimiter1 eq "'") ? # 2
7091             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7092             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7093             $s_matched, # 3
7094             $e_replacement, # 4
7095             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 5
7096             );
7097             }
7098              
7099             # s///r
7100 4         13 else {
7101              
7102 4 50       6 my $prematch = q{$`};
7103              
7104             $sub = sprintf(
7105             # 1 2 3 4 5 6 7
7106             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Ewindows1258::re_r=%s; %s"%s$Ewindows1258::re_r$'" } : %s>,
7107              
7108             $variable, # 1
7109             ($delimiter1 eq "'") ? # 2
7110             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7111             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7112             $s_matched, # 3
7113             $e_replacement, # 4
7114             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 5
7115             $prematch, # 6
7116             $variable, # 7
7117             );
7118             }
7119 4 50       11  
7120 8         25 # $var !~ s///r doesn't make sense
7121             if ($bind_operator =~ / !~ /oxms) {
7122             $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
7123             }
7124             }
7125              
7126 0 100       0 # without /r
7127             else {
7128             if (0) {
7129             }
7130 89         218  
7131 0 100       0 # s///g without multibyte anchoring
    100          
7132             elsif ($modifier =~ /g/oxms) {
7133             $sub = sprintf(
7134             # 1 2 3 4 5 6 7 8
7135             q,
7136              
7137             $variable, # 1
7138             ($delimiter1 eq "'") ? # 2
7139             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7140             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7141             $s_matched, # 3
7142             $e_replacement, # 4
7143             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 5
7144             $variable, # 6
7145             $variable, # 7
7146             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
7147             );
7148             }
7149              
7150             # s///
7151 22         74 else {
7152              
7153 67 100       106 my $prematch = q{$`};
    100          
7154              
7155             $sub = sprintf(
7156              
7157             ($bind_operator =~ / =~ /oxms) ?
7158              
7159             # 1 2 3 4 5 6 7 8
7160             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Ewindows1258::re_r=%s; %s%s="%s$Ewindows1258::re_r$'"; 1 } : undef> :
7161              
7162             # 1 2 3 4 5 6 7 8
7163             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Ewindows1258::re_r=%s; %s%s="%s$Ewindows1258::re_r$'"; undef }>,
7164              
7165             $variable, # 1
7166             $bind_operator, # 2
7167             ($delimiter1 eq "'") ? # 3
7168             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7169             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7170             $s_matched, # 4
7171             $e_replacement, # 5
7172             '$Ewindows1258::re_r=CORE::eval $Ewindows1258::re_r; ' x $e_modifier, # 6
7173             $variable, # 7
7174             $prematch, # 8
7175             );
7176             }
7177             }
7178 67 50       334  
7179 97         302 # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
7180             if ($my ne '') {
7181             $sub = "($my, $sub)[1]";
7182             }
7183 0         0  
7184 97         150 # clear s/// variable
7185             $sub_variable = '';
7186 97         130 $bind_operator = '';
7187              
7188             return $sub;
7189             }
7190              
7191             #
7192             # escape regexp of split qr//
7193 97     74 0 759 #
7194 74   100     300 sub e_split {
7195             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7196 74         368 $modifier ||= '';
7197 74 50       119  
7198 74         186 $modifier =~ tr/p//d;
7199 0         0 if ($modifier =~ /([adlu])/oxms) {
7200 0 0       0 my $line = 0;
7201 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7202 0         0 if ($filename ne __FILE__) {
7203             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7204             last;
7205 0         0 }
7206             }
7207             die qq{Unsupported modifier "$1" used at line $line.\n};
7208 0         0 }
7209              
7210             $slash = 'div';
7211 74 50       115  
7212 74         150 # /b /B modifier
7213             if ($modifier =~ tr/bB//d) {
7214             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7215 0 50       0 }
7216 74         140  
7217             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7218             my $metachar = qr/[\@\\|[\]{^]/oxms;
7219 74         238  
7220             # split regexp
7221             my @char = $string =~ /\G((?>
7222             [^\\\$\@\[\(] |
7223             \\x (?>[0-9A-Fa-f]{1,2}) |
7224             \\ (?>[0-7]{2,3}) |
7225             \\c [\x40-\x5F] |
7226             \\x\{ (?>[0-9A-Fa-f]+) \} |
7227             \\o\{ (?>[0-7]+) \} |
7228             \\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
7229             \\ $q_char |
7230             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7231             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7232             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7233             [\$\@] $qq_variable |
7234             \$ (?>\s* [0-9]+) |
7235             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7236             \$ \$ (?![\w\{]) |
7237             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7238             \[\^ |
7239             \[\: (?>[a-z]+) :\] |
7240             \[\:\^ (?>[a-z]+) :\] |
7241             \(\? |
7242             $q_char
7243 74         8652 ))/oxmsg;
7244 74         240  
7245 74         124 my $left_e = 0;
7246             my $right_e = 0;
7247             for (my $i=0; $i <= $#char; $i++) {
7248 74 50 33     326  
    50 33        
    100          
    100          
    50          
    50          
7249 249         1221 # "\L\u" --> "\u\L"
7250             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
7251             @char[$i,$i+1] = @char[$i+1,$i];
7252             }
7253              
7254 0         0 # "\U\l" --> "\l\U"
7255             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7256             @char[$i,$i+1] = @char[$i+1,$i];
7257             }
7258              
7259 0         0 # octal escape sequence
7260             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7261             $char[$i] = Ewindows1258::octchr($1);
7262             }
7263              
7264 1         2 # hexadecimal escape sequence
7265             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7266             $char[$i] = Ewindows1258::hexchr($1);
7267             }
7268              
7269             # \b{...} --> b\{...}
7270             # \B{...} --> B\{...}
7271             # \N{CHARNAME} --> N\{CHARNAME}
7272             # \p{PROPERTY} --> p\{PROPERTY}
7273 1         2 # \P{PROPERTY} --> P\{PROPERTY}
7274             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
7275             $char[$i] = $1 . '\\' . $2;
7276             }
7277              
7278 0         0 # \p, \P, \X --> p, P, X
7279             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7280             $char[$i] = $1;
7281 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          
7282              
7283             if (0) {
7284             }
7285 249         808  
7286 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
7287 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7288             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)) {
7289             $char[$i] .= join '', splice @char, $i+1, 3;
7290 0         0 }
7291             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)) {
7292             $char[$i] .= join '', splice @char, $i+1, 2;
7293 0         0 }
7294             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)) {
7295             $char[$i] .= join '', splice @char, $i+1, 1;
7296             }
7297             }
7298              
7299 0         0 # open character class [...]
7300 3 50       6 elsif ($char[$i] eq '[') {
7301 3         10 my $left = $i;
7302             if ($char[$i+1] eq ']') {
7303 0         0 $i++;
7304 3 50       6 }
7305 7         12 while (1) {
7306             if (++$i > $#char) {
7307 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7308 7         16 }
7309             if ($char[$i] eq ']') {
7310             my $right = $i;
7311 3 50       5  
7312 3         20 # [...]
  0         0  
7313             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7314             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);
7315 0         0 }
7316             else {
7317             splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
7318 3         16 }
7319 3         5  
7320             $i = $left;
7321             last;
7322             }
7323             }
7324             }
7325              
7326 3         9 # open character class [^...]
7327 0 0       0 elsif ($char[$i] eq '[^') {
7328 0         0 my $left = $i;
7329             if ($char[$i+1] eq ']') {
7330 0         0 $i++;
7331 0 0       0 }
7332 0         0 while (1) {
7333             if (++$i > $#char) {
7334 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7335 0         0 }
7336             if ($char[$i] eq ']') {
7337             my $right = $i;
7338 0 0       0  
7339 0         0 # [^...]
  0         0  
7340             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7341             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);
7342 0         0 }
7343             else {
7344             splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7345 0         0 }
7346 0         0  
7347             $i = $left;
7348             last;
7349             }
7350             }
7351             }
7352              
7353 0         0 # rewrite character class or escape character
7354             elsif (my $char = character_class($char[$i],$modifier)) {
7355             $char[$i] = $char;
7356             }
7357              
7358             # P.794 29.2.161. split
7359             # in Chapter 29: Functions
7360             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7361              
7362             # P.951 split
7363             # in Chapter 27: Functions
7364             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7365              
7366             # said "The //m modifier is assumed when you split on the pattern /^/",
7367             # but perl5.008 is not so. Therefore, this software adds //m.
7368             # (and so on)
7369              
7370 1         3 # split(m/^/) --> split(m/^/m)
7371             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7372             $modifier .= 'm';
7373             }
7374              
7375 7 0       21 # /i modifier
7376 0         0 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
7377             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
7378             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
7379 0         0 }
7380             else {
7381             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
7382             }
7383             }
7384              
7385 0 0       0 # \u \l \U \L \F \Q \E
7386 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
7387             if ($right_e < $left_e) {
7388             $char[$i] = '\\' . $char[$i];
7389             }
7390 0         0 }
7391 0         0 elsif ($char[$i] eq '\u') {
7392             $char[$i] = '@{[Ewindows1258::ucfirst qq<';
7393             $left_e++;
7394 0         0 }
7395 0         0 elsif ($char[$i] eq '\l') {
7396             $char[$i] = '@{[Ewindows1258::lcfirst qq<';
7397             $left_e++;
7398 0         0 }
7399 0         0 elsif ($char[$i] eq '\U') {
7400             $char[$i] = '@{[Ewindows1258::uc qq<';
7401             $left_e++;
7402 0         0 }
7403 0         0 elsif ($char[$i] eq '\L') {
7404             $char[$i] = '@{[Ewindows1258::lc qq<';
7405             $left_e++;
7406 0         0 }
7407 0         0 elsif ($char[$i] eq '\F') {
7408             $char[$i] = '@{[Ewindows1258::fc qq<';
7409             $left_e++;
7410 0         0 }
7411 0         0 elsif ($char[$i] eq '\Q') {
7412             $char[$i] = '@{[CORE::quotemeta qq<';
7413             $left_e++;
7414 0 0       0 }
7415 0         0 elsif ($char[$i] eq '\E') {
7416 0         0 if ($right_e < $left_e) {
7417             $char[$i] = '>]}';
7418             $right_e++;
7419 0         0 }
7420             else {
7421             $char[$i] = '';
7422             }
7423 0         0 }
7424 0 0       0 elsif ($char[$i] eq '\Q') {
7425 0         0 while (1) {
7426             if (++$i > $#char) {
7427 0 0       0 last;
7428 0         0 }
7429             if ($char[$i] eq '\E') {
7430             last;
7431             }
7432             }
7433             }
7434             elsif ($char[$i] eq '\E') {
7435             }
7436              
7437 0 0       0 # $0 --> $0
7438 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7439             if ($ignorecase) {
7440             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7441             }
7442 0 0       0 }
7443 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7444             if ($ignorecase) {
7445             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7446             }
7447             }
7448              
7449             # $$ --> $$
7450             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7451             }
7452              
7453             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7454 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7455 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7456 0         0 $char[$i] = e_capture($1);
7457             if ($ignorecase) {
7458             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7459             }
7460 0         0 }
7461 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7462 0         0 $char[$i] = e_capture($1);
7463             if ($ignorecase) {
7464             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7465             }
7466             }
7467              
7468 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7469 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) {
7470 0         0 $char[$i] = e_capture($1.'->'.$2);
7471             if ($ignorecase) {
7472             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7473             }
7474             }
7475              
7476 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7477 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) {
7478 0         0 $char[$i] = e_capture($1.'->'.$2);
7479             if ($ignorecase) {
7480             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7481             }
7482             }
7483              
7484 0         0 # $$foo
7485 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7486 0         0 $char[$i] = e_capture($1);
7487             if ($ignorecase) {
7488             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7489             }
7490             }
7491              
7492 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ewindows1258::PREMATCH()
7493 12         32 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7494             if ($ignorecase) {
7495             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::PREMATCH())]}';
7496 0         0 }
7497             else {
7498             $char[$i] = '@{[Ewindows1258::PREMATCH()]}';
7499             }
7500             }
7501              
7502 12 50       51 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ewindows1258::MATCH()
7503 12         37 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7504             if ($ignorecase) {
7505             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::MATCH())]}';
7506 0         0 }
7507             else {
7508             $char[$i] = '@{[Ewindows1258::MATCH()]}';
7509             }
7510             }
7511              
7512 12 50       51 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ewindows1258::POSTMATCH()
7513 9         29 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7514             if ($ignorecase) {
7515             $char[$i] = '@{[Ewindows1258::ignorecase(Ewindows1258::POSTMATCH())]}';
7516 0         0 }
7517             else {
7518             $char[$i] = '@{[Ewindows1258::POSTMATCH()]}';
7519             }
7520             }
7521              
7522 9 0       40 # ${ foo }
7523 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) {
7524             if ($ignorecase) {
7525             $char[$i] = '@{[Ewindows1258::ignorecase(' . $1 . ')]}';
7526             }
7527             }
7528              
7529 0         0 # ${ ... }
7530 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7531 0         0 $char[$i] = e_capture($1);
7532             if ($ignorecase) {
7533             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7534             }
7535             }
7536              
7537 0         0 # $scalar or @array
7538 3 50       9 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7539 3         13 $char[$i] = e_string($char[$i]);
7540             if ($ignorecase) {
7541             $char[$i] = '@{[Ewindows1258::ignorecase(' . $char[$i] . ')]}';
7542             }
7543             }
7544              
7545 0 50       0 # quote character before ? + * {
7546             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7547             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7548 1         9 }
7549             else {
7550             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7551             }
7552             }
7553             }
7554 0         0  
7555 74 50       185 # make regexp string
7556 74         156 $modifier =~ tr/i//d;
7557             if ($left_e > $right_e) {
7558 0         0 return join '', 'Ewindows1258::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
7559             }
7560             return join '', 'Ewindows1258::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7561             }
7562              
7563             #
7564             # escape regexp of split qr''
7565 74     0 0 682 #
7566 0   0       sub e_split_q {
7567             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7568 0           $modifier ||= '';
7569 0 0          
7570 0           $modifier =~ tr/p//d;
7571 0           if ($modifier =~ /([adlu])/oxms) {
7572 0 0         my $line = 0;
7573 0           for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7574 0           if ($filename ne __FILE__) {
7575             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7576             last;
7577 0           }
7578             }
7579             die qq{Unsupported modifier "$1" used at line $line.\n};
7580 0           }
7581              
7582             $slash = 'div';
7583 0 0          
7584 0           # /b /B modifier
7585             if ($modifier =~ tr/bB//d) {
7586             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7587 0 0         }
7588              
7589             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7590 0            
7591             # split regexp
7592             my @char = $string =~ /\G((?>
7593             [^\\\[] |
7594             [\x00-\xFF] |
7595             \[\^ |
7596             \[\: (?>[a-z]+) \:\] |
7597             \[\:\^ (?>[a-z]+) \:\] |
7598             \\ (?:$q_char) |
7599             (?:$q_char)
7600             ))/oxmsg;
7601 0            
7602 0 0 0       # unescape character
    0 0        
    0 0        
    0 0        
    0          
    0          
7603             for (my $i=0; $i <= $#char; $i++) {
7604             if (0) {
7605             }
7606 0            
7607 0           # open character class [...]
7608 0 0         elsif ($char[$i] eq '[') {
7609 0           my $left = $i;
7610             if ($char[$i+1] eq ']') {
7611 0           $i++;
7612 0 0         }
7613 0           while (1) {
7614             if (++$i > $#char) {
7615 0 0         die __FILE__, ": Unmatched [] in regexp\n";
7616 0           }
7617             if ($char[$i] eq ']') {
7618             my $right = $i;
7619 0            
7620             # [...]
7621 0           splice @char, $left, $right-$left+1, Ewindows1258::charlist_qr(@char[$left+1..$right-1], $modifier);
7622 0            
7623             $i = $left;
7624             last;
7625             }
7626             }
7627             }
7628              
7629 0           # open character class [^...]
7630 0 0         elsif ($char[$i] eq '[^') {
7631 0           my $left = $i;
7632             if ($char[$i+1] eq ']') {
7633 0           $i++;
7634 0 0         }
7635 0           while (1) {
7636             if (++$i > $#char) {
7637 0 0         die __FILE__, ": Unmatched [] in regexp\n";
7638 0           }
7639             if ($char[$i] eq ']') {
7640             my $right = $i;
7641 0            
7642             # [^...]
7643 0           splice @char, $left, $right-$left+1, Ewindows1258::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7644 0            
7645             $i = $left;
7646             last;
7647             }
7648             }
7649             }
7650              
7651 0           # rewrite character class or escape character
7652             elsif (my $char = character_class($char[$i],$modifier)) {
7653             $char[$i] = $char;
7654             }
7655              
7656 0           # split(m/^/) --> split(m/^/m)
7657             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7658             $modifier .= 'm';
7659             }
7660              
7661 0 0         # /i modifier
7662 0           elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ewindows1258::uc($char[$i]) ne Ewindows1258::fc($char[$i]))) {
7663             if (CORE::length(Ewindows1258::fc($char[$i])) == 1) {
7664             $char[$i] = '[' . Ewindows1258::uc($char[$i]) . Ewindows1258::fc($char[$i]) . ']';
7665 0           }
7666             else {
7667             $char[$i] = '(?:' . Ewindows1258::uc($char[$i]) . '|' . Ewindows1258::fc($char[$i]) . ')';
7668             }
7669             }
7670              
7671 0 0         # quote character before ? + * {
7672             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7673             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7674 0           }
7675             else {
7676             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7677             }
7678             }
7679 0           }
7680 0            
7681             $modifier =~ tr/i//d;
7682             return join '', 'Ewindows1258::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7683             }
7684              
7685             #
7686             # instead of Carp::carp
7687 0     0 0   #
7688 0           sub carp {
7689             my($package,$filename,$line) = caller(1);
7690             print STDERR "@_ at $filename line $line.\n";
7691             }
7692              
7693             #
7694             # instead of Carp::croak
7695 0     0 0   #
7696 0           sub croak {
7697 0           my($package,$filename,$line) = caller(1);
7698             print STDERR "@_ at $filename line $line.\n";
7699             die "\n";
7700             }
7701              
7702             #
7703             # instead of Carp::cluck
7704 0     0 0   #
7705 0           sub cluck {
7706 0           my $i = 0;
7707 0           my @cluck = ();
7708 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7709             push @cluck, "[$i] $filename($line) $package::$subroutine\n";
7710 0           $i++;
7711 0           }
7712 0           print STDERR CORE::reverse @cluck;
7713             print STDERR "\n";
7714             print STDERR @_;
7715             }
7716              
7717             #
7718             # instead of Carp::confess
7719 0     0 0   #
7720 0           sub confess {
7721 0           my $i = 0;
7722 0           my @confess = ();
7723 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7724             push @confess, "[$i] $filename($line) $package::$subroutine\n";
7725 0           $i++;
7726 0           }
7727 0           print STDERR CORE::reverse @confess;
7728 0           print STDERR "\n";
7729             print STDERR @_;
7730             die "\n";
7731             }
7732              
7733             1;
7734              
7735             __END__