File Coverage

blib/lib/Eeucjp.pm
Criterion Covered Total %
statement 1041 3164 32.9
branch 1096 2744 39.9
condition 146 379 38.5
subroutine 75 131 57.2
pod 7 76 9.2
total 2365 6494 36.4


line stmt bran cond sub pod time code
1             package Eeucjp;
2             ######################################################################
3             #
4             # Eeucjp - Run-time routines for EUCJP.pm
5             #
6             # http://search.cpan.org/dist/Char-EUCJP/
7             #
8             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 INABA Hitoshi
9             ######################################################################
10              
11 325     325   4580 use 5.00503; # Galapagos Consensus 1998 for primetools
  325         742  
12             # use 5.008001; # Lancaster Consensus 2013 for toolchains
13              
14             # 12.3. Delaying use Until Runtime
15             # in Chapter 12. Packages, Libraries, and Modules
16             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
17             # (and so on)
18              
19             # Version numbers should be boring
20             # http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/
21             # For the impatient, the disinterested or those who just want to follow
22             # a recipe, my advice for all modules is this:
23             # our $VERSION = "0.001"; # or "0.001_001" for a dev release
24             # $VERSION = eval $VERSION;
25              
26 325     325   16928 BEGIN { CORE::eval q{ use vars qw($VERSION) } }
  325     325   1296  
  325         393  
  325         38092  
27             $VERSION = '1.08';
28             $VERSION = CORE::eval $VERSION;
29              
30             BEGIN {
31 325 50   325   1700 if ($^X =~ / jperl /oxmsi) {
32 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
33             }
34 325         351 if (CORE::ord('A') == 193) {
35             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
36             }
37 325         35132 if (CORE::ord('A') != 0x41) {
38             die __FILE__, ": is not US-ASCII script (must be US-ASCII script).\n";
39             }
40             }
41              
42             BEGIN {
43              
44             # instead of utf8.pm
45 325     325   16744 CORE::eval q{
  325     325   1367  
  325     103   403  
  325         28817  
  81         5819  
  94         6875  
  67         4592  
  83         6038  
46             no warnings qw(redefine);
47             *utf8::upgrade = sub { CORE::length $_[0] };
48             *utf8::downgrade = sub { 1 };
49             *utf8::encode = sub { };
50             *utf8::decode = sub { 1 };
51             *utf8::is_utf8 = sub { };
52             *utf8::valid = sub { 1 };
53             };
54 325 50       132719 if ($@) {
55 0         0 *utf8::upgrade = sub { CORE::length $_[0] };
  0         0  
56 0         0 *utf8::downgrade = sub { 1 };
  0         0  
57 0         0 *utf8::encode = sub { };
58 0         0 *utf8::decode = sub { 1 };
  0         0  
59 0         0 *utf8::is_utf8 = sub { };
60 0         0 *utf8::valid = sub { 1 };
  0         0  
61             }
62             }
63              
64             # instead of Symbol.pm
65 0         0 BEGIN {
66 325     325   628 my $genpkg = "Symbol::";
67 325         11139 my $genseq = 0;
68              
69             sub gensym () {
70 0     0 0 0 my $name = "GEN" . $genseq++;
71              
72             # here, no strict qw(refs); if strict.pm exists
73              
74 0         0 my $ref = \*{$genpkg . $name};
  0         0  
75 0         0 delete $$genpkg{$name};
76 0         0 return $ref;
77             }
78              
79             sub qualify ($;$) {
80 0     0 0 0 my ($name) = @_;
81 0 0 0     0 if (!ref($name) && (Eeucjp::index($name, '::') == -1) && (Eeucjp::index($name, "'") == -1)) {
      0        
82 0         0 my $pkg;
83 0         0 my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT DATA);
  0         0  
84              
85             # Global names: special character, "^xyz", or other.
86 0 0 0     0 if ($name =~ /^(([^\x8E\x8F\xA1-\xFEa-z])|(\^[a-z_]+))\z/i || $global{$name}) {
87             # RGS 2001-11-05 : translate leading ^X to control-char
88 0         0 $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei;
  0         0  
89 0         0 $pkg = "main";
90             }
91             else {
92 0 0       0 $pkg = (@_ > 1) ? $_[1] : caller;
93             }
94 0         0 $name = $pkg . "::" . $name;
95             }
96 0         0 return $name;
97             }
98              
99             sub qualify_to_ref ($;$) {
100              
101             # here, no strict qw(refs); if strict.pm exists
102              
103 0 0   0 0 0 return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller };
  0         0  
104             }
105             }
106              
107             # Column: local $@
108             # in Chapter 9. Osaete okitai Perl no kiso
109             # of ISBN 10: 4798119172 | ISBN 13: 978-4798119175 MODAN Perl NYUMON
110             # (and so on)
111              
112             # use strict; if strict.pm exists
113             BEGIN {
114 325 50   325   487 if (CORE::eval { local $@; CORE::require strict }) {
  325         430  
  325         2643  
115 325         28099 strict::->import;
116             }
117             }
118              
119             # P.714 29.2.39. flock
120             # in Chapter 29: Functions
121             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
122              
123             # P.863 flock
124             # in Chapter 27: Functions
125             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
126              
127             sub LOCK_SH() {1}
128             sub LOCK_EX() {2}
129             sub LOCK_UN() {8}
130             sub LOCK_NB() {4}
131              
132             # instead of Carp.pm
133             sub carp;
134             sub croak;
135             sub cluck;
136             sub confess;
137              
138             # 6.18. Matching Multiple-Byte Characters
139             # in Chapter 6. Pattern Matching
140             # of ISBN 978-1-56592-243-3 Perl Perl Cookbook.
141             # (and so on)
142              
143             # regexp of character
144 325     325   18175 BEGIN { CORE::eval q{ use vars qw($your_char) } } $your_char = q{[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]|[\x00-\xFF]};
  325     325   1410  
  325         376  
  325         15590  
145 325     325   16044 BEGIN { CORE::eval q{ use vars qw($qq_char ) } } $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  325     325   1217  
  325         395  
  325         15954  
146 325     325   14695 BEGIN { CORE::eval q{ use vars qw($q_char ) } } $q_char = qr/$your_char/oxms;
  325     325   1186  
  325         385  
  325         18477  
147              
148             #
149             # EUC-JP character range per length
150             #
151             my %range_tr = ();
152              
153             #
154             # alias of encoding name
155             #
156 325     325   15364 BEGIN { CORE::eval q{ use vars qw($encoding_alias) } }
  325     325   1188  
  325         426  
  325         239507  
157              
158             #
159             # EUC-JP case conversion
160             #
161             my %lc = ();
162             @lc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
163             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
164             my %uc = ();
165             @uc{qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)} =
166             qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
167             my %fc = ();
168             @fc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
169             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
170              
171             if (0) {
172             }
173              
174             elsif (__PACKAGE__ =~ / \b Eeucjp \z/oxms) {
175             %range_tr = (
176             1 => [ [0x00..0x8D],
177             [0x90..0xA0],
178             [0xFF..0xFF],
179             ],
180             2 => [ [0x8E..0x8E],[0xA1..0xFE],
181             [0xA1..0xFE],[0xA1..0xFE],
182             ],
183             3 => [ [0x8F..0x8F],[0xA1..0xFE],[0xA1..0xFE],
184             ],
185             );
186             $encoding_alias = qr/ \b (?: euc.*jp | jp.*euc | ujis ) \b /oxmsi;
187             }
188              
189             else {
190             croak "Don't know my package name '@{[__PACKAGE__]}'";
191             }
192              
193             #
194             # @ARGV wildcard globbing
195             #
196             sub import {
197              
198 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
199 0         0 my @argv = ();
200 0         0 for (@ARGV) {
201              
202             # has space
203 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
204 0 0       0 if (my @glob = Eeucjp::glob(qq{"$_"})) {
205 0         0 push @argv, @glob;
206             }
207             else {
208 0         0 push @argv, $_;
209             }
210             }
211              
212             # has wildcard metachar
213             elsif (/\A (?:$q_char)*? [*?] /oxms) {
214 0 0       0 if (my @glob = Eeucjp::glob($_)) {
215 0         0 push @argv, @glob;
216             }
217             else {
218 0         0 push @argv, $_;
219             }
220             }
221              
222             # no wildcard globbing
223             else {
224 0         0 push @argv, $_;
225             }
226             }
227 0         0 @ARGV = @argv;
228             }
229              
230 0         0 *Char::ord = \&EUCJP::ord;
231 0         0 *Char::ord_ = \&EUCJP::ord_;
232 0         0 *Char::reverse = \&EUCJP::reverse;
233 0         0 *Char::getc = \&EUCJP::getc;
234 0         0 *Char::length = \&EUCJP::length;
235 0         0 *Char::substr = \&EUCJP::substr;
236 0         0 *Char::index = \&EUCJP::index;
237 0         0 *Char::rindex = \&EUCJP::rindex;
238 0         0 *Char::eval = \&EUCJP::eval;
239 0         0 *Char::escape = \&EUCJP::escape;
240 0         0 *Char::escape_token = \&EUCJP::escape_token;
241 0         0 *Char::escape_script = \&EUCJP::escape_script;
242             }
243              
244             # P.230 Care with Prototypes
245             # in Chapter 6: Subroutines
246             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
247             #
248             # If you aren't careful, you can get yourself into trouble with prototypes.
249             # But if you are careful, you can do a lot of neat things with them. This is
250             # all very powerful, of course, and should only be used in moderation to make
251             # the world a better place.
252              
253             # P.332 Care with Prototypes
254             # in Chapter 7: Subroutines
255             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
256             #
257             # If you aren't careful, you can get yourself into trouble with prototypes.
258             # But if you are careful, you can do a lot of neat things with them. This is
259             # all very powerful, of course, and should only be used in moderation to make
260             # the world a better place.
261              
262             #
263             # Prototypes of subroutines
264             #
265       0     sub unimport {}
266             sub Eeucjp::split(;$$$);
267             sub Eeucjp::tr($$$$;$);
268             sub Eeucjp::chop(@);
269             sub Eeucjp::index($$;$);
270             sub Eeucjp::rindex($$;$);
271             sub Eeucjp::lcfirst(@);
272             sub Eeucjp::lcfirst_();
273             sub Eeucjp::lc(@);
274             sub Eeucjp::lc_();
275             sub Eeucjp::ucfirst(@);
276             sub Eeucjp::ucfirst_();
277             sub Eeucjp::uc(@);
278             sub Eeucjp::uc_();
279             sub Eeucjp::fc(@);
280             sub Eeucjp::fc_();
281             sub Eeucjp::ignorecase;
282             sub Eeucjp::classic_character_class;
283             sub Eeucjp::capture;
284             sub Eeucjp::chr(;$);
285             sub Eeucjp::chr_();
286             sub Eeucjp::glob($);
287             sub Eeucjp::glob_();
288              
289             sub EUCJP::ord(;$);
290             sub EUCJP::ord_();
291             sub EUCJP::reverse(@);
292             sub EUCJP::getc(;*@);
293             sub EUCJP::length(;$);
294             sub EUCJP::substr($$;$$);
295             sub EUCJP::index($$;$);
296             sub EUCJP::rindex($$;$);
297             sub EUCJP::escape(;$);
298              
299             #
300             # Regexp work
301             #
302 325     325   19056 BEGIN { CORE::eval q{ use vars qw(
  325     325   1392  
  325         401  
  325         98313  
303             $EUCJP::re_a
304             $EUCJP::re_t
305             $EUCJP::re_n
306             $EUCJP::re_r
307             ) } }
308              
309             #
310             # Character class
311             #
312 325     325   19671 BEGIN { CORE::eval q{ use vars qw(
  325     325   1277  
  325         391  
  325         49269  
313             $dot
314             $dot_s
315             $eD
316             $eS
317             $eW
318             $eH
319             $eV
320             $eR
321             $eN
322             $not_alnum
323             $not_alpha
324             $not_ascii
325             $not_blank
326             $not_cntrl
327             $not_digit
328             $not_graph
329             $not_lower
330             $not_lower_i
331             $not_print
332             $not_punct
333             $not_space
334             $not_upper
335             $not_upper_i
336             $not_word
337             $not_xdigit
338             $eb
339             $eB
340             ) } }
341              
342 325     325   15064 BEGIN { CORE::eval q{ use vars qw(
  325     325   1204  
  325         395  
  325         30305  
343             $anchor
344             $matched
345             ) } }
346             ${Eeucjp::anchor} = qr{\G(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])*?}oxms;
347              
348             # unless LONG_STRING_FOR_RE
349             if (1) {
350             }
351              
352 325     325   15763 BEGIN { CORE::eval q{ use vars qw(
  325     325   1244  
  325         395  
  325         3815789  
353             $q_char_SADAHIRO_Tomoyuki_2002_01_17
354             ) } }
355              
356             # Quantifiers
357             # {n,m} --- Match at least n but not more than m times
358             #
359             # n and m are limited to non-negative integral values less than a
360             # preset limit defined when perl is built. This is usually 32766 on
361             # the most common platforms.
362             #
363             # The following code is an attempt to solve the above limitations
364             # in a multi-byte anchoring.
365              
366             # avoid "Segmentation fault" and "Error: Parse exception"
367              
368             # perl5101delta
369             # http://perldoc.perl.org/perl5101delta.html
370             # In 5.10.0, the * quantifier in patterns was sometimes treated as {0,32767}
371             # [RT #60034, #60464]. For example, this match would fail:
372             # ("ab" x 32768) =~ /^(ab)*$/
373              
374             # SEE ALSO
375             #
376             # Complex regular subexpression recursion limit
377             # http://www.perlmonks.org/?node_id=810857
378             #
379             # regexp iteration limits
380             # http://www.nntp.perl.org/group/perl.perl5.porters/2009/02/msg144065.html
381             #
382             # latest Perl won't match certain regexes more than 32768 characters long
383             # http://stackoverflow.com/questions/26226630/latest-perl-wont-match-certain-regexes-more-than-32768-characters-long
384             #
385             # Break through the limitations of regular expressions of Perl
386             # http://d.hatena.ne.jp/gfx/20110212/1297512479
387              
388             if (($] >= 5.010001) or
389             # ActivePerl 5.6 or later (include 5.10.0)
390             (defined($ActivePerl::VERSION) and ($ActivePerl::VERSION > 800)) or
391             (($^O eq 'MSWin32') and ($] =~ /\A 5\.006/oxms))
392             ) {
393             my $sbcs = ''; # Single Byte Character Set
394             for my $range (@{ $range_tr{1} }) {
395             $sbcs .= sprintf('\\x%02X-\\x%02X', $range->[0], $range->[-1]);
396             }
397              
398             if (0) {
399             }
400              
401             # EUC-JP encoding
402             elsif (__PACKAGE__ =~ / \b Eeucjp \z/oxms) {
403             ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[^\x8E\x8F\xA1-\xFE] (?> [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE] )*?}oxms;
404             # ******************** octets not in multiple octet char (always char boundary)
405             # ************************** 2 octet chars
406             # ************************** 3 octet chars
407             }
408              
409             # other encoding
410             else {
411             ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[$sbcs](?:[^$sbcs][^$sbcs])*?}oxms;
412             # ******* octets not in multiple octet char (always char boundary)
413             # **************** 2 octet chars
414             }
415              
416             ${Eeucjp::anchor_SADAHIRO_Tomoyuki_2002_01_17} =
417             qr{\G(?(?=.{0,32766}\z)(?:[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])*?|(?(?=[$sbcs]+\z).*?|(?:${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17})))}oxms;
418             # qr{
419             # \G # (1), (2)
420             # (? # (3)
421             # (?=.{0,32766}\z) # (4)
422             # (?:[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])*?| # (5)
423             # (?(?=[$sbcs]+\z) # (6)
424             # .*?| #(7)
425             # (?:${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17}) # (8)
426             # ))}oxms;
427              
428             # avoid: Complex regular subexpression recursion limit (32766) exceeded at here.
429             local $^W = 0;
430              
431             if (((('A' x 32768).'B') !~ / ${Eeucjp::anchor} B /oxms) and
432             ((('A' x 32768).'B') =~ / ${Eeucjp::anchor_SADAHIRO_Tomoyuki_2002_01_17} B /oxms)
433             ) {
434             ${Eeucjp::anchor} = ${Eeucjp::anchor_SADAHIRO_Tomoyuki_2002_01_17};
435             }
436             else {
437             undef ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17};
438             }
439             }
440              
441             # (1)
442             # P.128 Start of match (or end of previous match): \G
443             # P.130 Advanced Use of \G with Perl
444             # in Chapter3: Over view of Regular Expression Features and Flavors
445             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
446              
447             # (2)
448             # P.255 Use leading anchors
449             # P.256 Expose ^ and \G at the front of expressions
450             # in Chapter6: Crafting an Efficient Expression
451             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
452              
453             # (3)
454             # P.138 Conditional: (? if then| else)
455             # in Chapter3: Over view of Regular Expression Features and Flavors
456             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
457              
458             # (4)
459             # perlre
460             # http://perldoc.perl.org/perlre.html
461             # The "*" quantifier is equivalent to {0,} , the "+" quantifier to {1,} ,
462             # and the "?" quantifier to {0,1}, ., n, and m are limited to non-negative
463             # integral values less than a preset limit defined when perl is built.
464             # This is usually 32766 on the most common platforms. The actual limit
465             # can be seen in the error message generated by code such as this:
466             # $_ **= $_ , / {$_} / for 2 .. 42;
467              
468             # (5)
469             # P.1023 Multiple-Byte Anchoring
470             # in Appendix W Perl Code Examples
471             # of ISBN 1-56592-224-7 CJKV Information Processing
472              
473             # (6)
474             # if string has only SBCS (Single Byte Character Set)
475              
476             # (7)
477             # then .*? (isn't limited to 32766)
478              
479             # (8)
480             # else EUC-JP::Regexp::Const (SADAHIRO Tomoyuki)
481             # http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#long
482             # http://search.cpan.org/~sadahiro/EUC-JP-Regexp/
483             # $PadA = ' (?:\A| [\x00-\x80\xA0-\xDF])(?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?';
484             # $PadG = '\G(?: |[\x00-\xFF]*?[\x00-\x80\xA0-\xDF])(?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?';
485             # $PadGA = '\G(?:\A|(?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})+?|[\x00-\xFF]*?[\x00-\x80\xA0-\xDF] (?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?)';
486              
487             ${Eeucjp::dot} = qr{(?>[^\x8E\x8F\xA1-\xFE\x0A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
488             ${Eeucjp::dot_s} = qr{(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
489             ${Eeucjp::eD} = qr{(?>[^\x8E\x8F\xA1-\xFE0-9]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
490              
491             # Vertical tabs are now whitespace
492             # \s in a regex now matches a vertical tab in all circumstances.
493             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
494             # ${Eeucjp::eS} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x0A \x0C\x0D\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
495             # ${Eeucjp::eS} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x0A\x0B\x0C\x0D\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
496             ${Eeucjp::eS} = qr{(?>[^\x8E\x8F\xA1-\xFE\s]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
497              
498             ${Eeucjp::eW} = qr{(?>[^\x8E\x8F\xA1-\xFE0-9A-Z_a-z]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
499             ${Eeucjp::eH} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
500             ${Eeucjp::eV} = qr{(?>[^\x8E\x8F\xA1-\xFE\x0A\x0B\x0C\x0D]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
501             ${Eeucjp::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
502             ${Eeucjp::eN} = qr{(?>[^\x8E\x8F\xA1-\xFE\x0A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
503             ${Eeucjp::not_alnum} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
504             ${Eeucjp::not_alpha} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
505             ${Eeucjp::not_ascii} = qr{(?>[^\x8E\x8F\xA1-\xFE\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
506             ${Eeucjp::not_blank} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
507             ${Eeucjp::not_cntrl} = qr{(?>[^\x8E\x8F\xA1-\xFE\x00-\x1F\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
508             ${Eeucjp::not_digit} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
509             ${Eeucjp::not_graph} = qr{(?>[^\x8E\x8F\xA1-\xFE\x21-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
510             ${Eeucjp::not_lower} = qr{(?>[^\x8E\x8F\xA1-\xFE\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
511             ${Eeucjp::not_lower_i} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
512             # ${Eeucjp::not_lower_i} = qr{(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
513             ${Eeucjp::not_print} = qr{(?>[^\x8E\x8F\xA1-\xFE\x20-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
514             ${Eeucjp::not_punct} = qr{(?>[^\x8E\x8F\xA1-\xFE\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
515             ${Eeucjp::not_space} = qr{(?>[^\x8E\x8F\xA1-\xFE\s\x0B]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
516             ${Eeucjp::not_upper} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
517             ${Eeucjp::not_upper_i} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
518             # ${Eeucjp::not_upper_i} = qr{(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
519             ${Eeucjp::not_word} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39\x41-\x5A\x5F\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
520             ${Eeucjp::not_xdigit} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39\x41-\x46\x61-\x66]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
521             ${Eeucjp::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))};
522             ${Eeucjp::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]))};
523              
524             # avoid: Name "Eeucjp::foo" used only once: possible typo at here.
525             ${Eeucjp::dot} = ${Eeucjp::dot};
526             ${Eeucjp::dot_s} = ${Eeucjp::dot_s};
527             ${Eeucjp::eD} = ${Eeucjp::eD};
528             ${Eeucjp::eS} = ${Eeucjp::eS};
529             ${Eeucjp::eW} = ${Eeucjp::eW};
530             ${Eeucjp::eH} = ${Eeucjp::eH};
531             ${Eeucjp::eV} = ${Eeucjp::eV};
532             ${Eeucjp::eR} = ${Eeucjp::eR};
533             ${Eeucjp::eN} = ${Eeucjp::eN};
534             ${Eeucjp::not_alnum} = ${Eeucjp::not_alnum};
535             ${Eeucjp::not_alpha} = ${Eeucjp::not_alpha};
536             ${Eeucjp::not_ascii} = ${Eeucjp::not_ascii};
537             ${Eeucjp::not_blank} = ${Eeucjp::not_blank};
538             ${Eeucjp::not_cntrl} = ${Eeucjp::not_cntrl};
539             ${Eeucjp::not_digit} = ${Eeucjp::not_digit};
540             ${Eeucjp::not_graph} = ${Eeucjp::not_graph};
541             ${Eeucjp::not_lower} = ${Eeucjp::not_lower};
542             ${Eeucjp::not_lower_i} = ${Eeucjp::not_lower_i};
543             ${Eeucjp::not_print} = ${Eeucjp::not_print};
544             ${Eeucjp::not_punct} = ${Eeucjp::not_punct};
545             ${Eeucjp::not_space} = ${Eeucjp::not_space};
546             ${Eeucjp::not_upper} = ${Eeucjp::not_upper};
547             ${Eeucjp::not_upper_i} = ${Eeucjp::not_upper_i};
548             ${Eeucjp::not_word} = ${Eeucjp::not_word};
549             ${Eeucjp::not_xdigit} = ${Eeucjp::not_xdigit};
550             ${Eeucjp::eb} = ${Eeucjp::eb};
551             ${Eeucjp::eB} = ${Eeucjp::eB};
552              
553             #
554             # EUC-JP split
555             #
556             sub Eeucjp::split(;$$$) {
557              
558             # P.794 29.2.161. split
559             # in Chapter 29: Functions
560             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
561              
562             # P.951 split
563             # in Chapter 27: Functions
564             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
565              
566 0     0 0 0 my $pattern = $_[0];
567 0         0 my $string = $_[1];
568 0         0 my $limit = $_[2];
569              
570             # if $pattern is also omitted or is the literal space, " "
571 0 0       0 if (not defined $pattern) {
572 0         0 $pattern = ' ';
573             }
574              
575             # if $string is omitted, the function splits the $_ string
576 0 0       0 if (not defined $string) {
577 0 0       0 if (defined $_) {
578 0         0 $string = $_;
579             }
580             else {
581 0         0 $string = '';
582             }
583             }
584              
585 0         0 my @split = ();
586              
587             # when string is empty
588 0 0       0 if ($string eq '') {
    0          
589              
590             # resulting list value in list context
591 0 0       0 if (wantarray) {
592 0         0 return @split;
593             }
594              
595             # count of substrings in scalar context
596             else {
597 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
598 0         0 @_ = @split;
599 0         0 return scalar @_;
600             }
601             }
602              
603             # split's first argument is more consistently interpreted
604             #
605             # After some changes earlier in v5.17, split's behavior has been simplified:
606             # if the PATTERN argument evaluates to a string containing one space, it is
607             # treated the way that a literal string containing one space once was.
608             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
609              
610             # if $pattern is also omitted or is the literal space, " ", the function splits
611             # on whitespace, /\s+/, after skipping any leading whitespace
612             # (and so on)
613              
614             elsif ($pattern eq ' ') {
615 0 0       0 if (not defined $limit) {
616 0         0 return CORE::split(' ', $string);
617             }
618             else {
619 0         0 return CORE::split(' ', $string, $limit);
620             }
621             }
622              
623 0         0 local $q_char = $q_char;
624 0 0       0 if (CORE::length($string) > 32766) {
625 0 0       0 if ($string =~ /\A [\x00-\x7F]+ \z/oxms) {
    0          
626 0         0 $q_char = qr{.}s;
627             }
628             elsif (defined ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17}) {
629 0         0 $q_char = ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17};
630             }
631             }
632              
633             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
634 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
635              
636             # a pattern capable of matching either the null string or something longer than the
637             # null string will split the value of $string into separate characters wherever it
638             # matches the null string between characters
639             # (and so on)
640              
641 0 0       0 if ('' =~ / \A $pattern \z /xms) {
642 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
643 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
644              
645             # P.1024 Appendix W.10 Multibyte Processing
646             # of ISBN 1-56592-224-7 CJKV Information Processing
647             # (and so on)
648              
649             # the //m modifier is assumed when you split on the pattern /^/
650             # (and so on)
651              
652             # V
653 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
654              
655             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
656             # is included in the resulting list, interspersed with the fields that are ordinarily returned
657             # (and so on)
658              
659 0         0 local $@;
660 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
661 0         0 push @split, CORE::eval('$' . $digit);
662             }
663             }
664             }
665              
666             else {
667 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
668              
669             # V
670 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
671 0         0 local $@;
672 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
673 0         0 push @split, CORE::eval('$' . $digit);
674             }
675             }
676             }
677             }
678              
679             elsif ($limit > 0) {
680 0 0       0 if ('' =~ / \A $pattern \z /xms) {
681 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
682 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
683              
684             # V
685 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
686 0         0 local $@;
687 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
688 0         0 push @split, CORE::eval('$' . $digit);
689             }
690             }
691             }
692             }
693             else {
694 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
695 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
696              
697             # V
698 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
699 0         0 local $@;
700 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
701 0         0 push @split, CORE::eval('$' . $digit);
702             }
703             }
704             }
705             }
706             }
707              
708 0 0       0 if (CORE::length($string) > 0) {
709 0         0 push @split, $string;
710             }
711              
712             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
713 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
714 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
715 0         0 pop @split;
716             }
717             }
718              
719             # resulting list value in list context
720 0 0       0 if (wantarray) {
721 0         0 return @split;
722             }
723              
724             # count of substrings in scalar context
725             else {
726 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
727 0         0 @_ = @split;
728 0         0 return scalar @_;
729             }
730             }
731              
732             #
733             # get last subexpression offsets
734             #
735             sub _last_subexpression_offsets {
736 0     0   0 my $pattern = $_[0];
737              
738             # remove comment
739 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
740              
741 0         0 my $modifier = '';
742 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
743 0         0 $modifier = $1;
744 0         0 $modifier =~ s/-[A-Za-z]*//;
745             }
746              
747             # with /x modifier
748 0         0 my @char = ();
749 0 0       0 if ($modifier =~ /x/oxms) {
750 0         0 @char = $pattern =~ /\G((?>
751             [^\x8E\x8F\xA1-\xFE\\\#\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
752             \\ $q_char |
753             \# (?>[^\n]*) $ |
754             \[ (?>(?:[^\x8E\x8F\xA1-\xFE\\\]]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
755             \(\? |
756             $q_char
757             ))/oxmsg;
758             }
759              
760             # without /x modifier
761             else {
762 0         0 @char = $pattern =~ /\G((?>
763             [^\x8E\x8F\xA1-\xFE\\\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
764             \\ $q_char |
765             \[ (?>(?:[^\x8E\x8F\xA1-\xFE\\\]]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
766             \(\? |
767             $q_char
768             ))/oxmsg;
769             }
770              
771 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
772             }
773              
774             #
775             # EUC-JP transliteration (tr///)
776             #
777             sub Eeucjp::tr($$$$;$) {
778              
779 0     0 0 0 my $bind_operator = $_[1];
780 0         0 my $searchlist = $_[2];
781 0         0 my $replacementlist = $_[3];
782 0   0     0 my $modifier = $_[4] || '';
783              
784 0 0       0 if ($modifier =~ /r/oxms) {
785 0 0       0 if ($bind_operator =~ / !~ /oxms) {
786 0         0 croak "Using !~ with tr///r doesn't make sense";
787             }
788             }
789              
790 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
791 0         0 my @searchlist = _charlist_tr($searchlist);
792 0         0 my @replacementlist = _charlist_tr($replacementlist);
793              
794 0         0 my %tr = ();
795 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
796 0 0       0 if (not exists $tr{$searchlist[$i]}) {
797 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
798 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
799             }
800             elsif ($modifier =~ /d/oxms) {
801 0         0 $tr{$searchlist[$i]} = '';
802             }
803             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
804 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
805             }
806             else {
807 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
808             }
809             }
810             }
811              
812 0         0 my $tr = 0;
813 0         0 my $replaced = '';
814 0 0       0 if ($modifier =~ /c/oxms) {
815 0         0 while (defined(my $char = shift @char)) {
816 0 0       0 if (not exists $tr{$char}) {
817 0 0       0 if (defined $replacementlist[0]) {
818 0         0 $replaced .= $replacementlist[0];
819             }
820 0         0 $tr++;
821 0 0       0 if ($modifier =~ /s/oxms) {
822 0   0     0 while (@char and (not exists $tr{$char[0]})) {
823 0         0 shift @char;
824 0         0 $tr++;
825             }
826             }
827             }
828             else {
829 0         0 $replaced .= $char;
830             }
831             }
832             }
833             else {
834 0         0 while (defined(my $char = shift @char)) {
835 0 0       0 if (exists $tr{$char}) {
836 0         0 $replaced .= $tr{$char};
837 0         0 $tr++;
838 0 0       0 if ($modifier =~ /s/oxms) {
839 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
840 0         0 shift @char;
841 0         0 $tr++;
842             }
843             }
844             }
845             else {
846 0         0 $replaced .= $char;
847             }
848             }
849             }
850              
851 0 0       0 if ($modifier =~ /r/oxms) {
852 0         0 return $replaced;
853             }
854             else {
855 0         0 $_[0] = $replaced;
856 0 0       0 if ($bind_operator =~ / !~ /oxms) {
857 0         0 return not $tr;
858             }
859             else {
860 0         0 return $tr;
861             }
862             }
863             }
864              
865             #
866             # EUC-JP chop
867             #
868             sub Eeucjp::chop(@) {
869              
870 0     0 0 0 my $chop;
871 0 0       0 if (@_ == 0) {
872 0         0 my @char = /\G (?>$q_char) /oxmsg;
873 0         0 $chop = pop @char;
874 0         0 $_ = join '', @char;
875             }
876             else {
877 0         0 for (@_) {
878 0         0 my @char = /\G (?>$q_char) /oxmsg;
879 0         0 $chop = pop @char;
880 0         0 $_ = join '', @char;
881             }
882             }
883 0         0 return $chop;
884             }
885              
886             #
887             # EUC-JP index by octet
888             #
889             sub Eeucjp::index($$;$) {
890              
891 0     0 1 0 my($str,$substr,$position) = @_;
892 0   0     0 $position ||= 0;
893 0         0 my $pos = 0;
894              
895 0         0 while ($pos < CORE::length($str)) {
896 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
897 0 0       0 if ($pos >= $position) {
898 0         0 return $pos;
899             }
900             }
901 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
902 0         0 $pos += CORE::length($1);
903             }
904             else {
905 0         0 $pos += 1;
906             }
907             }
908 0         0 return -1;
909             }
910              
911             #
912             # EUC-JP reverse index
913             #
914             sub Eeucjp::rindex($$;$) {
915              
916 0     0 0 0 my($str,$substr,$position) = @_;
917 0   0     0 $position ||= CORE::length($str) - 1;
918 0         0 my $pos = 0;
919 0         0 my $rindex = -1;
920              
921 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
922 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
923 0         0 $rindex = $pos;
924             }
925 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
926 0         0 $pos += CORE::length($1);
927             }
928             else {
929 0         0 $pos += 1;
930             }
931             }
932 0         0 return $rindex;
933             }
934              
935             #
936             # EUC-JP lower case first with parameter
937             #
938             sub Eeucjp::lcfirst(@) {
939 0 0   0 0 0 if (@_) {
940 0         0 my $s = shift @_;
941 0 0 0     0 if (@_ and wantarray) {
942 0         0 return Eeucjp::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
943             }
944             else {
945 0         0 return Eeucjp::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
946             }
947             }
948             else {
949 0         0 return Eeucjp::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
950             }
951             }
952              
953             #
954             # EUC-JP lower case first without parameter
955             #
956             sub Eeucjp::lcfirst_() {
957 0     0 0 0 return Eeucjp::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
958             }
959              
960             #
961             # EUC-JP lower case with parameter
962             #
963             sub Eeucjp::lc(@) {
964 0 0   0 0 0 if (@_) {
965 0         0 my $s = shift @_;
966 0 0 0     0 if (@_ and wantarray) {
967 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
968             }
969             else {
970 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
971             }
972             }
973             else {
974 0         0 return Eeucjp::lc_();
975             }
976             }
977              
978             #
979             # EUC-JP lower case without parameter
980             #
981             sub Eeucjp::lc_() {
982 0     0 0 0 my $s = $_;
983 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
984             }
985              
986             #
987             # EUC-JP upper case first with parameter
988             #
989             sub Eeucjp::ucfirst(@) {
990 0 0   0 0 0 if (@_) {
991 0         0 my $s = shift @_;
992 0 0 0     0 if (@_ and wantarray) {
993 0         0 return Eeucjp::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
994             }
995             else {
996 0         0 return Eeucjp::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
997             }
998             }
999             else {
1000 0         0 return Eeucjp::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1001             }
1002             }
1003              
1004             #
1005             # EUC-JP upper case first without parameter
1006             #
1007             sub Eeucjp::ucfirst_() {
1008 0     0 0 0 return Eeucjp::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1009             }
1010              
1011             #
1012             # EUC-JP upper case with parameter
1013             #
1014             sub Eeucjp::uc(@) {
1015 2780 50   2780 0 2947 if (@_) {
1016 2780         2061 my $s = shift @_;
1017 2780 50 33     4348 if (@_ and wantarray) {
1018 0 0       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1019             }
1020             else {
1021 2780 100       5565 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2780         6206  
1022             }
1023             }
1024             else {
1025 0         0 return Eeucjp::uc_();
1026             }
1027             }
1028              
1029             #
1030             # EUC-JP upper case without parameter
1031             #
1032             sub Eeucjp::uc_() {
1033 0     0 0 0 my $s = $_;
1034 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1035             }
1036              
1037             #
1038             # EUC-JP fold case with parameter
1039             #
1040             sub Eeucjp::fc(@) {
1041 2855 50   2855 0 2933 if (@_) {
1042 2855         2042 my $s = shift @_;
1043 2855 50 33     4480 if (@_ and wantarray) {
1044 0 0       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1045             }
1046             else {
1047 2855 100       4964 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2855         7347  
1048             }
1049             }
1050             else {
1051 0         0 return Eeucjp::fc_();
1052             }
1053             }
1054              
1055             #
1056             # EUC-JP fold case without parameter
1057             #
1058             sub Eeucjp::fc_() {
1059 0     0 0 0 my $s = $_;
1060 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1061             }
1062              
1063             #
1064             # EUC-JP regexp capture
1065             #
1066             {
1067             # 10.3. Creating Persistent Private Variables
1068             # in Chapter 10. Subroutines
1069             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
1070              
1071             my $last_s_matched = 0;
1072              
1073             sub Eeucjp::capture {
1074 0 0 0 0 1 0 if ($last_s_matched and ($_[0] =~ /\A (?>[1-9][0-9]*) \z/oxms)) {
1075 0         0 return $_[0] + 1;
1076             }
1077 0         0 return $_[0];
1078             }
1079              
1080             # EUC-JP mark last regexp matched
1081             sub Eeucjp::matched() {
1082 0     0 0 0 $last_s_matched = 0;
1083             }
1084              
1085             # EUC-JP mark last s/// matched
1086             sub Eeucjp::s_matched() {
1087 0     0 0 0 $last_s_matched = 1;
1088             }
1089              
1090             # P.854 31.17. use re
1091             # in Chapter 31. Pragmatic Modules
1092             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1093              
1094             # P.1026 re
1095             # in Chapter 29. Pragmatic Modules
1096             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1097              
1098             $Eeucjp::matched = qr/(?{Eeucjp::matched})/;
1099             }
1100              
1101             #
1102             # EUC-JP regexp ignore case modifier
1103             #
1104             sub Eeucjp::ignorecase {
1105              
1106 0     0 0 0 my @string = @_;
1107 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
1108              
1109             # ignore case of $scalar or @array
1110 0         0 for my $string (@string) {
1111              
1112             # split regexp
1113 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
1114              
1115             # unescape character
1116 0         0 for (my $i=0; $i <= $#char; $i++) {
1117 0 0       0 next if not defined $char[$i];
1118              
1119             # open character class [...]
1120 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
1121 0         0 my $left = $i;
1122              
1123             # [] make die "unmatched [] in regexp ...\n"
1124              
1125 0 0       0 if ($char[$i+1] eq ']') {
1126 0         0 $i++;
1127             }
1128              
1129 0         0 while (1) {
1130 0 0       0 if (++$i > $#char) {
1131 0         0 croak "Unmatched [] in regexp";
1132             }
1133 0 0       0 if ($char[$i] eq ']') {
1134 0         0 my $right = $i;
1135 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
1136              
1137             # escape character
1138 0         0 for my $char (@charlist) {
1139 0 0       0 if (0) {
1140             }
1141              
1142 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1143 0         0 $char = '\\' . $char;
1144             }
1145             }
1146              
1147             # [...]
1148 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
1149              
1150 0         0 $i = $left;
1151 0         0 last;
1152             }
1153             }
1154             }
1155              
1156             # open character class [^...]
1157             elsif ($char[$i] eq '[^') {
1158 0         0 my $left = $i;
1159              
1160             # [^] make die "unmatched [] in regexp ...\n"
1161              
1162 0 0       0 if ($char[$i+1] eq ']') {
1163 0         0 $i++;
1164             }
1165              
1166 0         0 while (1) {
1167 0 0       0 if (++$i > $#char) {
1168 0         0 croak "Unmatched [] in regexp";
1169             }
1170 0 0       0 if ($char[$i] eq ']') {
1171 0         0 my $right = $i;
1172 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
1173              
1174             # escape character
1175 0         0 for my $char (@charlist) {
1176 0 0       0 if (0) {
1177             }
1178              
1179 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1180 0         0 $char = '\\' . $char;
1181             }
1182             }
1183              
1184             # [^...]
1185 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
1186              
1187 0         0 $i = $left;
1188 0         0 last;
1189             }
1190             }
1191             }
1192              
1193             # rewrite classic character class or escape character
1194             elsif (my $char = classic_character_class($char[$i])) {
1195 0         0 $char[$i] = $char;
1196             }
1197              
1198             # with /i modifier
1199             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1200 0         0 my $uc = Eeucjp::uc($char[$i]);
1201 0         0 my $fc = Eeucjp::fc($char[$i]);
1202 0 0       0 if ($uc ne $fc) {
1203 0 0       0 if (CORE::length($fc) == 1) {
1204 0         0 $char[$i] = '[' . $uc . $fc . ']';
1205             }
1206             else {
1207 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
1208             }
1209             }
1210             }
1211             }
1212              
1213             # characterize
1214 0         0 for (my $i=0; $i <= $#char; $i++) {
1215 0 0       0 next if not defined $char[$i];
1216              
1217 0 0       0 if (0) {
1218             }
1219              
1220             # quote character before ? + * {
1221 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
1222 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
1223 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
1224             }
1225             }
1226             }
1227              
1228 0         0 $string = join '', @char;
1229             }
1230              
1231             # make regexp string
1232 0         0 return @string;
1233             }
1234              
1235             #
1236             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
1237             #
1238             sub Eeucjp::classic_character_class {
1239 2939     2939 0 2403 my($char) = @_;
1240              
1241             return {
1242             '\D' => '${Eeucjp::eD}',
1243             '\S' => '${Eeucjp::eS}',
1244             '\W' => '${Eeucjp::eW}',
1245             '\d' => '[0-9]',
1246              
1247             # Before Perl 5.6, \s only matched the five whitespace characters
1248             # tab, newline, form-feed, carriage return, and the space character
1249             # itself, which, taken together, is the character class [\t\n\f\r ].
1250              
1251             # Vertical tabs are now whitespace
1252             # \s in a regex now matches a vertical tab in all circumstances.
1253             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1254             # \t \n \v \f \r space
1255             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1256             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1257             '\s' => '\s',
1258              
1259             '\w' => '[0-9A-Z_a-z]',
1260             '\C' => '[\x00-\xFF]',
1261             '\X' => 'X',
1262              
1263             # \h \v \H \V
1264              
1265             # P.114 Character Class Shortcuts
1266             # in Chapter 7: In the World of Regular Expressions
1267             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
1268              
1269             # P.357 13.2.3 Whitespace
1270             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
1271             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1272             #
1273             # 0x00009 CHARACTER TABULATION h s
1274             # 0x0000a LINE FEED (LF) vs
1275             # 0x0000b LINE TABULATION v
1276             # 0x0000c FORM FEED (FF) vs
1277             # 0x0000d CARRIAGE RETURN (CR) vs
1278             # 0x00020 SPACE h s
1279              
1280             # P.196 Table 5-9. Alphanumeric regex metasymbols
1281             # in Chapter 5. Pattern Matching
1282             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1283              
1284             # (and so on)
1285              
1286             '\H' => '${Eeucjp::eH}',
1287             '\V' => '${Eeucjp::eV}',
1288             '\h' => '[\x09\x20]',
1289             '\v' => '[\x0A\x0B\x0C\x0D]',
1290             '\R' => '${Eeucjp::eR}',
1291              
1292             # \N
1293             #
1294             # http://perldoc.perl.org/perlre.html
1295             # Character Classes and other Special Escapes
1296             # Any character but \n (experimental). Not affected by /s modifier
1297              
1298             '\N' => '${Eeucjp::eN}',
1299              
1300             # \b \B
1301              
1302             # P.180 Boundaries: The \b and \B Assertions
1303             # in Chapter 5: Pattern Matching
1304             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1305              
1306             # P.219 Boundaries: The \b and \B Assertions
1307             # in Chapter 5: Pattern Matching
1308             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1309              
1310             # \b really means (?:(?<=\w)(?!\w)|(?
1311             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
1312             '\b' => '${Eeucjp::eb}',
1313              
1314             # \B really means (?:(?<=\w)(?=\w)|(?
1315             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
1316             '\B' => '${Eeucjp::eB}',
1317              
1318 2939   100     115193 }->{$char} || '';
1319             }
1320              
1321             #
1322             # prepare EUC-JP characters per length
1323             #
1324              
1325             # 1 octet characters
1326             my @chars1 = ();
1327             sub chars1 {
1328 0 0   0 0 0 if (@chars1) {
1329 0         0 return @chars1;
1330             }
1331 0 0       0 if (exists $range_tr{1}) {
1332 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
1333 0         0 while (my @range = splice(@ranges,0,1)) {
1334 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1335 0         0 push @chars1, pack 'C', $oct0;
1336             }
1337             }
1338             }
1339 0         0 return @chars1;
1340             }
1341              
1342             # 2 octets characters
1343             my @chars2 = ();
1344             sub chars2 {
1345 0 0   0 0 0 if (@chars2) {
1346 0         0 return @chars2;
1347             }
1348 0 0       0 if (exists $range_tr{2}) {
1349 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
1350 0         0 while (my @range = splice(@ranges,0,2)) {
1351 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1352 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1353 0         0 push @chars2, pack 'CC', $oct0,$oct1;
1354             }
1355             }
1356             }
1357             }
1358 0         0 return @chars2;
1359             }
1360              
1361             # 3 octets characters
1362             my @chars3 = ();
1363             sub chars3 {
1364 0 0   0 0 0 if (@chars3) {
1365 0         0 return @chars3;
1366             }
1367 0 0       0 if (exists $range_tr{3}) {
1368 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
1369 0         0 while (my @range = splice(@ranges,0,3)) {
1370 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1371 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1372 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1373 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
1374             }
1375             }
1376             }
1377             }
1378             }
1379 0         0 return @chars3;
1380             }
1381              
1382             # 4 octets characters
1383             my @chars4 = ();
1384             sub chars4 {
1385 0 0   0 0 0 if (@chars4) {
1386 0         0 return @chars4;
1387             }
1388 0 0       0 if (exists $range_tr{4}) {
1389 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
1390 0         0 while (my @range = splice(@ranges,0,4)) {
1391 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1392 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1393 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1394 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
1395 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
1396             }
1397             }
1398             }
1399             }
1400             }
1401             }
1402 0         0 return @chars4;
1403             }
1404              
1405             #
1406             # EUC-JP open character list for tr
1407             #
1408             sub _charlist_tr {
1409              
1410 0     0   0 local $_ = shift @_;
1411              
1412             # unescape character
1413 0         0 my @char = ();
1414 0         0 while (not /\G \z/oxmsgc) {
1415 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
1416 0         0 push @char, '\-';
1417             }
1418             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
1419 0         0 push @char, CORE::chr(oct $1);
1420             }
1421             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
1422 0         0 push @char, CORE::chr(hex $1);
1423             }
1424             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
1425 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
1426             }
1427             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
1428             push @char, {
1429             '\0' => "\0",
1430             '\n' => "\n",
1431             '\r' => "\r",
1432             '\t' => "\t",
1433             '\f' => "\f",
1434             '\b' => "\x08", # \b means backspace in character class
1435             '\a' => "\a",
1436             '\e' => "\e",
1437 0         0 }->{$1};
1438             }
1439             elsif (/\G \\ ($q_char) /oxmsgc) {
1440 0         0 push @char, $1;
1441             }
1442             elsif (/\G ($q_char) /oxmsgc) {
1443 0         0 push @char, $1;
1444             }
1445             }
1446              
1447             # join separated multiple-octet
1448 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
1449              
1450             # unescape '-'
1451 0         0 my @i = ();
1452 0         0 for my $i (0 .. $#char) {
1453 0 0       0 if ($char[$i] eq '\-') {
    0          
1454 0         0 $char[$i] = '-';
1455             }
1456             elsif ($char[$i] eq '-') {
1457 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
1458 0         0 push @i, $i;
1459             }
1460             }
1461             }
1462              
1463             # open character list (reverse for splice)
1464 0         0 for my $i (CORE::reverse @i) {
1465 0         0 my @range = ();
1466              
1467             # range error
1468 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
1469 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1470             }
1471              
1472             # range of multiple-octet code
1473 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
1474 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
1475 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
1476             }
1477             elsif (CORE::length($char[$i+1]) == 2) {
1478 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1479 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
1480             }
1481             elsif (CORE::length($char[$i+1]) == 3) {
1482 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1483 0         0 push @range, chars2();
1484 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1485             }
1486             elsif (CORE::length($char[$i+1]) == 4) {
1487 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1488 0         0 push @range, chars2();
1489 0         0 push @range, chars3();
1490 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1491             }
1492             else {
1493 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1494             }
1495             }
1496             elsif (CORE::length($char[$i-1]) == 2) {
1497 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
1498 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
1499             }
1500             elsif (CORE::length($char[$i+1]) == 3) {
1501 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1502 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1503             }
1504             elsif (CORE::length($char[$i+1]) == 4) {
1505 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1506 0         0 push @range, chars3();
1507 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1508             }
1509             else {
1510 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1511             }
1512             }
1513             elsif (CORE::length($char[$i-1]) == 3) {
1514 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
1515 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
1516             }
1517             elsif (CORE::length($char[$i+1]) == 4) {
1518 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
1519 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1520             }
1521             else {
1522 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1523             }
1524             }
1525             elsif (CORE::length($char[$i-1]) == 4) {
1526 0 0       0 if (CORE::length($char[$i+1]) == 4) {
1527 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
1528             }
1529             else {
1530 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1531             }
1532             }
1533             else {
1534 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1535             }
1536              
1537 0         0 splice @char, $i-1, 3, @range;
1538             }
1539              
1540 0         0 return @char;
1541             }
1542              
1543             #
1544             # EUC-JP open character class
1545             #
1546             sub _cc {
1547 382 50   382   867 if (scalar(@_) == 0) {
    100          
    50          
1548 0         0 die __FILE__, ": subroutine cc got no parameter.\n";
1549             }
1550             elsif (scalar(@_) == 1) {
1551 171         547 return sprintf('\x%02X',$_[0]);
1552             }
1553             elsif (scalar(@_) == 2) {
1554 211 50       555 if ($_[0] > $_[1]) {
    50          
    100          
1555 0         0 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
1556             }
1557             elsif ($_[0] == $_[1]) {
1558 0         0 return sprintf('\x%02X',$_[0]);
1559             }
1560             elsif (($_[0]+1) == $_[1]) {
1561 20         52 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
1562             }
1563             else {
1564 191         903 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
1565             }
1566             }
1567             else {
1568 0         0 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
1569             }
1570             }
1571              
1572             #
1573             # EUC-JP octet range
1574             #
1575             sub _octets {
1576 577     577   702 my $length = shift @_;
1577              
1578 577 100       884 if ($length == 1) {
    50          
    0          
    0          
1579 426         1006 my($a1) = unpack 'C', $_[0];
1580 426         588 my($z1) = unpack 'C', $_[1];
1581              
1582 426 50       692 if ($a1 > $z1) {
1583 0         0 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
1584             }
1585              
1586 426 100       940 if ($a1 == $z1) {
    50          
1587 20         79 return sprintf('\x%02X',$a1);
1588             }
1589             elsif (($a1+1) == $z1) {
1590 0         0 return sprintf('\x%02X\x%02X',$a1,$z1);
1591             }
1592             else {
1593 406         2293 return sprintf('\x%02X-\x%02X',$a1,$z1);
1594             }
1595             }
1596             elsif ($length == 2) {
1597 151         321 my($a1,$a2) = unpack 'CC', $_[0];
1598 151         193 my($z1,$z2) = unpack 'CC', $_[1];
1599 151         161 my($A1,$A2) = unpack 'CC', $_[2];
1600 151         165 my($Z1,$Z2) = unpack 'CC', $_[3];
1601              
1602 151 100       228 if ($a1 == $z1) {
    50          
1603             return (
1604             # 11111111 222222222222
1605             # A A Z
1606 131         226 _cc($a1) . _cc($a2,$z2), # a2-z2
1607             );
1608             }
1609             elsif (($a1+1) == $z1) {
1610             return (
1611             # 11111111111 222222222222
1612             # A Z A Z
1613 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
1614             _cc( $z1) . _cc($A2,$z2), # -z2
1615             );
1616             }
1617             else {
1618             return (
1619             # 1111111111111111 222222222222
1620             # A Z A Z
1621 20         26 _cc($a1) . _cc($a2,$Z2), # a2-
1622             _cc($a1+1,$z1-1) . _cc($A2,$Z2), # -
1623             _cc( $z1) . _cc($A2,$z2), # -z2
1624             );
1625             }
1626             }
1627             elsif ($length == 3) {
1628 0         0 my($a1,$a2,$a3) = unpack 'CCC', $_[0];
1629 0         0 my($z1,$z2,$z3) = unpack 'CCC', $_[1];
1630 0         0 my($A1,$A2,$A3) = unpack 'CCC', $_[2];
1631 0         0 my($Z1,$Z2,$Z3) = unpack 'CCC', $_[3];
1632              
1633 0 0       0 if ($a1 == $z1) {
    0          
1634 0 0       0 if ($a2 == $z2) {
    0          
1635             return (
1636             # 11111111 22222222 333333333333
1637             # A A A Z
1638 0         0 _cc($a1) . _cc($a2) . _cc($a3,$z3), # a3-z3
1639             );
1640             }
1641             elsif (($a2+1) == $z2) {
1642             return (
1643             # 11111111 22222222222 333333333333
1644             # A A Z A Z
1645 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1646             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1647             );
1648             }
1649             else {
1650             return (
1651             # 11111111 2222222222222222 333333333333
1652             # A A Z A Z
1653 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1654             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3), # -
1655             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1656             );
1657             }
1658             }
1659             elsif (($a1+1) == $z1) {
1660             return (
1661             # 11111111111 22222222222222 333333333333
1662             # A Z A Z A Z
1663 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1664             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1665             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1666             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1667             );
1668             }
1669             else {
1670             return (
1671             # 1111111111111111 22222222222222 333333333333
1672             # A Z A Z A Z
1673 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1674             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1675             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3), # -
1676             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1677             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1678             );
1679             }
1680             }
1681             elsif ($length == 4) {
1682 0         0 my($a1,$a2,$a3,$a4) = unpack 'CCCC', $_[0];
1683 0         0 my($z1,$z2,$z3,$z4) = unpack 'CCCC', $_[1];
1684 0         0 my($A1,$A2,$A3,$A4) = unpack 'CCCC', $_[0];
1685 0         0 my($Z1,$Z2,$Z3,$Z4) = unpack 'CCCC', $_[1];
1686              
1687 0 0       0 if ($a1 == $z1) {
    0          
1688 0 0       0 if ($a2 == $z2) {
    0          
1689 0 0       0 if ($a3 == $z3) {
    0          
1690             return (
1691             # 11111111 22222222 33333333 444444444444
1692             # A A A A Z
1693 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$z4), # a4-z4
1694             );
1695             }
1696             elsif (($a3+1) == $z3) {
1697             return (
1698             # 11111111 22222222 33333333333 444444444444
1699             # A A A Z A Z
1700 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1701             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1702             );
1703             }
1704             else {
1705             return (
1706             # 11111111 22222222 3333333333333333 444444444444
1707             # A A A Z A Z
1708 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1709             _cc($a1) . _cc($a2) . _cc($a3+1,$z3-1) . _cc($A4,$Z4), # -
1710             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1711             );
1712             }
1713             }
1714             elsif (($a2+1) == $z2) {
1715             return (
1716             # 11111111 22222222222 33333333333333 444444444444
1717             # A A Z A Z A Z
1718 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1719             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1720             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1721             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1722             );
1723             }
1724             else {
1725             return (
1726             # 11111111 2222222222222222 33333333333333 444444444444
1727             # A A Z A Z A Z
1728 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1729             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1730             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1731             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1732             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1733             );
1734             }
1735             }
1736             elsif (($a1+1) == $z1) {
1737             return (
1738             # 11111111111 22222222222222 33333333333333 444444444444
1739             # A Z A Z A Z A Z
1740 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1741             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1742             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1743             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1744             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1745             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1746             );
1747             }
1748             else {
1749             return (
1750             # 1111111111111111 22222222222222 33333333333333 444444444444
1751             # A Z A Z A Z A Z
1752 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1753             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1754             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1755             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1756             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1757             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1758             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1759             );
1760             }
1761             }
1762             else {
1763 0         0 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
1764             }
1765             }
1766              
1767             #
1768             # EUC-JP range regexp
1769             #
1770             sub _range_regexp {
1771 517     517   627 my($length,$first,$last) = @_;
1772              
1773 517         540 my @range_regexp = ();
1774 517 50       1117 if (not exists $range_tr{$length}) {
1775 0         0 return @range_regexp;
1776             }
1777              
1778 517         432 my @ranges = @{ $range_tr{$length} };
  517         1092  
1779 517         1407 while (my @range = splice(@ranges,0,$length)) {
1780 1420         1131 my $min = '';
1781 1420         983 my $max = '';
1782 1420         2171 for (my $i=0; $i < $length; $i++) {
1783 1682         2897 $min .= pack 'C', $range[$i][0];
1784 1682         2964 $max .= pack 'C', $range[$i][-1];
1785             }
1786              
1787             # min___max
1788             # FIRST_____________LAST
1789             # (nothing)
1790              
1791 1420 100 66     13356 if ($max lt $first) {
    100 100        
    50 33        
    100 100        
    100 66        
    100 66        
    50 66        
1792             }
1793              
1794             # **********
1795             # min_________max
1796             # FIRST_____________LAST
1797             # **********
1798              
1799             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
1800 20         43 push @range_regexp, _octets($length,$first,$max,$min,$max);
1801             }
1802              
1803             # **********************
1804             # min________________max
1805             # FIRST_____________LAST
1806             # **********************
1807              
1808             elsif (($min eq $first) and ($max eq $last)) {
1809 0         0 push @range_regexp, _octets($length,$first,$last,$min,$max);
1810             }
1811              
1812             # *********
1813             # min___max
1814             # FIRST_____________LAST
1815             # *********
1816              
1817             elsif (($first le $min) and ($max le $last)) {
1818 60         64 push @range_regexp, _octets($length,$min,$max,$min,$max);
1819             }
1820              
1821             # **********************
1822             # min__________________________max
1823             # FIRST_____________LAST
1824             # **********************
1825              
1826             elsif (($min le $first) and ($last le $max)) {
1827 477         948 push @range_regexp, _octets($length,$first,$last,$min,$max);
1828             }
1829              
1830             # *********
1831             # min________max
1832             # FIRST_____________LAST
1833             # *********
1834              
1835             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
1836 20         26 push @range_regexp, _octets($length,$min,$last,$min,$max);
1837             }
1838              
1839             # min___max
1840             # FIRST_____________LAST
1841             # (nothing)
1842              
1843             elsif ($last lt $min) {
1844             }
1845              
1846             else {
1847 0         0 die __FILE__, ": subroutine _range_regexp panic.\n";
1848             }
1849             }
1850              
1851 517         937 return @range_regexp;
1852             }
1853              
1854             #
1855             # EUC-JP open character list for qr and not qr
1856             #
1857             sub _charlist {
1858              
1859 758     758   815 my $modifier = pop @_;
1860 758         1100 my @char = @_;
1861              
1862 758 100       1340 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
1863              
1864             # unescape character
1865 758         1829 for (my $i=0; $i <= $#char; $i++) {
1866              
1867             # escape - to ...
1868 2648 100 100     20144 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
1869 522 100 100     1984 if ((0 < $i) and ($i < $#char)) {
1870 497         901 $char[$i] = '...';
1871             }
1872             }
1873              
1874             # octal escape sequence
1875             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
1876 0         0 $char[$i] = octchr($1);
1877             }
1878              
1879             # hexadecimal escape sequence
1880             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
1881 0         0 $char[$i] = hexchr($1);
1882             }
1883              
1884             # \b{...} --> b\{...}
1885             # \B{...} --> B\{...}
1886             # \N{CHARNAME} --> N\{CHARNAME}
1887             # \p{PROPERTY} --> p\{PROPERTY}
1888             # \P{PROPERTY} --> P\{PROPERTY}
1889             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
1890 0         0 $char[$i] = $1 . '\\' . $2;
1891             }
1892              
1893             # \p, \P, \X --> p, P, X
1894             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
1895 0         0 $char[$i] = $1;
1896             }
1897              
1898             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
1899 0         0 $char[$i] = CORE::chr oct $1;
1900             }
1901             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
1902 206         630 $char[$i] = CORE::chr hex $1;
1903             }
1904             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
1905 0         0 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
1906             }
1907             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
1908             $char[$i] = {
1909             '\0' => "\0",
1910             '\n' => "\n",
1911             '\r' => "\r",
1912             '\t' => "\t",
1913             '\f' => "\f",
1914             '\b' => "\x08", # \b means backspace in character class
1915             '\a' => "\a",
1916             '\e' => "\e",
1917             '\d' => '[0-9]',
1918              
1919             # Vertical tabs are now whitespace
1920             # \s in a regex now matches a vertical tab in all circumstances.
1921             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1922             # \t \n \v \f \r space
1923             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1924             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1925             '\s' => '\s',
1926              
1927             '\w' => '[0-9A-Z_a-z]',
1928             '\D' => '${Eeucjp::eD}',
1929             '\S' => '${Eeucjp::eS}',
1930             '\W' => '${Eeucjp::eW}',
1931              
1932             '\H' => '${Eeucjp::eH}',
1933             '\V' => '${Eeucjp::eV}',
1934             '\h' => '[\x09\x20]',
1935             '\v' => '[\x0A\x0B\x0C\x0D]',
1936             '\R' => '${Eeucjp::eR}',
1937              
1938 33         439 }->{$1};
1939             }
1940              
1941             # POSIX-style character classes
1942             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
1943             $char[$i] = {
1944              
1945             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
1946             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
1947             '[:^lower:]' => '${Eeucjp::not_lower_i}',
1948             '[:^upper:]' => '${Eeucjp::not_upper_i}',
1949              
1950 8         47 }->{$1};
1951             }
1952             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
1953             $char[$i] = {
1954              
1955             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
1956             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
1957             '[:ascii:]' => '[\x00-\x7F]',
1958             '[:blank:]' => '[\x09\x20]',
1959             '[:cntrl:]' => '[\x00-\x1F\x7F]',
1960             '[:digit:]' => '[\x30-\x39]',
1961             '[:graph:]' => '[\x21-\x7F]',
1962             '[:lower:]' => '[\x61-\x7A]',
1963             '[:print:]' => '[\x20-\x7F]',
1964             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
1965              
1966             # P.174 POSIX-Style Character Classes
1967             # in Chapter 5: Pattern Matching
1968             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1969              
1970             # P.311 11.2.4 Character Classes and other Special Escapes
1971             # in Chapter 11: perlre: Perl regular expressions
1972             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1973              
1974             # P.210 POSIX-Style Character Classes
1975             # in Chapter 5: Pattern Matching
1976             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1977              
1978             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
1979              
1980             '[:upper:]' => '[\x41-\x5A]',
1981             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
1982             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
1983             '[:^alnum:]' => '${Eeucjp::not_alnum}',
1984             '[:^alpha:]' => '${Eeucjp::not_alpha}',
1985             '[:^ascii:]' => '${Eeucjp::not_ascii}',
1986             '[:^blank:]' => '${Eeucjp::not_blank}',
1987             '[:^cntrl:]' => '${Eeucjp::not_cntrl}',
1988             '[:^digit:]' => '${Eeucjp::not_digit}',
1989             '[:^graph:]' => '${Eeucjp::not_graph}',
1990             '[:^lower:]' => '${Eeucjp::not_lower}',
1991             '[:^print:]' => '${Eeucjp::not_print}',
1992             '[:^punct:]' => '${Eeucjp::not_punct}',
1993             '[:^space:]' => '${Eeucjp::not_space}',
1994             '[:^upper:]' => '${Eeucjp::not_upper}',
1995             '[:^word:]' => '${Eeucjp::not_word}',
1996             '[:^xdigit:]' => '${Eeucjp::not_xdigit}',
1997              
1998 70         1055 }->{$1};
1999             }
2000             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
2001 7         31 $char[$i] = $1;
2002             }
2003             }
2004              
2005             # open character list
2006 758         879 my @singleoctet = ();
2007 758         732 my @multipleoctet = ();
2008 758         1439 for (my $i=0; $i <= $#char; ) {
2009              
2010             # escaped -
2011 2151 100 100     8811 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
2012 497         425 $i += 1;
2013 497         804 next;
2014             }
2015              
2016             # make range regexp
2017             elsif ($char[$i] eq '...') {
2018              
2019             # range error
2020 497 50       1565 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    100          
2021 0         0 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2022             }
2023             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
2024 477 50       1043 if ($char[$i-1] gt $char[$i+1]) {
2025 0         0 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2026             }
2027             }
2028              
2029             # make range regexp per length
2030 497         1257 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
2031 517         504 my @regexp = ();
2032              
2033             # is first and last
2034 517 100 100     1814 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    100 33        
    50          
    50          
2035 477         1098 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
2036             }
2037              
2038             # is first
2039             elsif ($length == CORE::length($char[$i-1])) {
2040 20         56 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
2041             }
2042              
2043             # is inside in first and last
2044             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
2045 0         0 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
2046             }
2047              
2048             # is last
2049             elsif ($length == CORE::length($char[$i+1])) {
2050 20         43 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
2051             }
2052              
2053             else {
2054 0         0 die __FILE__, ": subroutine make_regexp panic.\n";
2055             }
2056              
2057 517 100       1077 if ($length == 1) {
2058 386         692 push @singleoctet, @regexp;
2059             }
2060             else {
2061 131         210 push @multipleoctet, @regexp;
2062             }
2063             }
2064              
2065 497         935 $i += 2;
2066             }
2067              
2068             # with /i modifier
2069             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
2070 764 100       903 if ($modifier =~ /i/oxms) {
2071 192         257 my $uc = Eeucjp::uc($char[$i]);
2072 192         336 my $fc = Eeucjp::fc($char[$i]);
2073 192 50       248 if ($uc ne $fc) {
2074 192 50       215 if (CORE::length($fc) == 1) {
2075 192         273 push @singleoctet, $uc, $fc;
2076             }
2077             else {
2078 0         0 push @singleoctet, $uc;
2079 0         0 push @multipleoctet, $fc;
2080             }
2081             }
2082             else {
2083 0         0 push @singleoctet, $char[$i];
2084             }
2085             }
2086             else {
2087 572         601 push @singleoctet, $char[$i];
2088             }
2089 764         1076 $i += 1;
2090             }
2091              
2092             # single character of single octet code
2093             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
2094 0         0 push @singleoctet, "\t", "\x20";
2095 0         0 $i += 1;
2096             }
2097             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
2098 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
2099 0         0 $i += 1;
2100             }
2101             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
2102 2         4 push @singleoctet, $char[$i];
2103 2         5 $i += 1;
2104             }
2105              
2106             # single character of multiple-octet code
2107             else {
2108 391         429 push @multipleoctet, $char[$i];
2109 391         562 $i += 1;
2110             }
2111             }
2112              
2113             # quote metachar
2114 758         1329 for (@singleoctet) {
2115 1384 50       5979 if ($_ eq '...') {
    100          
    100          
    100          
    100          
2116 0         0 $_ = '-';
2117             }
2118             elsif (/\A \n \z/oxms) {
2119 8         16 $_ = '\n';
2120             }
2121             elsif (/\A \r \z/oxms) {
2122 8         12 $_ = '\r';
2123             }
2124             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
2125 1         5 $_ = sprintf('\x%02X', CORE::ord $1);
2126             }
2127             elsif (/\A [\x00-\xFF] \z/oxms) {
2128 939         1019 $_ = quotemeta $_;
2129             }
2130             }
2131              
2132             # return character list
2133 758         1821 return \@singleoctet, \@multipleoctet;
2134             }
2135              
2136             #
2137             # EUC-JP octal escape sequence
2138             #
2139             sub octchr {
2140 5     5 0 11 my($octdigit) = @_;
2141              
2142 5         6 my @binary = ();
2143 5         16 for my $octal (split(//,$octdigit)) {
2144             push @binary, {
2145             '0' => '000',
2146             '1' => '001',
2147             '2' => '010',
2148             '3' => '011',
2149             '4' => '100',
2150             '5' => '101',
2151             '6' => '110',
2152             '7' => '111',
2153 50         157 }->{$octal};
2154             }
2155 5         14 my $binary = join '', @binary;
2156              
2157             my $octchr = {
2158             # 1234567
2159             1 => pack('B*', "0000000$binary"),
2160             2 => pack('B*', "000000$binary"),
2161             3 => pack('B*', "00000$binary"),
2162             4 => pack('B*', "0000$binary"),
2163             5 => pack('B*', "000$binary"),
2164             6 => pack('B*', "00$binary"),
2165             7 => pack('B*', "0$binary"),
2166             0 => pack('B*', "$binary"),
2167              
2168 5         61 }->{CORE::length($binary) % 8};
2169              
2170 5         19 return $octchr;
2171             }
2172              
2173             #
2174             # EUC-JP hexadecimal escape sequence
2175             #
2176             sub hexchr {
2177 5     5 0 9 my($hexdigit) = @_;
2178              
2179             my $hexchr = {
2180             1 => pack('H*', "0$hexdigit"),
2181             0 => pack('H*', "$hexdigit"),
2182              
2183 5         39 }->{CORE::length($_[0]) % 2};
2184              
2185 5         15 return $hexchr;
2186             }
2187              
2188             #
2189             # EUC-JP open character list for qr
2190             #
2191             sub charlist_qr {
2192              
2193 519     519 0 727 my $modifier = pop @_;
2194 519         1028 my @char = @_;
2195              
2196 519         1070 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2197 519         846 my @singleoctet = @$singleoctet;
2198 519         593 my @multipleoctet = @$multipleoctet;
2199              
2200             # return character list
2201 519 100       1001 if (scalar(@singleoctet) >= 1) {
2202              
2203             # with /i modifier
2204 384 100       754 if ($modifier =~ m/i/oxms) {
2205 107         160 my %singleoctet_ignorecase = ();
2206 107         138 for (@singleoctet) {
2207 277   100     892 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2208 85         260 for my $ord (hex($1) .. hex($2)) {
2209 1196         924 my $char = CORE::chr($ord);
2210 1196         1049 my $uc = Eeucjp::uc($char);
2211 1196         1247 my $fc = Eeucjp::fc($char);
2212 1196 100       1318 if ($uc eq $fc) {
2213 607         1055 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2214             }
2215             else {
2216 589 50       574 if (CORE::length($fc) == 1) {
2217 589         841 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2218 589         1092 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2219             }
2220             else {
2221 0         0 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2222 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2223             }
2224             }
2225             }
2226             }
2227 277 100       386 if ($_ ne '') {
2228 192         410 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2229             }
2230             }
2231 107         98 my $i = 0;
2232 107         136 my @singleoctet_ignorecase = ();
2233 107         164 for my $ord (0 .. 255) {
2234 27392 100       23685 if (exists $singleoctet_ignorecase{$ord}) {
2235 1727         973 push @{$singleoctet_ignorecase[$i]}, $ord;
  1727         1883  
2236             }
2237             else {
2238 25665         16255 $i++;
2239             }
2240             }
2241 107         168 @singleoctet = ();
2242 107         191 for my $range (@singleoctet_ignorecase) {
2243 11262 100       14346 if (ref $range) {
2244 219 100       143 if (scalar(@{$range}) == 1) {
  219 50       305  
2245 5         6 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         62  
2246             }
2247 214         228 elsif (scalar(@{$range}) == 2) {
2248 0         0 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2249             }
2250             else {
2251 214         175 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         186  
  214         785  
2252             }
2253             }
2254             }
2255             }
2256              
2257 384         490 my $not_anchor = '';
2258 384         349 $not_anchor = '(?![\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE])';
2259              
2260 384         828 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
2261             }
2262 519 100       867 if (scalar(@multipleoctet) >= 2) {
2263 102         527 return '(?:' . join('|', @multipleoctet) . ')';
2264             }
2265             else {
2266 417         1487 return $multipleoctet[0];
2267             }
2268             }
2269              
2270             #
2271             # EUC-JP open character list for not qr
2272             #
2273             sub charlist_not_qr {
2274              
2275 239     239 0 296 my $modifier = pop @_;
2276 239         396 my @char = @_;
2277              
2278 239         375 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2279 239         389 my @singleoctet = @$singleoctet;
2280 239         290 my @multipleoctet = @$multipleoctet;
2281              
2282             # with /i modifier
2283 239 100       472 if ($modifier =~ m/i/oxms) {
2284 128         186 my %singleoctet_ignorecase = ();
2285 128         126 for (@singleoctet) {
2286 277   100     830 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2287 85         238 for my $ord (hex($1) .. hex($2)) {
2288 1196         919 my $char = CORE::chr($ord);
2289 1196         1037 my $uc = Eeucjp::uc($char);
2290 1196         1213 my $fc = Eeucjp::fc($char);
2291 1196 100       1297 if ($uc eq $fc) {
2292 607         1030 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2293             }
2294             else {
2295 589 50       556 if (CORE::length($fc) == 1) {
2296 589         836 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2297 589         1042 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2298             }
2299             else {
2300 0         0 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2301 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2302             }
2303             }
2304             }
2305             }
2306 277 100       371 if ($_ ne '') {
2307 192         342 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2308             }
2309             }
2310 128         104 my $i = 0;
2311 128         127 my @singleoctet_ignorecase = ();
2312 128         151 for my $ord (0 .. 255) {
2313 32768 100       27394 if (exists $singleoctet_ignorecase{$ord}) {
2314 1727         994 push @{$singleoctet_ignorecase[$i]}, $ord;
  1727         1817  
2315             }
2316             else {
2317 31041         19743 $i++;
2318             }
2319             }
2320 128         160 @singleoctet = ();
2321 128         185 for my $range (@singleoctet_ignorecase) {
2322 11262 100       14323 if (ref $range) {
2323 219 100       168 if (scalar(@{$range}) == 1) {
  219 50       282  
2324 5         6 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         72  
2325             }
2326 214         216 elsif (scalar(@{$range}) == 2) {
2327 0         0 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2328             }
2329             else {
2330 214         155 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         177  
  214         787  
2331             }
2332             }
2333             }
2334             }
2335              
2336             # return character list
2337 239 100       425 if (scalar(@multipleoctet) >= 1) {
2338 114 100       212 if (scalar(@singleoctet) >= 1) {
2339              
2340             # any character other than multiple-octet and single octet character class
2341 70         386 return '(?!' . join('|', @multipleoctet) . ')(?:[^\x8E\x8F\xA1-\xFE' . join('', @singleoctet) . ']|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])';
2342             }
2343             else {
2344              
2345             # any character other than multiple-octet character class
2346 44         219 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
2347             }
2348             }
2349             else {
2350 125 50       161 if (scalar(@singleoctet) >= 1) {
2351              
2352             # any character other than single octet character class
2353 125         571 return '(?:[^\x8E\x8F\xA1-\xFE' . join('', @singleoctet) . ']|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])';
2354             }
2355             else {
2356              
2357             # any character
2358 0         0 return "(?:$your_char)";
2359             }
2360             }
2361             }
2362              
2363             #
2364             # open file in read mode
2365             #
2366             sub _open_r {
2367 650     650   2035 my(undef,$file) = @_;
2368 650         1789 $file =~ s#\A (\s) #./$1#oxms;
2369 650   33     46239 return CORE::eval(q{open($_[0],'<',$_[1])}) ||
2370             open($_[0],"< $file\0");
2371             }
2372              
2373             #
2374             # open file in write mode
2375             #
2376             sub _open_w {
2377 0     0   0 my(undef,$file) = @_;
2378 0         0 $file =~ s#\A (\s) #./$1#oxms;
2379 0   0     0 return CORE::eval(q{open($_[0],'>',$_[1])}) ||
2380             open($_[0],"> $file\0");
2381             }
2382              
2383             #
2384             # open file in append mode
2385             #
2386             sub _open_a {
2387 0     0   0 my(undef,$file) = @_;
2388 0         0 $file =~ s#\A (\s) #./$1#oxms;
2389 0   0     0 return CORE::eval(q{open($_[0],'>>',$_[1])}) ||
2390             open($_[0],">> $file\0");
2391             }
2392              
2393             #
2394             # safe system
2395             #
2396             sub _systemx {
2397              
2398             # P.707 29.2.33. exec
2399             # in Chapter 29: Functions
2400             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2401             #
2402             # Be aware that in older releases of Perl, exec (and system) did not flush
2403             # your output buffer, so you needed to enable command buffering by setting $|
2404             # on one or more filehandles to avoid lost output in the case of exec, or
2405             # misordererd output in the case of system. This situation was largely remedied
2406             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
2407              
2408             # P.855 exec
2409             # in Chapter 27: Functions
2410             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2411             #
2412             # In very old release of Perl (before v5.6), exec (and system) did not flush
2413             # your output buffer, so you needed to enable command buffering by setting $|
2414             # on one or more filehandles to avoid lost output with exec or misordered
2415             # output with system.
2416              
2417 325     325   917 $| = 1;
2418              
2419             # P.565 23.1.2. Cleaning Up Your Environment
2420             # in Chapter 23: Security
2421             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2422              
2423             # P.656 Cleaning Up Your Environment
2424             # in Chapter 20: Security
2425             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2426              
2427             # local $ENV{'PATH'} = '.';
2428 325         2461 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
2429              
2430             # P.707 29.2.33. exec
2431             # in Chapter 29: Functions
2432             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2433             #
2434             # As we mentioned earlier, exec treats a discrete list of arguments as an
2435             # indication that it should bypass shell processing. However, there is one
2436             # place where you might still get tripped up. The exec call (and system, too)
2437             # will not distinguish between a single scalar argument and an array containing
2438             # only one element.
2439             #
2440             # @args = ("echo surprise"); # just one element in list
2441             # exec @args # still subject to shell escapes
2442             # or die "exec: $!"; # because @args == 1
2443             #
2444             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
2445             # first argument as the pathname, which forces the rest of the arguments to be
2446             # interpreted as a list, even if there is only one of them:
2447             #
2448             # exec { $args[0] } @args # safe even with one-argument list
2449             # or die "can't exec @args: $!";
2450              
2451             # P.855 exec
2452             # in Chapter 27: Functions
2453             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2454             #
2455             # As we mentioned earlier, exec treats a discrete list of arguments as a
2456             # directive to bypass shell processing. However, there is one place where
2457             # you might still get tripped up. The exec call (and system, too) cannot
2458             # distinguish between a single scalar argument and an array containing
2459             # only one element.
2460             #
2461             # @args = ("echo surprise"); # just one element in list
2462             # exec @args # still subject to shell escapes
2463             # || die "exec: $!"; # because @args == 1
2464             #
2465             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
2466             # argument as the pathname, which forces the rest of the arguments to be
2467             # interpreted as a list, even if there is only one of them:
2468             #
2469             # exec { $args[0] } @args # safe even with one-argument list
2470             # || die "can't exec @args: $!";
2471              
2472 325         571 return CORE::system { $_[0] } @_; # safe even with one-argument list
  325         27130934  
2473             }
2474              
2475             #
2476             # EUC-JP order to character (with parameter)
2477             #
2478             sub Eeucjp::chr(;$) {
2479              
2480 0 0   0 0 0 my $c = @_ ? $_[0] : $_;
2481              
2482 0 0       0 if ($c == 0x00) {
2483 0         0 return "\x00";
2484             }
2485             else {
2486 0         0 my @chr = ();
2487 0         0 while ($c > 0) {
2488 0         0 unshift @chr, ($c % 0x100);
2489 0         0 $c = int($c / 0x100);
2490             }
2491 0         0 return pack 'C*', @chr;
2492             }
2493             }
2494              
2495             #
2496             # EUC-JP order to character (without parameter)
2497             #
2498             sub Eeucjp::chr_() {
2499              
2500 0     0 0 0 my $c = $_;
2501              
2502 0 0       0 if ($c == 0x00) {
2503 0         0 return "\x00";
2504             }
2505             else {
2506 0         0 my @chr = ();
2507 0         0 while ($c > 0) {
2508 0         0 unshift @chr, ($c % 0x100);
2509 0         0 $c = int($c / 0x100);
2510             }
2511 0         0 return pack 'C*', @chr;
2512             }
2513             }
2514              
2515             #
2516             # EUC-JP path globbing (with parameter)
2517             #
2518             sub Eeucjp::glob($) {
2519              
2520 0 0   0 0 0 if (wantarray) {
2521 0         0 my @glob = _DOS_like_glob(@_);
2522 0         0 for my $glob (@glob) {
2523 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2524             }
2525 0         0 return @glob;
2526             }
2527             else {
2528 0         0 my $glob = _DOS_like_glob(@_);
2529 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2530 0         0 return $glob;
2531             }
2532             }
2533              
2534             #
2535             # EUC-JP path globbing (without parameter)
2536             #
2537             sub Eeucjp::glob_() {
2538              
2539 0 0   0 0 0 if (wantarray) {
2540 0         0 my @glob = _DOS_like_glob();
2541 0         0 for my $glob (@glob) {
2542 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2543             }
2544 0         0 return @glob;
2545             }
2546             else {
2547 0         0 my $glob = _DOS_like_glob();
2548 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2549 0         0 return $glob;
2550             }
2551             }
2552              
2553             #
2554             # EUC-JP path globbing via File::DosGlob 1.10
2555             #
2556             # Often I confuse "_dosglob" and "_doglob".
2557             # So, I renamed "_dosglob" to "_DOS_like_glob".
2558             #
2559             my %iter;
2560             my %entries;
2561             sub _DOS_like_glob {
2562              
2563             # context (keyed by second cxix argument provided by core)
2564 0     0   0 my($expr,$cxix) = @_;
2565              
2566             # glob without args defaults to $_
2567 0 0       0 $expr = $_ if not defined $expr;
2568              
2569             # represents the current user's home directory
2570             #
2571             # 7.3. Expanding Tildes in Filenames
2572             # in Chapter 7. File Access
2573             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2574             #
2575             # and File::HomeDir, File::HomeDir::Windows module
2576              
2577             # DOS-like system
2578 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2579 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
2580 0         0 { my_home_MSWin32() }oxmse;
2581             }
2582              
2583             # UNIX-like system
2584             else {
2585 0         0 $expr =~ s{ \A ~ ( (?:[^\x8E\x8F\xA1-\xFE/]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])* ) }
2586 0 0 0     0 { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
2587             }
2588              
2589             # assume global context if not provided one
2590 0 0       0 $cxix = '_G_' if not defined $cxix;
2591 0 0       0 $iter{$cxix} = 0 if not exists $iter{$cxix};
2592              
2593             # if we're just beginning, do it all first
2594 0 0       0 if ($iter{$cxix} == 0) {
2595 0         0 $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
2596             }
2597              
2598             # chuck it all out, quick or slow
2599 0 0       0 if (wantarray) {
2600 0         0 delete $iter{$cxix};
2601 0         0 return @{delete $entries{$cxix}};
  0         0  
2602             }
2603             else {
2604 0 0       0 if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
  0         0  
2605 0         0 return shift @{$entries{$cxix}};
  0         0  
2606             }
2607             else {
2608             # return undef for EOL
2609 0         0 delete $iter{$cxix};
2610 0         0 delete $entries{$cxix};
2611 0         0 return undef;
2612             }
2613             }
2614             }
2615              
2616             #
2617             # EUC-JP path globbing subroutine
2618             #
2619             sub _do_glob {
2620              
2621 0     0   0 my($cond,@expr) = @_;
2622 0         0 my @glob = ();
2623 0         0 my $fix_drive_relative_paths = 0;
2624              
2625             OUTER:
2626 0         0 for my $expr (@expr) {
2627 0 0       0 next OUTER if not defined $expr;
2628 0 0       0 next OUTER if $expr eq '';
2629              
2630 0         0 my @matched = ();
2631 0         0 my @globdir = ();
2632 0         0 my $head = '.';
2633 0         0 my $pathsep = '/';
2634 0         0 my $tail;
2635              
2636             # if argument is within quotes strip em and do no globbing
2637 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
2638 0         0 $expr = $1;
2639 0 0       0 if ($cond eq 'd') {
2640 0 0       0 if (-d $expr) {
2641 0         0 push @glob, $expr;
2642             }
2643             }
2644             else {
2645 0 0       0 if (-e $expr) {
2646 0         0 push @glob, $expr;
2647             }
2648             }
2649 0         0 next OUTER;
2650             }
2651              
2652             # wildcards with a drive prefix such as h:*.pm must be changed
2653             # to h:./*.pm to expand correctly
2654 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2655 0 0       0 if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^\x8E\x8F\xA1-\xFE/\\]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]) #$1./$2#oxms) {
2656 0         0 $fix_drive_relative_paths = 1;
2657             }
2658             }
2659              
2660 0 0       0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
2661 0 0       0 if ($tail eq '') {
2662 0         0 push @glob, $expr;
2663 0         0 next OUTER;
2664             }
2665 0 0       0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
2666 0 0       0 if (@globdir = _do_glob('d', $head)) {
2667 0         0 push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
  0         0  
2668 0         0 next OUTER;
2669             }
2670             }
2671 0 0 0     0 if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
2672 0         0 $head .= $pathsep;
2673             }
2674 0         0 $expr = $tail;
2675             }
2676              
2677             # If file component has no wildcards, we can avoid opendir
2678 0 0       0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
2679 0 0       0 if ($head eq '.') {
2680 0         0 $head = '';
2681             }
2682 0 0 0     0 if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2683 0         0 $head .= $pathsep;
2684             }
2685 0         0 $head .= $expr;
2686 0 0       0 if ($cond eq 'd') {
2687 0 0       0 if (-d $head) {
2688 0         0 push @glob, $head;
2689             }
2690             }
2691             else {
2692 0 0       0 if (-e $head) {
2693 0         0 push @glob, $head;
2694             }
2695             }
2696 0         0 next OUTER;
2697             }
2698 0 0       0 opendir(*DIR, $head) or next OUTER;
2699 0         0 my @leaf = readdir DIR;
2700 0         0 closedir DIR;
2701              
2702 0 0       0 if ($head eq '.') {
2703 0         0 $head = '';
2704             }
2705 0 0 0     0 if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2706 0         0 $head .= $pathsep;
2707             }
2708              
2709 0         0 my $pattern = '';
2710 0         0 while ($expr =~ / \G ($q_char) /oxgc) {
2711 0         0 my $char = $1;
2712              
2713             # 6.9. Matching Shell Globs as Regular Expressions
2714             # in Chapter 6. Pattern Matching
2715             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2716             # (and so on)
2717              
2718 0 0       0 if ($char eq '*') {
    0          
    0          
2719 0         0 $pattern .= "(?:$your_char)*",
2720             }
2721             elsif ($char eq '?') {
2722 0         0 $pattern .= "(?:$your_char)?", # DOS style
2723             # $pattern .= "(?:$your_char)", # UNIX style
2724             }
2725             elsif ((my $fc = Eeucjp::fc($char)) ne $char) {
2726 0         0 $pattern .= $fc;
2727             }
2728             else {
2729 0         0 $pattern .= quotemeta $char;
2730             }
2731             }
2732 0     0   0 my $matchsub = sub { Eeucjp::fc($_[0]) =~ /\A $pattern \z/xms };
  0         0  
2733              
2734             # if ($@) {
2735             # print STDERR "$0: $@\n";
2736             # next OUTER;
2737             # }
2738              
2739             INNER:
2740 0         0 for my $leaf (@leaf) {
2741 0 0 0     0 if ($leaf eq '.' or $leaf eq '..') {
2742 0         0 next INNER;
2743             }
2744 0 0 0     0 if ($cond eq 'd' and not -d "$head$leaf") {
2745 0         0 next INNER;
2746             }
2747              
2748 0 0       0 if (&$matchsub($leaf)) {
2749 0         0 push @matched, "$head$leaf";
2750 0         0 next INNER;
2751             }
2752              
2753             # [DOS compatibility special case]
2754             # Failed, add a trailing dot and try again, but only...
2755              
2756 0 0 0     0 if (Eeucjp::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
      0        
2757             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
2758             Eeucjp::index($pattern,'\\.') != -1 # pattern has a dot.
2759             ) {
2760 0 0       0 if (&$matchsub("$leaf.")) {
2761 0         0 push @matched, "$head$leaf";
2762 0         0 next INNER;
2763             }
2764             }
2765             }
2766 0 0       0 if (@matched) {
2767 0         0 push @glob, @matched;
2768             }
2769             }
2770 0 0       0 if ($fix_drive_relative_paths) {
2771 0         0 for my $glob (@glob) {
2772 0         0 $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
2773             }
2774             }
2775 0         0 return @glob;
2776             }
2777              
2778             #
2779             # EUC-JP parse line
2780             #
2781             sub _parse_line {
2782              
2783 0     0   0 my($line) = @_;
2784              
2785 0         0 $line .= ' ';
2786 0         0 my @piece = ();
2787 0         0 while ($line =~ /
2788             " ( (?>(?: [^\x8E\x8F\xA1-\xFE"] |[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] )* ) ) " (?>\s+) |
2789             ( (?>(?: [^\x8E\x8F\xA1-\xFE"\s]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] )* ) ) (?>\s+)
2790             /oxmsg
2791             ) {
2792 0 0       0 push @piece, defined($1) ? $1 : $2;
2793             }
2794 0         0 return @piece;
2795             }
2796              
2797             #
2798             # EUC-JP parse path
2799             #
2800             sub _parse_path {
2801              
2802 0     0   0 my($path,$pathsep) = @_;
2803              
2804 0         0 $path .= '/';
2805 0         0 my @subpath = ();
2806 0         0 while ($path =~ /
2807             ((?: [^\x8E\x8F\xA1-\xFE\/\\]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] )+?) [\/\\]
2808             /oxmsg
2809             ) {
2810 0         0 push @subpath, $1;
2811             }
2812              
2813 0         0 my $tail = pop @subpath;
2814 0         0 my $head = join $pathsep, @subpath;
2815 0         0 return $head, $tail;
2816             }
2817              
2818             #
2819             # via File::HomeDir::Windows 1.00
2820             #
2821             sub my_home_MSWin32 {
2822              
2823             # A lot of unix people and unix-derived tools rely on
2824             # the ability to overload HOME. We will support it too
2825             # so that they can replace raw HOME calls with File::HomeDir.
2826 0 0 0 0 0 0 if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
    0 0        
    0 0        
      0        
      0        
2827 0         0 return $ENV{'HOME'};
2828             }
2829              
2830             # Do we have a user profile?
2831             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
2832 0         0 return $ENV{'USERPROFILE'};
2833             }
2834              
2835             # Some Windows use something like $ENV{'HOME'}
2836             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
2837 0         0 return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
2838             }
2839              
2840 0         0 return undef;
2841             }
2842              
2843             #
2844             # via File::HomeDir::Unix 1.00
2845             #
2846             sub my_home {
2847 0     0 0 0 my $home;
2848              
2849 0 0 0     0 if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
    0 0        
2850 0         0 $home = $ENV{'HOME'};
2851             }
2852              
2853             # This is from the original code, but I'm guessing
2854             # it means "login directory" and exists on some Unixes.
2855             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
2856 0         0 $home = $ENV{'LOGDIR'};
2857             }
2858              
2859             ### More-desperate methods
2860              
2861             # Light desperation on any (Unixish) platform
2862             else {
2863 0         0 $home = CORE::eval q{ (getpwuid($<))[7] };
2864             }
2865              
2866             # On Unix in general, a non-existant home means "no home"
2867             # For example, "nobody"-like users might use /nonexistant
2868 0 0 0     0 if (defined $home and ! -d($home)) {
2869 0         0 $home = undef;
2870             }
2871 0         0 return $home;
2872             }
2873              
2874             #
2875             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
2876             #
2877             sub Eeucjp::PREMATCH {
2878 0 0   0 0 0 if (defined($&)) {
2879 0 0 0     0 if (defined($1) and (CORE::substr($&,-CORE::length($1),CORE::length($1)) eq $1)) {
2880 0         0 return CORE::substr($&,0,CORE::length($&)-CORE::length($1));
2881             }
2882             else {
2883 0         0 croak 'Use of "$`", $PREMATCH, and ${^PREMATCH} need to /( capture all )/ in regexp';
2884             }
2885             }
2886             else {
2887 0         0 return '';
2888             }
2889 0         0 return $`;
2890             }
2891              
2892             #
2893             # ${^MATCH}, $MATCH, $& the string that matched
2894             #
2895             sub Eeucjp::MATCH {
2896 0 0   0 0 0 if (defined($&)) {
2897 0 0       0 if (defined($1)) {
2898 0         0 return $1;
2899             }
2900             else {
2901 0         0 croak 'Use of "$&", $MATCH, and ${^MATCH} need to /( capture all )/ in regexp';
2902             }
2903             }
2904             else {
2905 0         0 return '';
2906             }
2907 0         0 return $&;
2908             }
2909              
2910             #
2911             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
2912             #
2913             sub Eeucjp::POSTMATCH {
2914 0     0 0 0 return $';
2915             }
2916              
2917             #
2918             # EUC-JP character to order (with parameter)
2919             #
2920             sub EUCJP::ord(;$) {
2921              
2922 0 0   0 1 0 local $_ = shift if @_;
2923              
2924 0 0       0 if (/\A ($q_char) /oxms) {
2925 0         0 my @ord = unpack 'C*', $1;
2926 0         0 my $ord = 0;
2927 0         0 while (my $o = shift @ord) {
2928 0         0 $ord = $ord * 0x100 + $o;
2929             }
2930 0         0 return $ord;
2931             }
2932             else {
2933 0         0 return CORE::ord $_;
2934             }
2935             }
2936              
2937             #
2938             # EUC-JP character to order (without parameter)
2939             #
2940             sub EUCJP::ord_() {
2941              
2942 0 0   0 0 0 if (/\A ($q_char) /oxms) {
2943 0         0 my @ord = unpack 'C*', $1;
2944 0         0 my $ord = 0;
2945 0         0 while (my $o = shift @ord) {
2946 0         0 $ord = $ord * 0x100 + $o;
2947             }
2948 0         0 return $ord;
2949             }
2950             else {
2951 0         0 return CORE::ord $_;
2952             }
2953             }
2954              
2955             #
2956             # EUC-JP reverse
2957             #
2958             sub EUCJP::reverse(@) {
2959              
2960 0 0   0 0 0 if (wantarray) {
2961 0         0 return CORE::reverse @_;
2962             }
2963             else {
2964              
2965             # One of us once cornered Larry in an elevator and asked him what
2966             # problem he was solving with this, but he looked as far off into
2967             # the distance as he could in an elevator and said, "It seemed like
2968             # a good idea at the time."
2969              
2970 0         0 return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
2971             }
2972             }
2973              
2974             #
2975             # EUC-JP getc (with parameter, without parameter)
2976             #
2977             sub EUCJP::getc(;*@) {
2978              
2979 0     0 0 0 my($package) = caller;
2980 0 0       0 my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
2981 0 0 0     0 croak 'Too many arguments for EUCJP::getc' if @_ and not wantarray;
2982              
2983 0         0 my @length = sort { $a <=> $b } keys %range_tr;
  0         0  
2984 0         0 my $getc = '';
2985 0         0 for my $length ($length[0] .. $length[-1]) {
2986 0         0 $getc .= CORE::getc($fh);
2987 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
2988 0 0       0 if ($getc =~ /\A ${Eeucjp::dot_s} \z/oxms) {
2989 0 0       0 return wantarray ? ($getc,@_) : $getc;
2990             }
2991             }
2992             }
2993 0 0       0 return wantarray ? ($getc,@_) : $getc;
2994             }
2995              
2996             #
2997             # EUC-JP length by character
2998             #
2999             sub EUCJP::length(;$) {
3000              
3001 0 0   0 1 0 local $_ = shift if @_;
3002              
3003 0         0 local @_ = /\G ($q_char) /oxmsg;
3004 0         0 return scalar @_;
3005             }
3006              
3007             #
3008             # EUC-JP substr by character
3009             #
3010             BEGIN {
3011              
3012             # P.232 The lvalue Attribute
3013             # in Chapter 6: Subroutines
3014             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3015              
3016             # P.336 The lvalue Attribute
3017             # in Chapter 7: Subroutines
3018             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3019              
3020             # P.144 8.4 Lvalue subroutines
3021             # in Chapter 8: perlsub: Perl subroutines
3022             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
3023              
3024 325 50 0 325 1 149181 CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
  0 0   0   0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
3025             # vv----------------------*******
3026             sub EUCJP::substr($$;$$) %s {
3027              
3028             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
3029              
3030             # If the substring is beyond either end of the string, substr() returns the undefined
3031             # value and produces a warning. When used as an lvalue, specifying a substring that
3032             # is entirely outside the string raises an exception.
3033             # http://perldoc.perl.org/functions/substr.html
3034              
3035             # A return with no argument returns the scalar value undef in scalar context,
3036             # an empty list () in list context, and (naturally) nothing at all in void
3037             # context.
3038              
3039             my $offset = $_[1];
3040             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
3041             return;
3042             }
3043              
3044             # substr($string,$offset,$length,$replacement)
3045             if (@_ == 4) {
3046             my(undef,undef,$length,$replacement) = @_;
3047             my $substr = join '', splice(@char, $offset, $length, $replacement);
3048             $_[0] = join '', @char;
3049              
3050             # return $substr; this doesn't work, don't say "return"
3051             $substr;
3052             }
3053              
3054             # substr($string,$offset,$length)
3055             elsif (@_ == 3) {
3056             my(undef,undef,$length) = @_;
3057             my $octet_offset = 0;
3058             my $octet_length = 0;
3059             if ($offset == 0) {
3060             $octet_offset = 0;
3061             }
3062             elsif ($offset > 0) {
3063             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
3064             }
3065             else {
3066             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
3067             }
3068             if ($length == 0) {
3069             $octet_length = 0;
3070             }
3071             elsif ($length > 0) {
3072             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
3073             }
3074             else {
3075             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
3076             }
3077             CORE::substr($_[0], $octet_offset, $octet_length);
3078             }
3079              
3080             # substr($string,$offset)
3081             else {
3082             my $octet_offset = 0;
3083             if ($offset == 0) {
3084             $octet_offset = 0;
3085             }
3086             elsif ($offset > 0) {
3087             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
3088             }
3089             else {
3090             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
3091             }
3092             CORE::substr($_[0], $octet_offset);
3093             }
3094             }
3095             END
3096             }
3097              
3098             #
3099             # EUC-JP index by character
3100             #
3101             sub EUCJP::index($$;$) {
3102              
3103 0     0 1 0 my $index;
3104 0 0       0 if (@_ == 3) {
3105 0         0 $index = Eeucjp::index($_[0], $_[1], CORE::length(EUCJP::substr($_[0], 0, $_[2])));
3106             }
3107             else {
3108 0         0 $index = Eeucjp::index($_[0], $_[1]);
3109             }
3110              
3111 0 0       0 if ($index == -1) {
3112 0         0 return -1;
3113             }
3114             else {
3115 0         0 return EUCJP::length(CORE::substr $_[0], 0, $index);
3116             }
3117             }
3118              
3119             #
3120             # EUC-JP rindex by character
3121             #
3122             sub EUCJP::rindex($$;$) {
3123              
3124 0     0 1 0 my $rindex;
3125 0 0       0 if (@_ == 3) {
3126 0         0 $rindex = Eeucjp::rindex($_[0], $_[1], CORE::length(EUCJP::substr($_[0], 0, $_[2])));
3127             }
3128             else {
3129 0         0 $rindex = Eeucjp::rindex($_[0], $_[1]);
3130             }
3131              
3132 0 0       0 if ($rindex == -1) {
3133 0         0 return -1;
3134             }
3135             else {
3136 0         0 return EUCJP::length(CORE::substr $_[0], 0, $rindex);
3137             }
3138             }
3139              
3140             # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
3141             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
3142 325     325   21345 BEGIN { CORE::eval q{ use vars qw($slash) } } $slash = 'm//';
  325     325   2094  
  325         479  
  325         17968  
3143              
3144             # ord() to ord() or EUCJP::ord()
3145 325     325   15783 BEGIN { CORE::eval q{ use vars qw($function_ord) } } $function_ord = 'ord';
  325     325   1318  
  325         469  
  325         14234  
3146              
3147             # ord to ord or EUCJP::ord_
3148 325     325   15580 BEGIN { CORE::eval q{ use vars qw($function_ord_) } } $function_ord_ = 'ord';
  325     325   1311  
  325         443  
  325         13637  
3149              
3150             # reverse to reverse or EUCJP::reverse
3151 325     325   15568 BEGIN { CORE::eval q{ use vars qw($function_reverse) } } $function_reverse = 'reverse';
  325     325   1285  
  325         1178  
  325         16167  
3152              
3153             # getc to getc or EUCJP::getc
3154 325     325   17136 BEGIN { CORE::eval q{ use vars qw($function_getc) } } $function_getc = 'getc';
  325     325   2597  
  325         1217  
  325         26361  
3155              
3156             # P.1023 Appendix W.9 Multibyte Anchoring
3157             # of ISBN 1-56592-224-7 CJKV Information Processing
3158              
3159             my $anchor = '';
3160             $anchor = q{${Eeucjp::anchor}};
3161              
3162 325     325   27196 BEGIN { CORE::eval q{ use vars qw($nest) } }
  325     325   2487  
  325         1073  
  325         11282646  
3163              
3164             # regexp of nested parens in qqXX
3165              
3166             # P.340 Matching Nested Constructs with Embedded Code
3167             # in Chapter 7: Perl
3168             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3169              
3170             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
3171             [^\x8E\x8F\xA1-\xFE\\()] |
3172             \( (?{$nest++}) |
3173             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3174             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3175             \\ [^\x8E\x8F\xA1-\xFEc] |
3176             \\c[\x40-\x5F] |
3177             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3178             [\x00-\xFF]
3179             }xms;
3180              
3181             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
3182             [^\x8E\x8F\xA1-\xFE\\{}] |
3183             \{ (?{$nest++}) |
3184             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3185             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3186             \\ [^\x8E\x8F\xA1-\xFEc] |
3187             \\c[\x40-\x5F] |
3188             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3189             [\x00-\xFF]
3190             }xms;
3191              
3192             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
3193             [^\x8E\x8F\xA1-\xFE\\\[\]] |
3194             \[ (?{$nest++}) |
3195             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3196             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3197             \\ [^\x8E\x8F\xA1-\xFEc] |
3198             \\c[\x40-\x5F] |
3199             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3200             [\x00-\xFF]
3201             }xms;
3202              
3203             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
3204             [^\x8E\x8F\xA1-\xFE\\<>] |
3205             \< (?{$nest++}) |
3206             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3207             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3208             \\ [^\x8E\x8F\xA1-\xFEc] |
3209             \\c[\x40-\x5F] |
3210             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3211             [\x00-\xFF]
3212             }xms;
3213              
3214             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
3215             (?: ::)? (?:
3216             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
3217             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
3218             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
3219             ))
3220             }xms;
3221              
3222             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
3223             (?: ::)? (?:
3224             (?>[0-9]+) |
3225             [^\x8E\x8F\xA1-\xFEa-zA-Z_0-9\[\]] |
3226             ^[A-Z] |
3227             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
3228             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
3229             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
3230             ))
3231             }xms;
3232              
3233             my $qq_substr = qr{(?> Char::substr | EUCJP::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
3234             }xms;
3235              
3236             # regexp of nested parens in qXX
3237             my $q_paren = qr{(?{local $nest=0}) (?>(?:
3238             [^\x8E\x8F\xA1-\xFE()] |
3239             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3240             \( (?{$nest++}) |
3241             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3242             [\x00-\xFF]
3243             }xms;
3244              
3245             my $q_brace = qr{(?{local $nest=0}) (?>(?:
3246             [^\x8E\x8F\xA1-\xFE\{\}] |
3247             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3248             \{ (?{$nest++}) |
3249             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3250             [\x00-\xFF]
3251             }xms;
3252              
3253             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
3254             [^\x8E\x8F\xA1-\xFE\[\]] |
3255             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3256             \[ (?{$nest++}) |
3257             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3258             [\x00-\xFF]
3259             }xms;
3260              
3261             my $q_angle = qr{(?{local $nest=0}) (?>(?:
3262             [^\x8E\x8F\xA1-\xFE<>] |
3263             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3264             \< (?{$nest++}) |
3265             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3266             [\x00-\xFF]
3267             }xms;
3268              
3269             my $matched = '';
3270             my $s_matched = '';
3271             $matched = q{$Eeucjp::matched};
3272             $s_matched = q{ Eeucjp::s_matched();};
3273              
3274             my $tr_variable = ''; # variable of tr///
3275             my $sub_variable = ''; # variable of s///
3276             my $bind_operator = ''; # =~ or !~
3277              
3278             my @heredoc = (); # here document
3279             my @heredoc_delimiter = ();
3280             my $here_script = ''; # here script
3281              
3282             #
3283             # escape EUC-JP script
3284             #
3285             sub EUCJP::escape(;$) {
3286 325 50   325 0 2457 local($_) = $_[0] if @_;
3287              
3288             # P.359 The Study Function
3289             # in Chapter 7: Perl
3290             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3291              
3292 325         1134 study $_; # Yes, I studied study yesterday.
3293              
3294             # while all script
3295              
3296             # 6.14. Matching from Where the Last Pattern Left Off
3297             # in Chapter 6. Pattern Matching
3298             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
3299             # (and so on)
3300              
3301             # one member of Tag-team
3302             #
3303             # P.128 Start of match (or end of previous match): \G
3304             # P.130 Advanced Use of \G with Perl
3305             # in Chapter 3: Overview of Regular Expression Features and Flavors
3306             # P.255 Use leading anchors
3307             # P.256 Expose ^ and \G at the front expressions
3308             # in Chapter 6: Crafting an Efficient Expression
3309             # P.315 "Tag-team" matching with /gc
3310             # in Chapter 7: Perl
3311             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3312              
3313 325         1147 my $e_script = '';
3314 325         3169 while (not /\G \z/oxgc) { # member
3315 128029         137943 $e_script .= EUCJP::escape_token();
3316             }
3317              
3318 325         3431 return $e_script;
3319             }
3320              
3321             #
3322             # escape EUC-JP token of script
3323             #
3324             sub EUCJP::escape_token {
3325              
3326             # \n output here document
3327              
3328 128029     128029 0 92822 my $ignore_modules = join('|', qw(
3329             utf8
3330             bytes
3331             charnames
3332             I18N::Japanese
3333             I18N::Collate
3334             I18N::JExt
3335             File::DosGlob
3336             Wild
3337             Wildcard
3338             Japanese
3339             ));
3340              
3341             # another member of Tag-team
3342             #
3343             # P.315 "Tag-team" matching with /gc
3344             # in Chapter 7: Perl
3345             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3346              
3347 128029 100 100     8206474 if (/\G ( \n ) /oxgc) { # another member (and so on)
    100 100        
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    100          
    100          
    50          
3348 21919         17836 my $heredoc = '';
3349 21919 100       35135 if (scalar(@heredoc_delimiter) >= 1) {
3350 167         168 $slash = 'm//';
3351              
3352 167         265 $heredoc = join '', @heredoc;
3353 167         252 @heredoc = ();
3354              
3355             # skip here document
3356 167         252 for my $heredoc_delimiter (@heredoc_delimiter) {
3357 175         1066 /\G .*? \n $heredoc_delimiter \n/xmsgc;
3358             }
3359 167         211 @heredoc_delimiter = ();
3360              
3361 167         179 $here_script = '';
3362             }
3363 21919         53637 return "\n" . $heredoc;
3364             }
3365              
3366             # ignore space, comment
3367 30322         74118 elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
3368              
3369             # if (, elsif (, unless (, while (, until (, given (, and when (
3370              
3371             # given, when
3372              
3373             # P.225 The given Statement
3374             # in Chapter 15: Smart Matching and given-when
3375             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3376              
3377             # P.133 The given Statement
3378             # in Chapter 4: Statements and Declarations
3379             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3380              
3381             elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
3382 2594         2854 $slash = 'm//';
3383 2594         6993 return $1;
3384             }
3385              
3386             # scalar variable ($scalar = ...) =~ tr///;
3387             # scalar variable ($scalar = ...) =~ s///;
3388              
3389             # state
3390              
3391             # P.68 Persistent, Private Variables
3392             # in Chapter 4: Subroutines
3393             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3394              
3395             # P.160 Persistent Lexically Scoped Variables: state
3396             # in Chapter 4: Statements and Declarations
3397             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3398              
3399             # (and so on)
3400              
3401             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
3402 138         225 my $e_string = e_string($1);
3403              
3404 138 50       4411 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
    50          
3405 0         0 $tr_variable = $e_string . e_string($1);
3406 0         0 $bind_operator = $2;
3407 0         0 $slash = 'm//';
3408 0         0 return '';
3409             }
3410             elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3411 0         0 $sub_variable = $e_string . e_string($1);
3412 0         0 $bind_operator = $2;
3413 0         0 $slash = 'm//';
3414 0         0 return '';
3415             }
3416             else {
3417 138         145 $slash = 'div';
3418 138         425 return $e_string;
3419             }
3420             }
3421              
3422             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
3423             elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
3424 4         8 $slash = 'div';
3425 4         11 return q{Eeucjp::PREMATCH()};
3426             }
3427              
3428             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
3429             elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
3430 28         42 $slash = 'div';
3431 28         78 return q{Eeucjp::MATCH()};
3432             }
3433              
3434             # $', ${'} --> $', ${'}
3435             elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
3436 1         1 $slash = 'div';
3437 1         3 return $1;
3438             }
3439              
3440             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
3441             elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
3442 3         6 $slash = 'div';
3443 3         14 return q{Eeucjp::POSTMATCH()};
3444             }
3445              
3446             # scalar variable $scalar =~ tr///;
3447             # scalar variable $scalar =~ s///;
3448             # substr() =~ tr///;
3449             # substr() =~ s///;
3450             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
3451 2324         3829 my $scalar = e_string($1);
3452              
3453 2324 100       7644 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
    100          
3454 9         11 $tr_variable = $scalar;
3455 9         11 $bind_operator = $1;
3456 9         9 $slash = 'm//';
3457 9         21 return '';
3458             }
3459             elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3460 119         173 $sub_variable = $scalar;
3461 119         186 $bind_operator = $1;
3462 119         141 $slash = 'm//';
3463 119         325 return '';
3464             }
3465             else {
3466 2196         2121 $slash = 'div';
3467 2196         5048 return $scalar;
3468             }
3469             }
3470              
3471             # end of statement
3472             elsif (/\G ( [,;] ) /oxgc) {
3473 7946         7615 $slash = 'm//';
3474              
3475             # clear tr/// variable
3476 7946         6327 $tr_variable = '';
3477              
3478             # clear s/// variable
3479 7946         5819 $sub_variable = '';
3480              
3481 7946         5633 $bind_operator = '';
3482              
3483 7946         21948 return $1;
3484             }
3485              
3486             # bareword
3487             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
3488 0         0 return $1;
3489             }
3490              
3491             # $0 --> $0
3492             elsif (/\G ( \$ 0 ) /oxmsgc) {
3493 2         5 $slash = 'div';
3494 2         10 return $1;
3495             }
3496             elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
3497 0         0 $slash = 'div';
3498 0         0 return $1;
3499             }
3500              
3501             # $$ --> $$
3502             elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
3503 1         2 $slash = 'div';
3504 1         3 return $1;
3505             }
3506              
3507             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
3508             # $1, $2, $3 --> $1, $2, $3 otherwise
3509             elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
3510 129         167 $slash = 'div';
3511 129         245 return e_capture($1);
3512             }
3513             elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
3514 0         0 $slash = 'div';
3515 0         0 return e_capture($1);
3516             }
3517              
3518             # $$foo[ ... ] --> $ $foo->[ ... ]
3519             elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
3520 0         0 $slash = 'div';
3521 0         0 return e_capture($1.'->'.$2);
3522             }
3523              
3524             # $$foo{ ... } --> $ $foo->{ ... }
3525             elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
3526 0         0 $slash = 'div';
3527 0         0 return e_capture($1.'->'.$2);
3528             }
3529              
3530             # $$foo
3531             elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
3532 0         0 $slash = 'div';
3533 0         0 return e_capture($1);
3534             }
3535              
3536             # ${ foo }
3537             elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
3538 0         0 $slash = 'div';
3539 0         0 return '${' . $1 . '}';
3540             }
3541              
3542             # ${ ... }
3543             elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
3544 0         0 $slash = 'div';
3545 0         0 return e_capture($1);
3546             }
3547              
3548             # variable or function
3549             # $ @ % & * $ #
3550             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) {
3551 149         161 $slash = 'div';
3552 149         401 return $1;
3553             }
3554             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
3555             # $ @ # \ ' " / ? ( ) [ ] < >
3556             elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
3557 89         133 $slash = 'div';
3558 89         262 return $1;
3559             }
3560              
3561             # while ()
3562             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
3563 0         0 return $1;
3564             }
3565              
3566             # while () --- glob
3567              
3568             # avoid "Error: Runtime exception" of perl version 5.005_03
3569              
3570             elsif (/\G \b while (?>\s*) \( (?>\s*) < ((?:[^\x8E\x8F\xA1-\xFE>\0\a\e\f\n\r\t]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])+?) > (?>\s*) \) \b /oxgc) {
3571 0         0 return 'while ($_ = Eeucjp::glob("' . $1 . '"))';
3572             }
3573              
3574             # while (glob)
3575             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
3576 0         0 return 'while ($_ = Eeucjp::glob_)';
3577             }
3578              
3579             # while (glob(WILDCARD))
3580             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
3581 0         0 return 'while ($_ = Eeucjp::glob';
3582             }
3583              
3584             # doit if, doit unless, doit while, doit until, doit for, doit when
3585 418         618 elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
  418         1346  
3586              
3587             # subroutines of package Eeucjp
3588 19         28 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  19         80  
3589 0         0 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
3590 13         11 elsif (/\G \b EUCJP::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  13         28  
3591 0         0 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  0         0  
3592 114         131 elsif (/\G \b EUCJP::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval EUCJP::escape'; }
  114         313  
3593 2         4 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         5  
3594 2         3 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::chop'; }
  2         5  
3595 2         3 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  2         5  
3596 0         0 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  0         0  
3597 2         3 elsif (/\G \b EUCJP::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'EUCJP::index'; }
  2         5  
3598 2         2 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::index'; }
  2         4  
3599 2         2 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  2         6  
3600 0         0 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  0         0  
3601 2         4 elsif (/\G \b EUCJP::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'EUCJP::rindex'; }
  2         12  
3602 2         3 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::rindex'; }
  2         7  
3603 1         3 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::lc'; }
  1         4  
3604 0         0 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::lcfirst'; }
  0         0  
3605 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::uc'; }
  0         0  
3606 0         0 elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::ucfirst'; }
  0         0  
3607 3         4 elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::fc'; }
  3         7  
3608              
3609             # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
3610 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
3611 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3612 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3613 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3614 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3615 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3616 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  
3617              
3618 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
3619 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3620 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3621 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3622 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3623 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3624 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3625              
3626             elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
3627 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
3628 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
3629 0         0 elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
  0         0  
3630 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  0         0  
3631              
3632 2         3 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  2         6  
3633 2         3 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         5  
3634 36         42 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::chr'; }
  36         84  
3635 2         3 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  2         5  
3636 2         3 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  2         7  
3637 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::glob'; }
  0         0  
3638 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::lc_'; }
  0         0  
3639 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::lcfirst_'; }
  0         0  
3640 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::uc_'; }
  0         0  
3641 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::ucfirst_'; }
  0         0  
3642 0         0 elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::fc_'; }
  0         0  
3643 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
3644              
3645 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
3646 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
3647 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::chr_'; }
  0         0  
3648 0         0 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3649 2         6 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  2         5  
3650 0         0 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::glob_'; }
  0         0  
3651 4         8 elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
  4         17  
3652 8         14 elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
  8         23  
3653             # split
3654             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
3655 180         255 $slash = 'm//';
3656              
3657 180         214 my $e = '';
3658 180         564 while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
3659 177         581 $e .= $1;
3660             }
3661              
3662             # end of split
3663 180 100       13984 if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Eeucjp::split' . $e; }
  3 100       13  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
3664              
3665             # split scalar value
3666 1         5 elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Eeucjp::split' . $e . e_string($1); }
3667              
3668             # split literal space
3669 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Eeucjp::split' . $e . qq {qq$1 $2}; }
3670 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3671 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3672 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3673 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3674 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3675 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Eeucjp::split' . $e . qq {q$1 $2}; }
3676 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3677 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3678 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3679 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3680 0         0 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3681 13         53 elsif (/\G ' [ ] ' /oxgc) { return 'Eeucjp::split' . $e . qq {' '}; }
3682 2         11 elsif (/\G " [ ] " /oxgc) { return 'Eeucjp::split' . $e . qq {" "}; }
3683              
3684             # split qq//
3685             elsif (/\G \b (qq) \b /oxgc) {
3686 0 0       0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
  0         0  
3687             else {
3688 0         0 while (not /\G \z/oxgc) {
3689 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3690 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
3691 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
3692 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
3693 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
3694 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
3695 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
3696             }
3697 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3698             }
3699             }
3700              
3701             # split qr//
3702             elsif (/\G \b (qr) \b /oxgc) {
3703 36 50       719 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
  0         0  
3704             else {
3705 36         102 while (not /\G \z/oxgc) {
3706 36 50       5300 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    100          
    50          
    50          
3707 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
3708 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
3709 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
3710 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
3711 12         51 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
3712 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
3713 24         100 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
3714             }
3715 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3716             }
3717             }
3718              
3719             # split q//
3720             elsif (/\G \b (q) \b /oxgc) {
3721 0 0       0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
  0         0  
3722             else {
3723 0         0 while (not /\G \z/oxgc) {
3724 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3725 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
3726 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
3727 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
3728 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
3729 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
3730 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
3731             }
3732 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3733             }
3734             }
3735              
3736             # split m//
3737             elsif (/\G \b (m) \b /oxgc) {
3738 48 50       838 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
  0         0  
3739             else {
3740 48         134 while (not /\G \z/oxgc) {
3741 48 50       5937 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    100          
    50          
    50          
3742 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
3743 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
3744 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
3745 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
3746 12         40 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
3747 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
3748 36         144 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
3749             }
3750 0         0 die __FILE__, ": Search pattern not terminated\n";
3751             }
3752             }
3753              
3754             # split ''
3755             elsif (/\G (\') /oxgc) {
3756 0         0 my $q_string = '';
3757 0         0 while (not /\G \z/oxgc) {
3758 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
3759 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
3760 0         0 elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
3761 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3762             }
3763 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3764             }
3765              
3766             # split ""
3767             elsif (/\G (\") /oxgc) {
3768 0         0 my $qq_string = '';
3769 0         0 while (not /\G \z/oxgc) {
3770 0 0       0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
3771 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
3772 0         0 elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
3773 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
3774             }
3775 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3776             }
3777              
3778             # split //
3779             elsif (/\G (\/) /oxgc) {
3780 77         112 my $regexp = '';
3781 77         199 while (not /\G \z/oxgc) {
3782 458 50       2050 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
  0 50       0  
    100          
    50          
3783 0         0 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
3784 77         284 elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
3785 381         705 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
3786             }
3787 0         0 die __FILE__, ": Search pattern not terminated\n";
3788             }
3789             }
3790              
3791             # tr/// or y///
3792              
3793             # about [cdsrbB]* (/B modifier)
3794             #
3795             # P.559 appendix C
3796             # of ISBN 4-89052-384-7 Programming perl
3797             # (Japanese title is: Perl puroguramingu)
3798              
3799             elsif (/\G \b ( tr | y ) \b /oxgc) {
3800 11         16 my $ope = $1;
3801              
3802             # $1 $2 $3 $4 $5 $6
3803 11 50       164 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
3804 0         0 my @tr = ($tr_variable,$2);
3805 0         0 return e_tr(@tr,'',$4,$6);
3806             }
3807             else {
3808 11         11 my $e = '';
3809 11         22 while (not /\G \z/oxgc) {
3810 11 50       913 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    50          
3811             elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
3812 0         0 my @tr = ($tr_variable,$2);
3813 0         0 while (not /\G \z/oxgc) {
3814 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
3815 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
3816 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
3817 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
3818 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
3819 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
3820             }
3821 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
3822             }
3823             elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
3824 0         0 my @tr = ($tr_variable,$2);
3825 0         0 while (not /\G \z/oxgc) {
3826 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
3827 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
3828 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
3829 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
3830 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
3831 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
3832             }
3833 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
3834             }
3835             elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
3836 0         0 my @tr = ($tr_variable,$2);
3837 0         0 while (not /\G \z/oxgc) {
3838 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
3839 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
3840 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
3841 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
3842 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
3843 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
3844             }
3845 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
3846             }
3847             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
3848 0         0 my @tr = ($tr_variable,$2);
3849 0         0 while (not /\G \z/oxgc) {
3850 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
3851 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
3852 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
3853 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
3854 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
3855 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
3856             }
3857 0         0 die __FILE__, ": Transliteration replacement not terminated\n";
3858             }
3859             # $1 $2 $3 $4 $5 $6
3860             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
3861 11         32 my @tr = ($tr_variable,$2);
3862 11         24 return e_tr(@tr,'',$4,$6);
3863             }
3864             }
3865 0         0 die __FILE__, ": Transliteration pattern not terminated\n";
3866             }
3867             }
3868              
3869             # qq//
3870             elsif (/\G \b (qq) \b /oxgc) {
3871 4147         6127 my $ope = $1;
3872              
3873             # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
3874 4147 100       5994 if (/\G (\#) /oxgc) { # qq# #
3875 40         31 my $qq_string = '';
3876 40         70 while (not /\G \z/oxgc) {
3877 1948 100       4876 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  80 50       148  
    100          
    50          
3878 0         0 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
3879 40         66 elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
3880 1828         2798 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3881             }
3882 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3883             }
3884              
3885             else {
3886 4107         3666 my $e = '';
3887 4107         7968 while (not /\G \z/oxgc) {
3888 4107 50       13149 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    100          
    50          
    100          
    50          
3889              
3890             # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
3891             elsif (/\G (\() /oxgc) { # qq ( )
3892 0         0 my $qq_string = '';
3893 0         0 local $nest = 1;
3894 0         0 while (not /\G \z/oxgc) {
3895 0 0       0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
    0          
3896 0         0 elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
3897 0         0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3898             elsif (/\G (\)) /oxgc) {
3899 0 0       0 if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
  0         0  
3900 0         0 else { $qq_string .= $1; }
3901             }
3902 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3903             }
3904 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3905             }
3906              
3907             # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
3908             elsif (/\G (\{) /oxgc) { # qq { }
3909 4049         3454 my $qq_string = '';
3910 4049         4406 local $nest = 1;
3911 4049         6899 while (not /\G \z/oxgc) {
3912 170977 100       526028 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  708 50       1220  
    100          
    100          
    50          
3913 0         0 elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
3914 1334         1339 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  1334         2029  
3915             elsif (/\G (\}) /oxgc) {
3916 5383 100       6438 if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
  4049         6861  
3917 1334         2508 else { $qq_string .= $1; }
3918             }
3919 163552         260366 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3920             }
3921 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3922             }
3923              
3924             # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
3925             elsif (/\G (\[) /oxgc) { # qq [ ]
3926 0         0 my $qq_string = '';
3927 0         0 local $nest = 1;
3928 0         0 while (not /\G \z/oxgc) {
3929 0 0       0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
    0          
3930 0         0 elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
3931 0         0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3932             elsif (/\G (\]) /oxgc) {
3933 0 0       0 if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
  0         0  
3934 0         0 else { $qq_string .= $1; }
3935             }
3936 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3937             }
3938 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3939             }
3940              
3941             # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
3942             elsif (/\G (\<) /oxgc) { # qq < >
3943 38         44 my $qq_string = '';
3944 38         58 local $nest = 1;
3945 38         168 while (not /\G \z/oxgc) {
3946 1418 100       5206 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  22 50       48  
    50          
    100          
    50          
3947 0         0 elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
3948 0         0 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3949             elsif (/\G (\>) /oxgc) {
3950 38 50       92 if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
  38         82  
3951 0         0 else { $qq_string .= $1; }
3952             }
3953 1358         2319 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3954             }
3955 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3956             }
3957              
3958             # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
3959             elsif (/\G (\S) /oxgc) { # qq * *
3960 20         20 my $delimiter = $1;
3961 20         13 my $qq_string = '';
3962 20         34 while (not /\G \z/oxgc) {
3963 840 50       2181 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 50       0  
    100          
    50          
3964 0         0 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
3965 20         32 elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
3966 820         1295 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3967             }
3968 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3969             }
3970             }
3971 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3972             }
3973             }
3974              
3975             # qr//
3976             elsif (/\G \b (qr) \b /oxgc) {
3977 60         95 my $ope = $1;
3978 60 50       562 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
3979 0         0 return e_qr($ope,$1,$3,$2,$4);
3980             }
3981             else {
3982 60         62 my $e = '';
3983 60         137 while (not /\G \z/oxgc) {
3984 60 50       3836 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    100          
    50          
    50          
    100          
    50          
    50          
3985 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
3986 1         4 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
3987 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
3988 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
3989 14         52 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
3990 0         0 elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
3991 45         105 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
3992             }
3993 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3994             }
3995             }
3996              
3997             # qw//
3998             elsif (/\G \b (qw) \b /oxgc) {
3999 34         69 my $ope = $1;
4000 34 50       167 if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
4001 0         0 return e_qw($ope,$1,$3,$2);
4002             }
4003             else {
4004 34         44 my $e = '';
4005 34         93 while (not /\G \z/oxgc) {
4006 34 50       180 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4007              
4008 34         93 elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
4009 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
4010              
4011 0         0 elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
4012 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
4013              
4014 0         0 elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
4015 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
4016              
4017 0         0 elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
4018 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
4019              
4020 0         0 elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
4021 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
4022             }
4023 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4024             }
4025             }
4026              
4027             # qx//
4028             elsif (/\G \b (qx) \b /oxgc) {
4029 2         4 my $ope = $1;
4030 2 50       40 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4031 0         0 return e_qq($ope,$1,$3,$2);
4032             }
4033             else {
4034 2         2 my $e = '';
4035 2         5 while (not /\G \z/oxgc) {
4036 2 50       111 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    0          
    0          
    0          
    0          
4037 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
4038 2         7 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
4039 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
4040 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
4041 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
4042 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
4043             }
4044 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4045             }
4046             }
4047              
4048             # q//
4049             elsif (/\G \b (q) \b /oxgc) {
4050 385         890 my $ope = $1;
4051              
4052             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
4053              
4054             # avoid "Error: Runtime exception" of perl version 5.005_03
4055             # (and so on)
4056              
4057 385 50       1074 if (/\G (\#) /oxgc) { # q# #
4058 0         0 my $q_string = '';
4059 0         0 while (not /\G \z/oxgc) {
4060 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
4061 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
4062 0         0 elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
4063 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4064             }
4065 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4066             }
4067              
4068             else {
4069 385         638 my $e = '';
4070 385         1283 while (not /\G \z/oxgc) {
4071 385 50       2622 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    100          
    50          
    100          
    50          
4072              
4073             # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
4074             elsif (/\G (\() /oxgc) { # q ( )
4075 0         0 my $q_string = '';
4076 0         0 local $nest = 1;
4077 0         0 while (not /\G \z/oxgc) {
4078 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
4079 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
4080 0         0 elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
4081 0         0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  0         0  
4082             elsif (/\G (\)) /oxgc) {
4083 0 0       0 if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
  0         0  
4084 0         0 else { $q_string .= $1; }
4085             }
4086 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4087             }
4088 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4089             }
4090              
4091             # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
4092             elsif (/\G (\{) /oxgc) { # q { }
4093 379         603 my $q_string = '';
4094 379         671 local $nest = 1;
4095 379         1159 while (not /\G \z/oxgc) {
4096 4974 50       26708 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 50       0  
    50          
    100          
    100          
    50          
4097 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
4098 0         0 elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
4099 114         154 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  114         188  
4100             elsif (/\G (\}) /oxgc) {
4101 493 100       981 if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
  379         1282  
4102 114         228 else { $q_string .= $1; }
4103             }
4104 4367         7695 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4105             }
4106 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4107             }
4108              
4109             # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
4110             elsif (/\G (\[) /oxgc) { # q [ ]
4111 0         0 my $q_string = '';
4112 0         0 local $nest = 1;
4113 0         0 while (not /\G \z/oxgc) {
4114 0 0       0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
4115 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
4116 0         0 elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
4117 0         0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
4118             elsif (/\G (\]) /oxgc) {
4119 0 0       0 if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
  0         0  
4120 0         0 else { $q_string .= $1; }
4121             }
4122 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4123             }
4124 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4125             }
4126              
4127             # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
4128             elsif (/\G (\<) /oxgc) { # q < >
4129 5         8 my $q_string = '';
4130 5         9 local $nest = 1;
4131 5         18 while (not /\G \z/oxgc) {
4132 82 50       440 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 50       0  
    50          
    50          
    100          
    50          
4133 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
4134 0         0 elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
4135 0         0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
4136             elsif (/\G (\>) /oxgc) {
4137 5 50       12 if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
  5         19  
4138 0         0 else { $q_string .= $1; }
4139             }
4140 77         123 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4141             }
4142 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4143             }
4144              
4145             # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
4146             elsif (/\G (\S) /oxgc) { # q * *
4147 1         2 my $delimiter = $1;
4148 1         1 my $q_string = '';
4149 1         4 while (not /\G \z/oxgc) {
4150 14 50       74 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  0 50       0  
    100          
    50          
4151 0         0 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
4152 1         3 elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
4153 13         25 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4154             }
4155 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4156             }
4157             }
4158 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4159             }
4160             }
4161              
4162             # m//
4163             elsif (/\G \b (m) \b /oxgc) {
4164 305         494 my $ope = $1;
4165 305 50       2690 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
4166 0         0 return e_qr($ope,$1,$3,$2,$4);
4167             }
4168             else {
4169 305         339 my $e = '';
4170 305         717 while (not /\G \z/oxgc) {
4171 305 50       21578 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
4172 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
4173 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
4174 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
4175 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
4176 30         77 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
4177 25         61 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
4178 0         0 elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
4179 250         631 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
4180             }
4181 0         0 die __FILE__, ": Search pattern not terminated\n";
4182             }
4183             }
4184              
4185             # s///
4186              
4187             # about [cegimosxpradlunbB]* (/cg modifier)
4188             #
4189             # P.67 Pattern-Matching Operators
4190             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
4191              
4192             elsif (/\G \b (s) \b /oxgc) {
4193 156         330 my $ope = $1;
4194              
4195             # $1 $2 $3 $4 $5 $6
4196 156 100       4518 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
4197 1         6 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4198             }
4199             else {
4200 155         208 my $e = '';
4201 155         469 while (not /\G \z/oxgc) {
4202 155 50       28936 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 50       0  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
4203             elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
4204 0         0 my @s = ($1,$2,$3);
4205 0         0 while (not /\G \z/oxgc) {
4206 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4207             # $1 $2 $3 $4
4208 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4209 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4210 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4211 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4212 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4213 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4214 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4215 0         0 elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4216 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4217             }
4218 0         0 die __FILE__, ": Substitution replacement not terminated\n";
4219             }
4220             elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
4221 0         0 my @s = ($1,$2,$3);
4222 0         0 while (not /\G \z/oxgc) {
4223 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4224             # $1 $2 $3 $4
4225 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4226 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4227 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4228 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4229 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4230 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4231 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4232 0         0 elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4233 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4234             }
4235 0         0 die __FILE__, ": Substitution replacement not terminated\n";
4236             }
4237             elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
4238 0         0 my @s = ($1,$2,$3);
4239 0         0 while (not /\G \z/oxgc) {
4240 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4241             # $1 $2 $3 $4
4242 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4243 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4244 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4245 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4246 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4247 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4248 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4249             }
4250 0         0 die __FILE__, ": Substitution replacement not terminated\n";
4251             }
4252             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
4253 0         0 my @s = ($1,$2,$3);
4254 0         0 while (not /\G \z/oxgc) {
4255 0 0       0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4256             # $1 $2 $3 $4
4257 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4258 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4259 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4260 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4261 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4262 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4263 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4264 0         0 elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4265 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4266             }
4267 0         0 die __FILE__, ": Substitution replacement not terminated\n";
4268             }
4269             # $1 $2 $3 $4 $5 $6
4270             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
4271 34         91 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4272             }
4273             # $1 $2 $3 $4 $5 $6
4274             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4275 2         13 return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
4276             }
4277             # $1 $2 $3 $4 $5 $6
4278             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4279 0         0 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4280             }
4281             # $1 $2 $3 $4 $5 $6
4282             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4283 119         442 return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4284             }
4285             }
4286 0         0 die __FILE__, ": Substitution pattern not terminated\n";
4287             }
4288             }
4289              
4290             # require ignore module
4291 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
4292 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "# require$1\n$2"; }
4293 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
4294              
4295             # use strict; --> use strict; no strict qw(refs);
4296 65         494 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
4297 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
4298 0         0 elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
4299              
4300             # use 5.12.0; --> use 5.12.0; no strict qw(refs);
4301             elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
4302 3 50 33     40 if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
      33        
4303 0         0 return "use $1; no strict qw(refs);";
4304             }
4305             else {
4306 3         16 return "use $1;";
4307             }
4308             }
4309             elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
4310 0 0 0     0 if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
      0        
4311 0         0 return "use $1; no strict qw(refs);";
4312             }
4313             else {
4314 0         0 return "use $1;";
4315             }
4316             }
4317              
4318             # ignore use module
4319 2         17 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
4320 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "# use$1\n$2"; }
4321 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
4322              
4323             # ignore no module
4324 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
4325 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "# no$1\n$2"; }
4326 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
4327              
4328             # use else
4329 0         0 elsif (/\G \b use \b /oxmsgc) { return "use"; }
4330              
4331             # use else
4332 2         7 elsif (/\G \b no \b /oxmsgc) { return "no"; }
4333              
4334             # ''
4335             elsif (/\G (?
4336 1825         2317 my $q_string = '';
4337 1825         4095 while (not /\G \z/oxgc) {
4338 11056 100       37796 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
  4 100       8  
    100          
    50          
4339 48         83 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
4340 1825         3479 elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
4341 9179         16519 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4342             }
4343 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4344             }
4345              
4346             # ""
4347             elsif (/\G (\") /oxgc) {
4348 2616         3434 my $qq_string = '';
4349 2616         5664 while (not /\G \z/oxgc) {
4350 49212 100       141800 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  109 100       227  
    100          
    50          
4351 12         20 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
4352 2616         4987 elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
4353 46475         75968 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
4354             }
4355 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4356             }
4357              
4358             # ``
4359             elsif (/\G (\`) /oxgc) {
4360 1         1 my $qx_string = '';
4361 1         4 while (not /\G \z/oxgc) {
4362 19 50       80 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
  0 50       0  
    100          
    50          
4363 0         0 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
4364 1         2 elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
4365 18         26 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
4366             }
4367 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4368             }
4369              
4370             # // --- not divide operator (num / num), not defined-or
4371             elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
4372 1069         1448 my $regexp = '';
4373 1069         2284 while (not /\G \z/oxgc) {
4374 10078 100       32280 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
  1 50       5  
    100          
    50          
4375 0         0 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
4376 1069         2576 elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
4377 9008         16196 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4378             }
4379 0         0 die __FILE__, ": Search pattern not terminated\n";
4380             }
4381              
4382             # ?? --- not conditional operator (condition ? then : else)
4383             elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
4384 30         41 my $regexp = '';
4385 30         72 while (not /\G \z/oxgc) {
4386 122 50       543 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
  0 50       0  
    100          
    50          
4387 0         0 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
4388 30         79 elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
4389 92         191 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4390             }
4391 0         0 die __FILE__, ": Search pattern not terminated\n";
4392             }
4393              
4394             # <<>> (a safer ARGV)
4395 0         0 elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
  0         0  
4396              
4397             # << (bit shift) --- not here document
4398 0         0 elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
  0         0  
4399              
4400             # <<'HEREDOC'
4401             elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4402 80         104 $slash = 'm//';
4403 80         128 my $here_quote = $1;
4404 80         96 my $delimiter = $2;
4405              
4406             # get here document
4407 80 100       145 if ($here_script eq '') {
4408 77         303 $here_script = CORE::substr $_, pos $_;
4409 77         344 $here_script =~ s/.*?\n//oxm;
4410             }
4411 80 50       598 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4412 80         205 push @heredoc, $1 . qq{\n$delimiter\n};
4413 80         96 push @heredoc_delimiter, $delimiter;
4414             }
4415             else {
4416 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4417             }
4418 80         276 return $here_quote;
4419             }
4420              
4421             # <<\HEREDOC
4422              
4423             # P.66 2.6.6. "Here" Documents
4424             # in Chapter 2: Bits and Pieces
4425             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4426              
4427             # P.73 "Here" Documents
4428             # in Chapter 2: Bits and Pieces
4429             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4430              
4431             elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
4432 2         3 $slash = 'm//';
4433 2         5 my $here_quote = $1;
4434 2         2 my $delimiter = $2;
4435              
4436             # get here document
4437 2 100       6 if ($here_script eq '') {
4438 1         13 $here_script = CORE::substr $_, pos $_;
4439 1         5 $here_script =~ s/.*?\n//oxm;
4440             }
4441 2 50       25 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4442 2         6 push @heredoc, $1 . qq{\n$delimiter\n};
4443 2         3 push @heredoc_delimiter, $delimiter;
4444             }
4445             else {
4446 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4447             }
4448 2         7 return $here_quote;
4449             }
4450              
4451             # <<"HEREDOC"
4452             elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
4453 39         63 $slash = 'm//';
4454 39         78 my $here_quote = $1;
4455 39         65 my $delimiter = $2;
4456              
4457             # get here document
4458 39 100       94 if ($here_script eq '') {
4459 38         217 $here_script = CORE::substr $_, pos $_;
4460 38         204 $here_script =~ s/.*?\n//oxm;
4461             }
4462 39 50       520 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4463 39         102 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4464 39         72 push @heredoc_delimiter, $delimiter;
4465             }
4466             else {
4467 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4468             }
4469 39         161 return $here_quote;
4470             }
4471              
4472             # <
4473             elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
4474 54         93 $slash = 'm//';
4475 54         110 my $here_quote = $1;
4476 54         108 my $delimiter = $2;
4477              
4478             # get here document
4479 54 100       168 if ($here_script eq '') {
4480 51         303 $here_script = CORE::substr $_, pos $_;
4481 51         349 $here_script =~ s/.*?\n//oxm;
4482             }
4483 54 50       861 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4484 54         169 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4485 54         103 push @heredoc_delimiter, $delimiter;
4486             }
4487             else {
4488 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4489             }
4490 54         224 return $here_quote;
4491             }
4492              
4493             # <<`HEREDOC`
4494             elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
4495 0         0 $slash = 'm//';
4496 0         0 my $here_quote = $1;
4497 0         0 my $delimiter = $2;
4498              
4499             # get here document
4500 0 0       0 if ($here_script eq '') {
4501 0         0 $here_script = CORE::substr $_, pos $_;
4502 0         0 $here_script =~ s/.*?\n//oxm;
4503             }
4504 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4505 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4506 0         0 push @heredoc_delimiter, $delimiter;
4507             }
4508             else {
4509 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4510             }
4511 0         0 return $here_quote;
4512             }
4513              
4514             # <<= <=> <= < operator
4515             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
4516 12         48 return $1;
4517             }
4518              
4519             #
4520             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
4521 0         0 return $1;
4522             }
4523              
4524             # --- glob
4525              
4526             # avoid "Error: Runtime exception" of perl version 5.005_03
4527              
4528             elsif (/\G < ((?:[^\x8E\x8F\xA1-\xFE>\0\a\e\f\n\r\t]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])+?) > /oxgc) {
4529 0         0 return 'Eeucjp::glob("' . $1 . '")';
4530             }
4531              
4532             # __DATA__
4533 0         0 elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
4534              
4535             # __END__
4536 325         1933 elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
4537              
4538             # \cD Control-D
4539              
4540             # P.68 2.6.8. Other Literal Tokens
4541             # in Chapter 2: Bits and Pieces
4542             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4543              
4544             # P.76 Other Literal Tokens
4545             # in Chapter 2: Bits and Pieces
4546             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4547              
4548 0         0 elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
4549              
4550             # \cZ Control-Z
4551 0         0 elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
4552              
4553             # any operator before div
4554             elsif (/\G (
4555             -- | \+\+ |
4556             [\)\}\]]
4557              
4558 9151         9911 ) /oxgc) { $slash = 'div'; return $1; }
  9151         32914  
4559              
4560             # yada-yada or triple-dot operator
4561             elsif (/\G (
4562             \.\.\.
4563              
4564 7         10 ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
  7         22  
4565              
4566             # any operator before m//
4567              
4568             # //, //= (defined-or)
4569              
4570             # P.164 Logical Operators
4571             # in Chapter 10: More Control Structures
4572             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4573              
4574             # P.119 C-Style Logical (Short-Circuit) Operators
4575             # in Chapter 3: Unary and Binary Operators
4576             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4577              
4578             # (and so on)
4579              
4580             # ~~
4581              
4582             # P.221 The Smart Match Operator
4583             # in Chapter 15: Smart Matching and given-when
4584             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4585              
4586             # P.112 Smartmatch Operator
4587             # in Chapter 3: Unary and Binary Operators
4588             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4589              
4590             # (and so on)
4591              
4592             elsif (/\G ((?>
4593              
4594             !~~ | !~ | != | ! |
4595             %= | % |
4596             &&= | && | &= | &\.= | &\. | & |
4597             -= | -> | - |
4598             :(?>\s*)= |
4599             : |
4600             <<>> |
4601             <<= | <=> | <= | < |
4602             == | => | =~ | = |
4603             >>= | >> | >= | > |
4604             \*\*= | \*\* | \*= | \* |
4605             \+= | \+ |
4606             \.\. | \.= | \. |
4607             \/\/= | \/\/ |
4608             \/= | \/ |
4609             \? |
4610             \\ |
4611             \^= | \^\.= | \^\. | \^ |
4612             \b x= |
4613             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
4614             ~~ | ~\. | ~ |
4615             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
4616             \b(?: print )\b |
4617              
4618             [,;\(\{\[]
4619              
4620 15847         16915 )) /oxgc) { $slash = 'm//'; return $1; }
  15847         54723  
4621              
4622             # other any character
4623 25328         24414 elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
  25328         92799  
4624              
4625             # system error
4626             else {
4627 0         0 die __FILE__, ": Oops, this shouldn't happen!\n";
4628             }
4629             }
4630              
4631             # escape EUC-JP string
4632             sub e_string {
4633 2504     2504 0 3933 my($string) = @_;
4634 2504         2323 my $e_string = '';
4635              
4636 2504         2602 local $slash = 'm//';
4637              
4638             # P.1024 Appendix W.10 Multibyte Processing
4639             # of ISBN 1-56592-224-7 CJKV Information Processing
4640             # (and so on)
4641              
4642 2504         25573 my @char = $string =~ / \G (?>[^\x8E\x8F\xA1-\xFE\\]|\\$q_char|$q_char) /oxmsg;
4643              
4644             # without { ... }
4645 2504 100 66     10993 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
4646 2466 50       4332 if ($string !~ /<
4647 2466         4990 return $string;
4648             }
4649             }
4650              
4651             E_STRING_LOOP:
4652 38         90 while ($string !~ /\G \z/oxgc) {
4653 288 50       20652 if (0) {
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    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          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    50          
4654             }
4655              
4656             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Eeucjp::PREMATCH()]}
4657 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4658 0         0 $e_string .= q{Eeucjp::PREMATCH()};
4659 0         0 $slash = 'div';
4660             }
4661              
4662             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Eeucjp::MATCH()]}
4663             elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4664 0         0 $e_string .= q{Eeucjp::MATCH()};
4665 0         0 $slash = 'div';
4666             }
4667              
4668             # $', ${'} --> $', ${'}
4669             elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
4670 0         0 $e_string .= $1;
4671 0         0 $slash = 'div';
4672             }
4673              
4674             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Eeucjp::POSTMATCH()]}
4675             elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4676 0         0 $e_string .= q{Eeucjp::POSTMATCH()};
4677 0         0 $slash = 'div';
4678             }
4679              
4680             # bareword
4681             elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
4682 0         0 $e_string .= $1;
4683 0         0 $slash = 'div';
4684             }
4685              
4686             # $0 --> $0
4687             elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
4688 0         0 $e_string .= $1;
4689 0         0 $slash = 'div';
4690             }
4691             elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
4692 0         0 $e_string .= $1;
4693 0         0 $slash = 'div';
4694             }
4695              
4696             # $$ --> $$
4697             elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
4698 0         0 $e_string .= $1;
4699 0         0 $slash = 'div';
4700             }
4701              
4702             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
4703             # $1, $2, $3 --> $1, $2, $3 otherwise
4704             elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
4705 0         0 $e_string .= e_capture($1);
4706 0         0 $slash = 'div';
4707             }
4708             elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
4709 0         0 $e_string .= e_capture($1);
4710 0         0 $slash = 'div';
4711             }
4712              
4713             # $$foo[ ... ] --> $ $foo->[ ... ]
4714             elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
4715 0         0 $e_string .= e_capture($1.'->'.$2);
4716 0         0 $slash = 'div';
4717             }
4718              
4719             # $$foo{ ... } --> $ $foo->{ ... }
4720             elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
4721 0         0 $e_string .= e_capture($1.'->'.$2);
4722 0         0 $slash = 'div';
4723             }
4724              
4725             # $$foo
4726             elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
4727 0         0 $e_string .= e_capture($1);
4728 0         0 $slash = 'div';
4729             }
4730              
4731             # ${ foo }
4732             elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
4733 0         0 $e_string .= '${' . $1 . '}';
4734 0         0 $slash = 'div';
4735             }
4736              
4737             # ${ ... }
4738             elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
4739 3         8 $e_string .= e_capture($1);
4740 3         14 $slash = 'div';
4741             }
4742              
4743             # variable or function
4744             # $ @ % & * $ #
4745             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) {
4746 0         0 $e_string .= $1;
4747 0         0 $slash = 'div';
4748             }
4749             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
4750             # $ @ # \ ' " / ? ( ) [ ] < >
4751             elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
4752 0         0 $e_string .= $1;
4753 0         0 $slash = 'div';
4754             }
4755              
4756             # subroutines of package Eeucjp
4757 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
4758 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4759 0         0 elsif ($string =~ /\G \b EUCJP::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4760 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
4761 0         0 elsif ($string =~ /\G \b EUCJP::eval \b /oxgc) { $e_string .= 'eval EUCJP::escape'; $slash = 'm//'; }
  0         0  
4762 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
4763 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Eeucjp::chop'; $slash = 'm//'; }
  0         0  
4764 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
4765 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
4766 0         0 elsif ($string =~ /\G \b EUCJP::index \b /oxgc) { $e_string .= 'EUCJP::index'; $slash = 'm//'; }
  0         0  
4767 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Eeucjp::index'; $slash = 'm//'; }
  0         0  
4768 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
4769 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
4770 0         0 elsif ($string =~ /\G \b EUCJP::rindex \b /oxgc) { $e_string .= 'EUCJP::rindex'; $slash = 'm//'; }
  0         0  
4771 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Eeucjp::rindex'; $slash = 'm//'; }
  0         0  
4772 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::lc'; $slash = 'm//'; }
  0         0  
4773 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::lcfirst'; $slash = 'm//'; }
  0         0  
4774 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::uc'; $slash = 'm//'; }
  0         0  
4775 0         0 elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::ucfirst'; $slash = 'm//'; }
  0         0  
4776 0         0 elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::fc'; $slash = 'm//'; }
  0         0  
4777              
4778             # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
4779 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4780 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  
4781 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  
4782 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  
4783 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  
4784 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
4785 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  
4786              
4787 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4788 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  
4789 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  
4790 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  
4791 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  
4792 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
4793 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
4794              
4795             elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
4796 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4797 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
4798 0         0 elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
  0         0  
4799 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4800              
4801 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4802 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4803 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::chr'; $slash = 'm//'; }
  0         0  
4804 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4805 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
4806 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::glob'; $slash = 'm//'; }
  0         0  
4807 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Eeucjp::lc_'; $slash = 'm//'; }
  0         0  
4808 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Eeucjp::lcfirst_'; $slash = 'm//'; }
  0         0  
4809 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Eeucjp::uc_'; $slash = 'm//'; }
  0         0  
4810 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Eeucjp::ucfirst_'; $slash = 'm//'; }
  0         0  
4811 0         0 elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Eeucjp::fc_'; $slash = 'm//'; }
  0         0  
4812 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
4813              
4814 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4815 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4816 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Eeucjp::chr_'; $slash = 'm//'; }
  0         0  
4817 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4818 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
4819 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Eeucjp::glob_'; $slash = 'm//'; }
  0         0  
4820 0         0 elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
  0         0  
4821 0         0 elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
  0         0  
4822             # split
4823             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
4824 0         0 $slash = 'm//';
4825              
4826 0         0 my $e = '';
4827 0         0 while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
4828 0         0 $e .= $1;
4829             }
4830              
4831             # end of split
4832 0 0       0 if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Eeucjp::split' . $e; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4833              
4834             # split scalar value
4835 0         0 elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Eeucjp::split' . $e . e_string($1); next E_STRING_LOOP; }
  0         0  
4836              
4837             # split literal space
4838 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
4839 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4840 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4841 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4842 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4843 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4844 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
4845 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4846 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4847 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4848 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4849 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4850 0         0 elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {' '}; next E_STRING_LOOP; }
  0         0  
4851 0         0 elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {" "}; next E_STRING_LOOP; }
  0         0  
4852              
4853             # split qq//
4854             elsif ($string =~ /\G \b (qq) \b /oxgc) {
4855 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
  0         0  
  0         0  
4856             else {
4857 0         0 while ($string !~ /\G \z/oxgc) {
4858 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4859 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  
4860 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  
4861 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  
4862 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  
4863 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
  0         0  
4864 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq * * --> qr * *
  0         0  
4865             }
4866 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4867             }
4868             }
4869              
4870             # split qr//
4871             elsif ($string =~ /\G \b (qr) \b /oxgc) {
4872 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
  0         0  
  0         0  
4873             else {
4874 0         0 while ($string !~ /\G \z/oxgc) {
4875 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4876 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  
4877 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  
4878 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  
4879 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  
4880 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  
4881 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
  0         0  
4882 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr * *
  0         0  
4883             }
4884 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4885             }
4886             }
4887              
4888             # split q//
4889             elsif ($string =~ /\G \b (q) \b /oxgc) {
4890 0 0       0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
  0         0  
  0         0  
4891             else {
4892 0         0 while ($string !~ /\G \z/oxgc) {
4893 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4894 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  
4895 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  
4896 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  
4897 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  
4898 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
  0         0  
4899 0         0 elsif ($string =~ /\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q * * --> qr * *
  0         0  
4900             }
4901 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4902             }
4903             }
4904              
4905             # split m//
4906             elsif ($string =~ /\G \b (m) \b /oxgc) {
4907 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # m# # --> qr # #
  0         0  
  0         0  
4908             else {
4909 0         0 while ($string !~ /\G \z/oxgc) {
4910 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4911 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  
4912 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  
4913 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  
4914 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  
4915 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  
4916 0         0 elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
  0         0  
4917 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m * * --> qr * *
  0         0  
4918             }
4919 0         0 die __FILE__, ": Search pattern not terminated\n";
4920             }
4921             }
4922              
4923             # split ''
4924             elsif ($string =~ /\G (\') /oxgc) {
4925 0         0 my $q_string = '';
4926 0         0 while ($string !~ /\G \z/oxgc) {
4927 0 0       0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0 0       0  
    0          
    0          
4928 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
4929 0         0 elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
  0         0  
4930 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
4931             }
4932 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4933             }
4934              
4935             # split ""
4936             elsif ($string =~ /\G (\") /oxgc) {
4937 0         0 my $qq_string = '';
4938 0         0 while ($string !~ /\G \z/oxgc) {
4939 0 0       0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0 0       0  
    0          
    0          
4940 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
4941 0         0 elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
  0         0  
4942 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
4943             }
4944 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4945             }
4946              
4947             # split //
4948             elsif ($string =~ /\G (\/) /oxgc) {
4949 0         0 my $regexp = '';
4950 0         0 while ($string !~ /\G \z/oxgc) {
4951 0 0       0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0 0       0  
    0          
    0          
4952 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
4953 0         0 elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
  0         0  
4954 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
4955             }
4956 0         0 die __FILE__, ": Search pattern not terminated\n";
4957             }
4958             }
4959              
4960             # qq//
4961             elsif ($string =~ /\G \b (qq) \b /oxgc) {
4962 0         0 my $ope = $1;
4963 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
4964 0         0 $e_string .= e_qq($ope,$1,$3,$2);
4965             }
4966             else {
4967 0         0 my $e = '';
4968 0         0 while ($string !~ /\G \z/oxgc) {
4969 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
4970 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
4971 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
4972 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
4973 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
  0         0  
4974 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
  0         0  
4975             }
4976 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4977             }
4978             }
4979              
4980             # qx//
4981             elsif ($string =~ /\G \b (qx) \b /oxgc) {
4982 0         0 my $ope = $1;
4983 0 0       0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4984 0         0 $e_string .= e_qq($ope,$1,$3,$2);
4985             }
4986             else {
4987 0         0 my $e = '';
4988 0         0 while ($string !~ /\G \z/oxgc) {
4989 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4990 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
4991 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
4992 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
4993 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
4994 0         0 elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
  0         0  
4995 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
  0         0  
4996             }
4997 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4998             }
4999             }
5000              
5001             # q//
5002             elsif ($string =~ /\G \b (q) \b /oxgc) {
5003 0         0 my $ope = $1;
5004 0 0       0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
5005 0         0 $e_string .= e_q($ope,$1,$3,$2);
5006             }
5007             else {
5008 0         0 my $e = '';
5009 0         0 while ($string !~ /\G \z/oxgc) {
5010 0 0       0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0 0       0  
    0          
    0          
    0          
    0          
5011 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
5012 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
5013 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
5014 0         0 elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
  0         0  
5015 0         0 elsif ($string =~ /\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q * *
  0         0  
5016             }
5017 0         0 die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5018             }
5019             }
5020              
5021             # ''
5022 12         32 elsif ($string =~ /\G (?
5023              
5024             # ""
5025 6         19 elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
5026              
5027             # ``
5028 0         0 elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
5029              
5030             # <<>> (a safer ARGV)
5031 0         0 elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
5032              
5033             # <<= <=> <= < operator
5034 0         0 elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
5035              
5036             #
5037 0         0 elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
5038              
5039             # --- glob
5040             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
5041 0         0 $e_string .= 'Eeucjp::glob("' . $1 . '")';
5042             }
5043              
5044             # << (bit shift) --- not here document
5045 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; $e_string .= $1; }
  0         0  
5046              
5047             # <<'HEREDOC'
5048             elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
5049 0         0 $slash = 'm//';
5050 0         0 my $here_quote = $1;
5051 0         0 my $delimiter = $2;
5052              
5053             # get here document
5054 0 0       0 if ($here_script eq '') {
5055 0         0 $here_script = CORE::substr $_, pos $_;
5056 0         0 $here_script =~ s/.*?\n//oxm;
5057             }
5058 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5059 0         0 push @heredoc, $1 . qq{\n$delimiter\n};
5060 0         0 push @heredoc_delimiter, $delimiter;
5061             }
5062             else {
5063 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5064             }
5065 0         0 $e_string .= $here_quote;
5066             }
5067              
5068             # <<\HEREDOC
5069             elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
5070 0         0 $slash = 'm//';
5071 0         0 my $here_quote = $1;
5072 0         0 my $delimiter = $2;
5073              
5074             # get here document
5075 0 0       0 if ($here_script eq '') {
5076 0         0 $here_script = CORE::substr $_, pos $_;
5077 0         0 $here_script =~ s/.*?\n//oxm;
5078             }
5079 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5080 0         0 push @heredoc, $1 . qq{\n$delimiter\n};
5081 0         0 push @heredoc_delimiter, $delimiter;
5082             }
5083             else {
5084 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5085             }
5086 0         0 $e_string .= $here_quote;
5087             }
5088              
5089             # <<"HEREDOC"
5090             elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
5091 0         0 $slash = 'm//';
5092 0         0 my $here_quote = $1;
5093 0         0 my $delimiter = $2;
5094              
5095             # get here document
5096 0 0       0 if ($here_script eq '') {
5097 0         0 $here_script = CORE::substr $_, pos $_;
5098 0         0 $here_script =~ s/.*?\n//oxm;
5099             }
5100 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5101 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5102 0         0 push @heredoc_delimiter, $delimiter;
5103             }
5104             else {
5105 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5106             }
5107 0         0 $e_string .= $here_quote;
5108             }
5109              
5110             # <
5111             elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
5112 0         0 $slash = 'm//';
5113 0         0 my $here_quote = $1;
5114 0         0 my $delimiter = $2;
5115              
5116             # get here document
5117 0 0       0 if ($here_script eq '') {
5118 0         0 $here_script = CORE::substr $_, pos $_;
5119 0         0 $here_script =~ s/.*?\n//oxm;
5120             }
5121 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5122 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5123 0         0 push @heredoc_delimiter, $delimiter;
5124             }
5125             else {
5126 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5127             }
5128 0         0 $e_string .= $here_quote;
5129             }
5130              
5131             # <<`HEREDOC`
5132             elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
5133 0         0 $slash = 'm//';
5134 0         0 my $here_quote = $1;
5135 0         0 my $delimiter = $2;
5136              
5137             # get here document
5138 0 0       0 if ($here_script eq '') {
5139 0         0 $here_script = CORE::substr $_, pos $_;
5140 0         0 $here_script =~ s/.*?\n//oxm;
5141             }
5142 0 0       0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5143 0         0 push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5144 0         0 push @heredoc_delimiter, $delimiter;
5145             }
5146             else {
5147 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5148             }
5149 0         0 $e_string .= $here_quote;
5150             }
5151              
5152             # any operator before div
5153             elsif ($string =~ /\G (
5154             -- | \+\+ |
5155             [\)\}\]]
5156              
5157 39         50 ) /oxgc) { $slash = 'div'; $e_string .= $1; }
  39         110  
5158              
5159             # yada-yada or triple-dot operator
5160             elsif ($string =~ /\G (
5161             \.\.\.
5162              
5163 0         0 ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
  0         0  
5164              
5165             # any operator before m//
5166             elsif ($string =~ /\G ((?>
5167              
5168             !~~ | !~ | != | ! |
5169             %= | % |
5170             &&= | && | &= | &\.= | &\. | & |
5171             -= | -> | - |
5172             :(?>\s*)= |
5173             : |
5174             <<>> |
5175             <<= | <=> | <= | < |
5176             == | => | =~ | = |
5177             >>= | >> | >= | > |
5178             \*\*= | \*\* | \*= | \* |
5179             \+= | \+ |
5180             \.\. | \.= | \. |
5181             \/\/= | \/\/ |
5182             \/= | \/ |
5183             \? |
5184             \\ |
5185             \^= | \^\.= | \^\. | \^ |
5186             \b x= |
5187             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
5188             ~~ | ~\. | ~ |
5189             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
5190             \b(?: print )\b |
5191              
5192             [,;\(\{\[]
5193              
5194 49         66 )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
  49         151  
5195              
5196             # other any character
5197 179         559 elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
5198              
5199             # system error
5200             else {
5201 0         0 die __FILE__, ": Oops, this shouldn't happen!\n";
5202             }
5203             }
5204              
5205 38         113 return $e_string;
5206             }
5207              
5208             #
5209             # character class
5210             #
5211             sub character_class {
5212 3054     3054 0 3280 my($char,$modifier) = @_;
5213              
5214 3054 100       3711 if ($char eq '.') {
5215 115 100       210 if ($modifier =~ /s/) {
5216 23         51 return '${Eeucjp::dot_s}';
5217             }
5218             else {
5219 92         155 return '${Eeucjp::dot}';
5220             }
5221             }
5222             else {
5223 2939         3933 return Eeucjp::classic_character_class($char);
5224             }
5225             }
5226              
5227             #
5228             # escape capture ($1, $2, $3, ...)
5229             #
5230             sub e_capture {
5231              
5232 547     547 0 2125 return join '', '${Eeucjp::capture(', $_[0], ')}';
5233 0         0 return join '', '${', $_[0], '}';
5234             }
5235              
5236             #
5237             # escape transliteration (tr/// or y///)
5238             #
5239             sub e_tr {
5240 11     11 0 23 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
5241 11         15 my $e_tr = '';
5242 11   100     26 $modifier ||= '';
5243              
5244 11         8 $slash = 'div';
5245              
5246             # quote character class 1
5247 11         21 $charclass = q_tr($charclass);
5248              
5249             # quote character class 2
5250 11         16 $charclass2 = q_tr($charclass2);
5251              
5252             # /b /B modifier
5253 11 50       26 if ($modifier =~ tr/bB//d) {
5254 0 0       0 if ($variable eq '') {
5255 0         0 $e_tr = qq{tr$charclass$e$charclass2$modifier};
5256             }
5257             else {
5258 0         0 $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
5259             }
5260             }
5261             else {
5262 11 100       18 if ($variable eq '') {
5263 2         4 $e_tr = qq{Eeucjp::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
5264             }
5265             else {
5266 9         28 $e_tr = qq{Eeucjp::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
5267             }
5268             }
5269              
5270             # clear tr/// variable
5271 11         12 $tr_variable = '';
5272 11         9 $bind_operator = '';
5273              
5274 11         60 return $e_tr;
5275             }
5276              
5277             #
5278             # quote for escape transliteration (tr/// or y///)
5279             #
5280             sub q_tr {
5281 22     22 0 22 my($charclass) = @_;
5282              
5283             # quote character class
5284 22 50       34 if ($charclass !~ /'/oxms) {
    0          
    0          
    0          
    0          
    0          
5285 22         30 return e_q('', "'", "'", $charclass); # --> q' '
5286             }
5287             elsif ($charclass !~ /\//oxms) {
5288 0         0 return e_q('q', '/', '/', $charclass); # --> q/ /
5289             }
5290             elsif ($charclass !~ /\#/oxms) {
5291 0         0 return e_q('q', '#', '#', $charclass); # --> q# #
5292             }
5293             elsif ($charclass !~ /[\<\>]/oxms) {
5294 0         0 return e_q('q', '<', '>', $charclass); # --> q< >
5295             }
5296             elsif ($charclass !~ /[\(\)]/oxms) {
5297 0         0 return e_q('q', '(', ')', $charclass); # --> q( )
5298             }
5299             elsif ($charclass !~ /[\{\}]/oxms) {
5300 0         0 return e_q('q', '{', '}', $charclass); # --> q{ }
5301             }
5302             else {
5303 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5304 0 0       0 if ($charclass !~ /\Q$char\E/xms) {
5305 0         0 return e_q('q', $char, $char, $charclass);
5306             }
5307             }
5308             }
5309              
5310 0         0 return e_q('q', '{', '}', $charclass);
5311             }
5312              
5313             #
5314             # escape q string (q//, '')
5315             #
5316             sub e_q {
5317 2244     2244 0 3637 my($ope,$delimiter,$end_delimiter,$string) = @_;
5318              
5319 2244         2309 $slash = 'div';
5320              
5321 2244         9888 return join '', $ope, $delimiter, $string, $end_delimiter;
5322             }
5323              
5324             #
5325             # escape qq string (qq//, "", qx//, ``)
5326             #
5327             sub e_qq {
5328 6899     6899 0 10092 my($ope,$delimiter,$end_delimiter,$string) = @_;
5329              
5330 6899         6464 $slash = 'div';
5331              
5332 6899         5474 my $left_e = 0;
5333 6899         4760 my $right_e = 0;
5334              
5335             # split regexp
5336 6899         248053 my @char = $string =~ /\G((?>
5337             [^\x8E\x8F\xA1-\xFE\\\$]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
5338             \\x\{ (?>[0-9A-Fa-f]+) \} |
5339             \\o\{ (?>[0-7]+) \} |
5340             \\N\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
5341             \\ $q_char |
5342             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5343             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5344             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5345             \$ (?>\s* [0-9]+) |
5346             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5347             \$ \$ (?![\w\{]) |
5348             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5349             $q_char
5350             ))/oxmsg;
5351              
5352 6899         23693 for (my $i=0; $i <= $#char; $i++) {
5353              
5354             # "\L\u" --> "\u\L"
5355 214565 50 66     772940 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
5356 0         0 @char[$i,$i+1] = @char[$i+1,$i];
5357             }
5358              
5359             # "\U\l" --> "\l\U"
5360             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5361 0         0 @char[$i,$i+1] = @char[$i+1,$i];
5362             }
5363              
5364             # octal escape sequence
5365             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5366 1         3 $char[$i] = Eeucjp::octchr($1);
5367             }
5368              
5369             # hexadecimal escape sequence
5370             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5371 1         3 $char[$i] = Eeucjp::hexchr($1);
5372             }
5373              
5374             # \N{CHARNAME} --> N{CHARNAME}
5375             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
5376 0         0 $char[$i] = $1;
5377             }
5378              
5379 214565 100       2088678 if (0) {
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
5380             }
5381              
5382             # \F
5383             #
5384             # P.69 Table 2-6. Translation escapes
5385             # in Chapter 2: Bits and Pieces
5386             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5387             # (and so on)
5388              
5389             # \u \l \U \L \F \Q \E
5390 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5391 602 50       1266 if ($right_e < $left_e) {
5392 0         0 $char[$i] = '\\' . $char[$i];
5393             }
5394             }
5395             elsif ($char[$i] eq '\u') {
5396              
5397             # "STRING @{[ LIST EXPR ]} MORE STRING"
5398              
5399             # P.257 Other Tricks You Can Do with Hard References
5400             # in Chapter 8: References
5401             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5402              
5403             # P.353 Other Tricks You Can Do with Hard References
5404             # in Chapter 8: References
5405             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5406              
5407             # (and so on)
5408              
5409 0         0 $char[$i] = '@{[Eeucjp::ucfirst qq<';
5410 0         0 $left_e++;
5411             }
5412             elsif ($char[$i] eq '\l') {
5413 0         0 $char[$i] = '@{[Eeucjp::lcfirst qq<';
5414 0         0 $left_e++;
5415             }
5416             elsif ($char[$i] eq '\U') {
5417 0         0 $char[$i] = '@{[Eeucjp::uc qq<';
5418 0         0 $left_e++;
5419             }
5420             elsif ($char[$i] eq '\L') {
5421 6         4 $char[$i] = '@{[Eeucjp::lc qq<';
5422 6         16 $left_e++;
5423             }
5424             elsif ($char[$i] eq '\F') {
5425 9         10 $char[$i] = '@{[Eeucjp::fc qq<';
5426 9         17 $left_e++;
5427             }
5428             elsif ($char[$i] eq '\Q') {
5429 0         0 $char[$i] = '@{[CORE::quotemeta qq<';
5430 0         0 $left_e++;
5431             }
5432             elsif ($char[$i] eq '\E') {
5433 12 50       20 if ($right_e < $left_e) {
5434 12         10 $char[$i] = '>]}';
5435 12         21 $right_e++;
5436             }
5437             else {
5438 0         0 $char[$i] = '';
5439             }
5440             }
5441             elsif ($char[$i] eq '\Q') {
5442 0         0 while (1) {
5443 0 0       0 if (++$i > $#char) {
5444 0         0 last;
5445             }
5446 0 0       0 if ($char[$i] eq '\E') {
5447 0         0 last;
5448             }
5449             }
5450             }
5451             elsif ($char[$i] eq '\E') {
5452             }
5453              
5454             # $0 --> $0
5455             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5456             }
5457             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5458             }
5459              
5460             # $$ --> $$
5461             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5462             }
5463              
5464             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5465             # $1, $2, $3 --> $1, $2, $3 otherwise
5466             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5467 415         695 $char[$i] = e_capture($1);
5468             }
5469             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5470 0         0 $char[$i] = e_capture($1);
5471             }
5472              
5473             # $$foo[ ... ] --> $ $foo->[ ... ]
5474             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5475 0         0 $char[$i] = e_capture($1.'->'.$2);
5476             }
5477              
5478             # $$foo{ ... } --> $ $foo->{ ... }
5479             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5480 0         0 $char[$i] = e_capture($1.'->'.$2);
5481             }
5482              
5483             # $$foo
5484             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5485 0         0 $char[$i] = e_capture($1);
5486             }
5487              
5488             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
5489             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5490 44         103 $char[$i] = '@{[Eeucjp::PREMATCH()]}';
5491             }
5492              
5493             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
5494             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5495 45         120 $char[$i] = '@{[Eeucjp::MATCH()]}';
5496             }
5497              
5498             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
5499             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5500 33         78 $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
5501             }
5502              
5503             # ${ foo } --> ${ foo }
5504             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5505             }
5506              
5507             # ${ ... }
5508             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5509 0         0 $char[$i] = e_capture($1);
5510             }
5511             }
5512              
5513             # return string
5514 6899 100       10372 if ($left_e > $right_e) {
5515 3         19 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
5516             }
5517 6896         55910 return join '', $ope, $delimiter, @char, $end_delimiter;
5518             }
5519              
5520             #
5521             # escape qw string (qw//)
5522             #
5523             sub e_qw {
5524 34     34 0 103 my($ope,$delimiter,$end_delimiter,$string) = @_;
5525              
5526 34         39 $slash = 'div';
5527              
5528             # choice again delimiter
5529 34         289 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
  621         736  
5530 34 50       156 if (not $octet{$end_delimiter}) {
    0          
    0          
    0          
    0          
5531 34         209 return join '', $ope, $delimiter, $string, $end_delimiter;
5532             }
5533             elsif (not $octet{')'}) {
5534 0         0 return join '', $ope, '(', $string, ')';
5535             }
5536             elsif (not $octet{'}'}) {
5537 0         0 return join '', $ope, '{', $string, '}';
5538             }
5539             elsif (not $octet{']'}) {
5540 0         0 return join '', $ope, '[', $string, ']';
5541             }
5542             elsif (not $octet{'>'}) {
5543 0         0 return join '', $ope, '<', $string, '>';
5544             }
5545             else {
5546 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5547 0 0       0 if (not $octet{$char}) {
5548 0         0 return join '', $ope, $char, $string, $char;
5549             }
5550             }
5551             }
5552              
5553             # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
5554 0         0 my @string = CORE::split(/\s+/, $string);
5555 0         0 for my $string (@string) {
5556 0         0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
5557 0         0 for my $octet (@octet) {
5558 0 0       0 if ($octet =~ /\A (['\\]) \z/oxms) {
5559 0         0 $octet = '\\' . $1;
5560             }
5561             }
5562 0         0 $string = join '', @octet;
5563             }
5564 0         0 return join '', '(', (join ', ', map { "'$_'" } @string), ')';
  0         0  
5565             }
5566              
5567             #
5568             # escape here document (<<"HEREDOC", <
5569             #
5570             sub e_heredoc {
5571 93     93 0 577 my($string) = @_;
5572              
5573 93         110 $slash = 'm//';
5574              
5575 93         313 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
5576              
5577 93         112 my $left_e = 0;
5578 93         345 my $right_e = 0;
5579              
5580             # split regexp
5581 93         10419 my @char = $string =~ /\G((?>
5582             [^\x8E\x8F\xA1-\xFE\\\$]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
5583             \\x\{ (?>[0-9A-Fa-f]+) \} |
5584             \\o\{ (?>[0-7]+) \} |
5585             \\N\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
5586             \\ $q_char |
5587             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5588             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5589             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5590             \$ (?>\s* [0-9]+) |
5591             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5592             \$ \$ (?![\w\{]) |
5593             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5594             $q_char
5595             ))/oxmsg;
5596              
5597 93         543 for (my $i=0; $i <= $#char; $i++) {
5598              
5599             # "\L\u" --> "\u\L"
5600 2956 50 66     11455 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
5601 0         0 @char[$i,$i+1] = @char[$i+1,$i];
5602             }
5603              
5604             # "\U\l" --> "\l\U"
5605             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5606 0         0 @char[$i,$i+1] = @char[$i+1,$i];
5607             }
5608              
5609             # octal escape sequence
5610             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5611 1         3 $char[$i] = Eeucjp::octchr($1);
5612             }
5613              
5614             # hexadecimal escape sequence
5615             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5616 1         3 $char[$i] = Eeucjp::hexchr($1);
5617             }
5618              
5619             # \N{CHARNAME} --> N{CHARNAME}
5620             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
5621 0         0 $char[$i] = $1;
5622             }
5623              
5624 2956 100       33616 if (0) {
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
5625             }
5626              
5627             # \u \l \U \L \F \Q \E
5628 0         0 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5629 72 50       170 if ($right_e < $left_e) {
5630 0         0 $char[$i] = '\\' . $char[$i];
5631             }
5632             }
5633             elsif ($char[$i] eq '\u') {
5634 0         0 $char[$i] = '@{[Eeucjp::ucfirst qq<';
5635 0         0 $left_e++;
5636             }
5637             elsif ($char[$i] eq '\l') {
5638 0         0 $char[$i] = '@{[Eeucjp::lcfirst qq<';
5639 0         0 $left_e++;
5640             }
5641             elsif ($char[$i] eq '\U') {
5642 0         0 $char[$i] = '@{[Eeucjp::uc qq<';
5643 0         0 $left_e++;
5644             }
5645             elsif ($char[$i] eq '\L') {
5646 6         8 $char[$i] = '@{[Eeucjp::lc qq<';
5647 6         9 $left_e++;
5648             }
5649             elsif ($char[$i] eq '\F') {
5650 0         0 $char[$i] = '@{[Eeucjp::fc qq<';
5651 0         0 $left_e++;
5652             }
5653             elsif ($char[$i] eq '\Q') {
5654 0         0 $char[$i] = '@{[CORE::quotemeta qq<';
5655 0         0 $left_e++;
5656             }
5657             elsif ($char[$i] eq '\E') {
5658 3 50       7 if ($right_e < $left_e) {
5659 3         4 $char[$i] = '>]}';
5660 3         5 $right_e++;
5661             }
5662             else {
5663 0         0 $char[$i] = '';
5664             }
5665             }
5666             elsif ($char[$i] eq '\Q') {
5667 0         0 while (1) {
5668 0 0       0 if (++$i > $#char) {
5669 0         0 last;
5670             }
5671 0 0       0 if ($char[$i] eq '\E') {
5672 0         0 last;
5673             }
5674             }
5675             }
5676             elsif ($char[$i] eq '\E') {
5677             }
5678              
5679             # $0 --> $0
5680             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5681             }
5682             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5683             }
5684              
5685             # $$ --> $$
5686             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5687             }
5688              
5689             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5690             # $1, $2, $3 --> $1, $2, $3 otherwise
5691             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5692 0         0 $char[$i] = e_capture($1);
5693             }
5694             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5695 0         0 $char[$i] = e_capture($1);
5696             }
5697              
5698             # $$foo[ ... ] --> $ $foo->[ ... ]
5699             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5700 0         0 $char[$i] = e_capture($1.'->'.$2);
5701             }
5702              
5703             # $$foo{ ... } --> $ $foo->{ ... }
5704             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5705 0         0 $char[$i] = e_capture($1.'->'.$2);
5706             }
5707              
5708             # $$foo
5709             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5710 0         0 $char[$i] = e_capture($1);
5711             }
5712              
5713             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
5714             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5715 8         38 $char[$i] = '@{[Eeucjp::PREMATCH()]}';
5716             }
5717              
5718             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
5719             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5720 8         36 $char[$i] = '@{[Eeucjp::MATCH()]}';
5721             }
5722              
5723             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
5724             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5725 6         32 $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
5726             }
5727              
5728             # ${ foo } --> ${ foo }
5729             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5730             }
5731              
5732             # ${ ... }
5733             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5734 0         0 $char[$i] = e_capture($1);
5735             }
5736             }
5737              
5738             # return string
5739 93 100       192 if ($left_e > $right_e) {
5740 3         22 return join '', @char, '>]}' x ($left_e - $right_e);
5741             }
5742 90         768 return join '', @char;
5743             }
5744              
5745             #
5746             # escape regexp (m//, qr//)
5747             #
5748             sub e_qr {
5749 1425     1425 0 3097 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
5750 1425   100     3566 $modifier ||= '';
5751              
5752 1425         1814 $modifier =~ tr/p//d;
5753 1425 50       2990 if ($modifier =~ /([adlu])/oxms) {
5754 0         0 my $line = 0;
5755 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
5756 0 0       0 if ($filename ne __FILE__) {
5757 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
5758 0         0 last;
5759             }
5760             }
5761 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
5762             }
5763              
5764 1425         1531 $slash = 'div';
5765              
5766             # literal null string pattern
5767 1425 100       3483 if ($string eq '') {
    100          
5768 8         9 $modifier =~ tr/bB//d;
5769 8         8 $modifier =~ tr/i//d;
5770 8         49 return join '', $ope, $delimiter, $end_delimiter, $modifier;
5771             }
5772              
5773             # /b /B modifier
5774             elsif ($modifier =~ tr/bB//d) {
5775              
5776             # choice again delimiter
5777 60 50       205 if ($delimiter =~ / [\@:] /oxms) {
5778 0         0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
5779 0         0 my %octet = map {$_ => 1} @char;
  0         0  
5780 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
5781 0         0 $delimiter = '(';
5782 0         0 $end_delimiter = ')';
5783             }
5784             elsif (not $octet{'}'}) {
5785 0         0 $delimiter = '{';
5786 0         0 $end_delimiter = '}';
5787             }
5788             elsif (not $octet{']'}) {
5789 0         0 $delimiter = '[';
5790 0         0 $end_delimiter = ']';
5791             }
5792             elsif (not $octet{'>'}) {
5793 0         0 $delimiter = '<';
5794 0         0 $end_delimiter = '>';
5795             }
5796             else {
5797 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5798 0 0       0 if (not $octet{$char}) {
5799 0         0 $delimiter = $char;
5800 0         0 $end_delimiter = $char;
5801 0         0 last;
5802             }
5803             }
5804             }
5805             }
5806              
5807 60 100 100     336 if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
5808 18         104 return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
5809             }
5810             else {
5811 42         274 return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
5812             }
5813             }
5814              
5815 1357 100       2427 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
5816 1357         3913 my $metachar = qr/[\@\\|[\]{^]/oxms;
5817              
5818             # split regexp
5819 1357         116240 my @char = $string =~ /\G((?>
5820             [^\x8E\x8F\xA1-\xFE\\\$\@\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
5821             \\x (?>[0-9A-Fa-f]{1,2}) |
5822             \\ (?>[0-7]{2,3}) |
5823             \\c [\x40-\x5F] |
5824             \\x\{ (?>[0-9A-Fa-f]+) \} |
5825             \\o\{ (?>[0-7]+) \} |
5826             \\[bBNpP]\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
5827             \\ $q_char |
5828             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5829             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5830             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5831             [\$\@] $qq_variable |
5832             \$ (?>\s* [0-9]+) |
5833             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5834             \$ \$ (?![\w\{]) |
5835             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5836             \[\^ |
5837             \[\: (?>[a-z]+) :\] |
5838             \[\:\^ (?>[a-z]+) :\] |
5839             \(\? |
5840             $q_char
5841             ))/oxmsg;
5842              
5843             # choice again delimiter
5844 1357 50       5642 if ($delimiter =~ / [\@:] /oxms) {
5845 0         0 my %octet = map {$_ => 1} @char;
  0         0  
5846 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
5847 0         0 $delimiter = '(';
5848 0         0 $end_delimiter = ')';
5849             }
5850             elsif (not $octet{'}'}) {
5851 0         0 $delimiter = '{';
5852 0         0 $end_delimiter = '}';
5853             }
5854             elsif (not $octet{']'}) {
5855 0         0 $delimiter = '[';
5856 0         0 $end_delimiter = ']';
5857             }
5858             elsif (not $octet{'>'}) {
5859 0         0 $delimiter = '<';
5860 0         0 $end_delimiter = '>';
5861             }
5862             else {
5863 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5864 0 0       0 if (not $octet{$char}) {
5865 0         0 $delimiter = $char;
5866 0         0 $end_delimiter = $char;
5867 0         0 last;
5868             }
5869             }
5870             }
5871             }
5872              
5873 1357         1308 my $left_e = 0;
5874 1357         1197 my $right_e = 0;
5875 1357         3077 for (my $i=0; $i <= $#char; $i++) {
5876              
5877             # "\L\u" --> "\u\L"
5878 3264 50 66     17798 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 66        
    100          
    100          
    100          
    100          
5879 0         0 @char[$i,$i+1] = @char[$i+1,$i];
5880             }
5881              
5882             # "\U\l" --> "\l\U"
5883             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5884 0         0 @char[$i,$i+1] = @char[$i+1,$i];
5885             }
5886              
5887             # octal escape sequence
5888             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5889 1         3 $char[$i] = Eeucjp::octchr($1);
5890             }
5891              
5892             # hexadecimal escape sequence
5893             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5894 1         3 $char[$i] = Eeucjp::hexchr($1);
5895             }
5896              
5897             # \b{...} --> b\{...}
5898             # \B{...} --> B\{...}
5899             # \N{CHARNAME} --> N\{CHARNAME}
5900             # \p{PROPERTY} --> p\{PROPERTY}
5901             # \P{PROPERTY} --> P\{PROPERTY}
5902             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
5903 6         14 $char[$i] = $1 . '\\' . $2;
5904             }
5905              
5906             # \p, \P, \X --> p, P, X
5907             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
5908 4         9 $char[$i] = $1;
5909             }
5910              
5911 3264 100 100     8946 if (0) {
    100 100        
    100 100        
    100          
    100          
    100          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
5912             }
5913              
5914             # join separated multiple-octet
5915 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
5916 6 50 33     89 if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
    50 33        
    50 33        
      33        
      66        
      33        
5917 0         0 $char[$i] .= join '', splice @char, $i+1, 3;
5918             }
5919             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)) {
5920 0         0 $char[$i] .= join '', splice @char, $i+1, 2;
5921             }
5922             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)) {
5923 0         0 $char[$i] .= join '', splice @char, $i+1, 1;
5924             }
5925             }
5926              
5927             # open character class [...]
5928             elsif ($char[$i] eq '[') {
5929 586         607 my $left = $i;
5930              
5931             # [] make die "Unmatched [] in regexp ...\n"
5932             # (and so on)
5933              
5934 586 100       1329 if ($char[$i+1] eq ']') {
5935 3         6 $i++;
5936             }
5937              
5938 586         468 while (1) {
5939 2583 50       3130 if (++$i > $#char) {
5940 0         0 die __FILE__, ": Unmatched [] in regexp\n";
5941             }
5942 2583 100       3371 if ($char[$i] eq ']') {
5943 586         500 my $right = $i;
5944              
5945             # [...]
5946 586 100       2788 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5947 90         161 splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
  270         328  
5948             }
5949             else {
5950 496         1555 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
5951             }
5952              
5953 586         753 $i = $left;
5954 586         1457 last;
5955             }
5956             }
5957             }
5958              
5959             # open character class [^...]
5960             elsif ($char[$i] eq '[^') {
5961 328         276 my $left = $i;
5962              
5963             # [^] make die "Unmatched [] in regexp ...\n"
5964             # (and so on)
5965              
5966 328 100       705 if ($char[$i+1] eq ']') {
5967 5         7 $i++;
5968             }
5969              
5970 328         233 while (1) {
5971 1447 50       1627 if (++$i > $#char) {
5972 0         0 die __FILE__, ": Unmatched [] in regexp\n";
5973             }
5974 1447 100       1752 if ($char[$i] eq ']') {
5975 328         246 my $right = $i;
5976              
5977             # [^...]
5978 328 100       1351 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5979 90         167 splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
  270         295  
5980             }
5981             else {
5982 238         589 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
5983             }
5984              
5985 328         406 $i = $left;
5986 328         753 last;
5987             }
5988             }
5989             }
5990              
5991             # rewrite character class or escape character
5992             elsif (my $char = character_class($char[$i],$modifier)) {
5993 215         644 $char[$i] = $char;
5994             }
5995              
5996             # /i modifier
5997             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
5998 54 50       84 if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
5999 54         84 $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
6000             }
6001             else {
6002 0         0 $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
6003             }
6004             }
6005              
6006             # \u \l \U \L \F \Q \E
6007             elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6008 1 50       18 if ($right_e < $left_e) {
6009 0         0 $char[$i] = '\\' . $char[$i];
6010             }
6011             }
6012             elsif ($char[$i] eq '\u') {
6013 0         0 $char[$i] = '@{[Eeucjp::ucfirst qq<';
6014 0         0 $left_e++;
6015             }
6016             elsif ($char[$i] eq '\l') {
6017 0         0 $char[$i] = '@{[Eeucjp::lcfirst qq<';
6018 0         0 $left_e++;
6019             }
6020             elsif ($char[$i] eq '\U') {
6021 1         1 $char[$i] = '@{[Eeucjp::uc qq<';
6022 1         5 $left_e++;
6023             }
6024             elsif ($char[$i] eq '\L') {
6025 1         2 $char[$i] = '@{[Eeucjp::lc qq<';
6026 1         4 $left_e++;
6027             }
6028             elsif ($char[$i] eq '\F') {
6029 9         9 $char[$i] = '@{[Eeucjp::fc qq<';
6030 9         33 $left_e++;
6031             }
6032             elsif ($char[$i] eq '\Q') {
6033 20         23 $char[$i] = '@{[CORE::quotemeta qq<';
6034 20         71 $left_e++;
6035             }
6036             elsif ($char[$i] eq '\E') {
6037 31 50       46 if ($right_e < $left_e) {
6038 31         31 $char[$i] = '>]}';
6039 31         105 $right_e++;
6040             }
6041             else {
6042 0         0 $char[$i] = '';
6043             }
6044             }
6045             elsif ($char[$i] eq '\Q') {
6046 0         0 while (1) {
6047 0 0       0 if (++$i > $#char) {
6048 0         0 last;
6049             }
6050 0 0       0 if ($char[$i] eq '\E') {
6051 0         0 last;
6052             }
6053             }
6054             }
6055             elsif ($char[$i] eq '\E') {
6056             }
6057              
6058             # $0 --> $0
6059             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6060 0 0       0 if ($ignorecase) {
6061 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6062             }
6063             }
6064             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6065 0 0       0 if ($ignorecase) {
6066 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6067             }
6068             }
6069              
6070             # $$ --> $$
6071             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6072             }
6073              
6074             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6075             # $1, $2, $3 --> $1, $2, $3 otherwise
6076             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6077 0         0 $char[$i] = e_capture($1);
6078 0 0       0 if ($ignorecase) {
6079 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6080             }
6081             }
6082             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6083 0         0 $char[$i] = e_capture($1);
6084 0 0       0 if ($ignorecase) {
6085 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6086             }
6087             }
6088              
6089             # $$foo[ ... ] --> $ $foo->[ ... ]
6090             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
6091 0         0 $char[$i] = e_capture($1.'->'.$2);
6092 0 0       0 if ($ignorecase) {
6093 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6094             }
6095             }
6096              
6097             # $$foo{ ... } --> $ $foo->{ ... }
6098             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
6099 0         0 $char[$i] = e_capture($1.'->'.$2);
6100 0 0       0 if ($ignorecase) {
6101 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6102             }
6103             }
6104              
6105             # $$foo
6106             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6107 0         0 $char[$i] = e_capture($1);
6108 0 0       0 if ($ignorecase) {
6109 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6110             }
6111             }
6112              
6113             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
6114             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6115 8 50       21 if ($ignorecase) {
6116 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::PREMATCH())]}';
6117             }
6118             else {
6119 8         49 $char[$i] = '@{[Eeucjp::PREMATCH()]}';
6120             }
6121             }
6122              
6123             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
6124             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6125 8 50       21 if ($ignorecase) {
6126 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::MATCH())]}';
6127             }
6128             else {
6129 8         45 $char[$i] = '@{[Eeucjp::MATCH()]}';
6130             }
6131             }
6132              
6133             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
6134             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6135 6 50       13 if ($ignorecase) {
6136 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::POSTMATCH())]}';
6137             }
6138             else {
6139 6         26 $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
6140             }
6141             }
6142              
6143             # ${ foo }
6144             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
6145 0 0       0 if ($ignorecase) {
6146 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6147             }
6148             }
6149              
6150             # ${ ... }
6151             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6152 0         0 $char[$i] = e_capture($1);
6153 0 0       0 if ($ignorecase) {
6154 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6155             }
6156             }
6157              
6158             # $scalar or @array
6159             elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6160 29         79 $char[$i] = e_string($char[$i]);
6161 29 100       165 if ($ignorecase) {
6162 4         19 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6163             }
6164             }
6165              
6166             # quote character before ? + * {
6167             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6168 188 100 66     1493 if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
    50          
6169             }
6170             elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6171 0         0 my $char = $char[$i-1];
6172 0 0       0 if ($char[$i] eq '{') {
6173 0         0 die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
6174             }
6175             else {
6176 0         0 die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
6177             }
6178             }
6179             else {
6180 187         991 $char[$i-1] = '(?:' . $char[$i-1] . ')';
6181             }
6182             }
6183             }
6184              
6185             # make regexp string
6186 1357         1622 $modifier =~ tr/i//d;
6187 1357 50       2632 if ($left_e > $right_e) {
6188 0 0 0     0 if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6189 0         0 return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
6190             }
6191             else {
6192 0         0 return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6193             }
6194             }
6195 1357 100 100     6684 if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6196 42         335 return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
6197             }
6198             else {
6199 1315         9370 return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6200             }
6201             }
6202              
6203             #
6204             # double quote stuff
6205             #
6206             sub qq_stuff {
6207 540     540 0 490 my($delimiter,$end_delimiter,$stuff) = @_;
6208              
6209             # scalar variable or array variable
6210 540 100       928 if ($stuff =~ /\A [\$\@] /oxms) {
6211 300         864 return $stuff;
6212             }
6213              
6214             # quote by delimiter
6215 240         429 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
  280         693  
6216 240         429 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6217 240 50       369 next if $char eq $delimiter;
6218 240 50       307 next if $char eq $end_delimiter;
6219 240 50       395 if (not $octet{$char}) {
6220 240         942 return join '', 'qq', $char, $stuff, $char;
6221             }
6222             }
6223 0         0 return join '', 'qq', '<', $stuff, '>';
6224             }
6225              
6226             #
6227             # escape regexp (m'', qr'', and m''b, qr''b)
6228             #
6229             sub e_qr_q {
6230 39     39 0 113 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6231 39   100     127 $modifier ||= '';
6232              
6233 39         84 $modifier =~ tr/p//d;
6234 39 50       92 if ($modifier =~ /([adlu])/oxms) {
6235 0         0 my $line = 0;
6236 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6237 0 0       0 if ($filename ne __FILE__) {
6238 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6239 0         0 last;
6240             }
6241             }
6242 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
6243             }
6244              
6245 39         45 $slash = 'div';
6246              
6247             # literal null string pattern
6248 39 100       96 if ($string eq '') {
    100          
6249 8         6 $modifier =~ tr/bB//d;
6250 8         7 $modifier =~ tr/i//d;
6251 8         34 return join '', $ope, $delimiter, $end_delimiter, $modifier;
6252             }
6253              
6254             # with /b /B modifier
6255             elsif ($modifier =~ tr/bB//d) {
6256 17         46 return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6257             }
6258              
6259             # without /b /B modifier
6260             else {
6261 14         47 return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6262             }
6263             }
6264              
6265             #
6266             # escape regexp (m'', qr'')
6267             #
6268             sub e_qr_qt {
6269 14     14 0 33 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6270              
6271 14 100       36 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6272              
6273             # split regexp
6274 14         596 my @char = $string =~ /\G((?>
6275             [^\x8E\x8F\xA1-\xFE\\\[\$\@\/] |
6276             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
6277             \[\^ |
6278             \[\: (?>[a-z]+) \:\] |
6279             \[\:\^ (?>[a-z]+) \:\] |
6280             [\$\@\/] |
6281             \\ (?:$q_char) |
6282             (?:$q_char)
6283             ))/oxmsg;
6284              
6285             # unescape character
6286 14         78 for (my $i=0; $i <= $#char; $i++) {
6287 27 50 100     150 if (0) {
    50 100        
    50 66        
    50          
    100          
    50          
6288             }
6289              
6290             # open character class [...]
6291 0         0 elsif ($char[$i] eq '[') {
6292 0         0 my $left = $i;
6293 0 0       0 if ($char[$i+1] eq ']') {
6294 0         0 $i++;
6295             }
6296 0         0 while (1) {
6297 0 0       0 if (++$i > $#char) {
6298 0         0 die __FILE__, ": Unmatched [] in regexp\n";
6299             }
6300 0 0       0 if ($char[$i] eq ']') {
6301 0         0 my $right = $i;
6302              
6303             # [...]
6304 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
6305              
6306 0         0 $i = $left;
6307 0         0 last;
6308             }
6309             }
6310             }
6311              
6312             # open character class [^...]
6313             elsif ($char[$i] eq '[^') {
6314 0         0 my $left = $i;
6315 0 0       0 if ($char[$i+1] eq ']') {
6316 0         0 $i++;
6317             }
6318 0         0 while (1) {
6319 0 0       0 if (++$i > $#char) {
6320 0         0 die __FILE__, ": Unmatched [] in regexp\n";
6321             }
6322 0 0       0 if ($char[$i] eq ']') {
6323 0         0 my $right = $i;
6324              
6325             # [^...]
6326 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6327              
6328 0         0 $i = $left;
6329 0         0 last;
6330             }
6331             }
6332             }
6333              
6334             # escape $ @ / and \
6335             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6336 0         0 $char[$i] = '\\' . $char[$i];
6337             }
6338              
6339             # rewrite character class or escape character
6340             elsif (my $char = character_class($char[$i],$modifier)) {
6341 0         0 $char[$i] = $char;
6342             }
6343              
6344             # /i modifier
6345             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
6346 4 50       11 if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
6347 4         8 $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
6348             }
6349             else {
6350 0         0 $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
6351             }
6352             }
6353              
6354             # quote character before ? + * {
6355             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6356 0 0       0 if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6357             }
6358             else {
6359 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
6360             }
6361             }
6362             }
6363              
6364 14         24 $delimiter = '/';
6365 14         15 $end_delimiter = '/';
6366              
6367 14         20 $modifier =~ tr/i//d;
6368 14         159 return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6369             }
6370              
6371             #
6372             # escape regexp (m''b, qr''b)
6373             #
6374             sub e_qr_qb {
6375 17     17 0 29 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6376              
6377             # split regexp
6378 17         86 my @char = $string =~ /\G ((?>[^\\]|\\\\|[\x00-\xFF])) /oxmsg;
6379              
6380             # unescape character
6381 17         52 for (my $i=0; $i <= $#char; $i++) {
6382 51 50       167 if (0) {
    50          
6383             }
6384              
6385             # remain \\
6386 0         0 elsif ($char[$i] eq '\\\\') {
6387             }
6388              
6389             # escape $ @ / and \
6390             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6391 0         0 $char[$i] = '\\' . $char[$i];
6392             }
6393             }
6394              
6395 17         21 $delimiter = '/';
6396 17         21 $end_delimiter = '/';
6397 17         106 return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6398             }
6399              
6400             #
6401             # escape regexp (s/here//)
6402             #
6403             sub e_s1 {
6404 122     122 0 226 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6405 122   100     381 $modifier ||= '';
6406              
6407 122         142 $modifier =~ tr/p//d;
6408 122 50       293 if ($modifier =~ /([adlu])/oxms) {
6409 0         0 my $line = 0;
6410 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6411 0 0       0 if ($filename ne __FILE__) {
6412 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6413 0         0 last;
6414             }
6415             }
6416 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
6417             }
6418              
6419 122         176 $slash = 'div';
6420              
6421             # literal null string pattern
6422 122 100       368 if ($string eq '') {
    100          
6423 8         9 $modifier =~ tr/bB//d;
6424 8         7 $modifier =~ tr/i//d;
6425 8         51 return join '', $ope, $delimiter, $end_delimiter, $modifier;
6426             }
6427              
6428             # /b /B modifier
6429             elsif ($modifier =~ tr/bB//d) {
6430              
6431             # choice again delimiter
6432 8 50       19 if ($delimiter =~ / [\@:] /oxms) {
6433 0         0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
6434 0         0 my %octet = map {$_ => 1} @char;
  0         0  
6435 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
6436 0         0 $delimiter = '(';
6437 0         0 $end_delimiter = ')';
6438             }
6439             elsif (not $octet{'}'}) {
6440 0         0 $delimiter = '{';
6441 0         0 $end_delimiter = '}';
6442             }
6443             elsif (not $octet{']'}) {
6444 0         0 $delimiter = '[';
6445 0         0 $end_delimiter = ']';
6446             }
6447             elsif (not $octet{'>'}) {
6448 0         0 $delimiter = '<';
6449 0         0 $end_delimiter = '>';
6450             }
6451             else {
6452 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6453 0 0       0 if (not $octet{$char}) {
6454 0         0 $delimiter = $char;
6455 0         0 $end_delimiter = $char;
6456 0         0 last;
6457             }
6458             }
6459             }
6460             }
6461              
6462 8         8 my $prematch = '';
6463 8         10 $prematch = q{(\G[\x00-\xFF]*?)};
6464 8         49 return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6465             }
6466              
6467 106 100       232 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6468 106         392 my $metachar = qr/[\@\\|[\]{^]/oxms;
6469              
6470             # split regexp
6471 106         38743 my @char = $string =~ /\G((?>
6472             [^\x8E\x8F\xA1-\xFE\\\$\@\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
6473             \\ (?>[1-9][0-9]*) |
6474             \\g (?>\s*) (?>[1-9][0-9]*) |
6475             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6476             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6477             \\x (?>[0-9A-Fa-f]{1,2}) |
6478             \\ (?>[0-7]{2,3}) |
6479             \\c [\x40-\x5F] |
6480             \\x\{ (?>[0-9A-Fa-f]+) \} |
6481             \\o\{ (?>[0-7]+) \} |
6482             \\[bBNpP]\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
6483             \\ $q_char |
6484             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6485             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6486             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6487             [\$\@] $qq_variable |
6488             \$ (?>\s* [0-9]+) |
6489             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6490             \$ \$ (?![\w\{]) |
6491             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6492             \[\^ |
6493             \[\: (?>[a-z]+) :\] |
6494             \[\:\^ (?>[a-z]+) :\] |
6495             \(\? |
6496             $q_char
6497             ))/oxmsg;
6498              
6499             # choice again delimiter
6500 106 50       1271 if ($delimiter =~ / [\@:] /oxms) {
6501 0         0 my %octet = map {$_ => 1} @char;
  0         0  
6502 0 0       0 if (not $octet{')'}) {
    0          
    0          
    0          
6503 0         0 $delimiter = '(';
6504 0         0 $end_delimiter = ')';
6505             }
6506             elsif (not $octet{'}'}) {
6507 0         0 $delimiter = '{';
6508 0         0 $end_delimiter = '}';
6509             }
6510             elsif (not $octet{']'}) {
6511 0         0 $delimiter = '[';
6512 0         0 $end_delimiter = ']';
6513             }
6514             elsif (not $octet{'>'}) {
6515 0         0 $delimiter = '<';
6516 0         0 $end_delimiter = '>';
6517             }
6518             else {
6519 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6520 0 0       0 if (not $octet{$char}) {
6521 0         0 $delimiter = $char;
6522 0         0 $end_delimiter = $char;
6523 0         0 last;
6524             }
6525             }
6526             }
6527             }
6528              
6529             # count '('
6530 106         173 my $parens = grep { $_ eq '(' } @char;
  436         599  
6531              
6532 106         140 my $left_e = 0;
6533 106         131 my $right_e = 0;
6534 106         326 for (my $i=0; $i <= $#char; $i++) {
6535              
6536             # "\L\u" --> "\u\L"
6537 357 50 33     2304 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
    50          
6538 0         0 @char[$i,$i+1] = @char[$i+1,$i];
6539             }
6540              
6541             # "\U\l" --> "\l\U"
6542             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6543 0         0 @char[$i,$i+1] = @char[$i+1,$i];
6544             }
6545              
6546             # octal escape sequence
6547             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6548 1         2 $char[$i] = Eeucjp::octchr($1);
6549             }
6550              
6551             # hexadecimal escape sequence
6552             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6553 1         2 $char[$i] = Eeucjp::hexchr($1);
6554             }
6555              
6556             # \b{...} --> b\{...}
6557             # \B{...} --> B\{...}
6558             # \N{CHARNAME} --> N\{CHARNAME}
6559             # \p{PROPERTY} --> p\{PROPERTY}
6560             # \P{PROPERTY} --> P\{PROPERTY}
6561             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
6562 0         0 $char[$i] = $1 . '\\' . $2;
6563             }
6564              
6565             # \p, \P, \X --> p, P, X
6566             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6567 0         0 $char[$i] = $1;
6568             }
6569              
6570 357 50 100     1212 if (0) {
    100 100        
    50 100        
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
6571             }
6572              
6573             # join separated multiple-octet
6574 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6575 0 0 0     0 if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
    0 0        
    0 0        
      0        
      0        
      0        
6576 0         0 $char[$i] .= join '', splice @char, $i+1, 3;
6577             }
6578             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)) {
6579 0         0 $char[$i] .= join '', splice @char, $i+1, 2;
6580             }
6581             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)) {
6582 0         0 $char[$i] .= join '', splice @char, $i+1, 1;
6583             }
6584             }
6585              
6586             # open character class [...]
6587             elsif ($char[$i] eq '[') {
6588 20         24 my $left = $i;
6589 20 50       87 if ($char[$i+1] eq ']') {
6590 0         0 $i++;
6591             }
6592 20         17 while (1) {
6593 79 50       171 if (++$i > $#char) {
6594 0         0 die __FILE__, ": Unmatched [] in regexp\n";
6595             }
6596 79 100       114 if ($char[$i] eq ']') {
6597 20         21 my $right = $i;
6598              
6599             # [...]
6600 20 50       133 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6601 0         0 splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
  0         0  
6602             }
6603             else {
6604 20         181 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
6605             }
6606              
6607 20         26 $i = $left;
6608 20         58 last;
6609             }
6610             }
6611             }
6612              
6613             # open character class [^...]
6614             elsif ($char[$i] eq '[^') {
6615 0         0 my $left = $i;
6616 0 0       0 if ($char[$i+1] eq ']') {
6617 0         0 $i++;
6618             }
6619 0         0 while (1) {
6620 0 0       0 if (++$i > $#char) {
6621 0         0 die __FILE__, ": Unmatched [] in regexp\n";
6622             }
6623 0 0       0 if ($char[$i] eq ']') {
6624 0         0 my $right = $i;
6625              
6626             # [^...]
6627 0 0       0 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6628 0         0 splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
  0         0  
6629             }
6630             else {
6631 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6632             }
6633              
6634 0         0 $i = $left;
6635 0         0 last;
6636             }
6637             }
6638             }
6639              
6640             # rewrite character class or escape character
6641             elsif (my $char = character_class($char[$i],$modifier)) {
6642 11         28 $char[$i] = $char;
6643             }
6644              
6645             # /i modifier
6646             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
6647 5 50       10 if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
6648 5         8 $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
6649             }
6650             else {
6651 0         0 $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
6652             }
6653             }
6654              
6655             # \u \l \U \L \F \Q \E
6656             elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6657 8 50       90 if ($right_e < $left_e) {
6658 0         0 $char[$i] = '\\' . $char[$i];
6659             }
6660             }
6661             elsif ($char[$i] eq '\u') {
6662 0         0 $char[$i] = '@{[Eeucjp::ucfirst qq<';
6663 0         0 $left_e++;
6664             }
6665             elsif ($char[$i] eq '\l') {
6666 0         0 $char[$i] = '@{[Eeucjp::lcfirst qq<';
6667 0         0 $left_e++;
6668             }
6669             elsif ($char[$i] eq '\U') {
6670 0         0 $char[$i] = '@{[Eeucjp::uc qq<';
6671 0         0 $left_e++;
6672             }
6673             elsif ($char[$i] eq '\L') {
6674 0         0 $char[$i] = '@{[Eeucjp::lc qq<';
6675 0         0 $left_e++;
6676             }
6677             elsif ($char[$i] eq '\F') {
6678 0         0 $char[$i] = '@{[Eeucjp::fc qq<';
6679 0         0 $left_e++;
6680             }
6681             elsif ($char[$i] eq '\Q') {
6682 5         6 $char[$i] = '@{[CORE::quotemeta qq<';
6683 5         15 $left_e++;
6684             }
6685             elsif ($char[$i] eq '\E') {
6686 5 50       7 if ($right_e < $left_e) {
6687 5         5 $char[$i] = '>]}';
6688 5         20 $right_e++;
6689             }
6690             else {
6691 0         0 $char[$i] = '';
6692             }
6693             }
6694             elsif ($char[$i] eq '\Q') {
6695 0         0 while (1) {
6696 0 0       0 if (++$i > $#char) {
6697 0         0 last;
6698             }
6699 0 0       0 if ($char[$i] eq '\E') {
6700 0         0 last;
6701             }
6702             }
6703             }
6704             elsif ($char[$i] eq '\E') {
6705             }
6706              
6707             # \0 --> \0
6708             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
6709             }
6710              
6711             # \g{N}, \g{-N}
6712              
6713             # P.108 Using Simple Patterns
6714             # in Chapter 7: In the World of Regular Expressions
6715             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
6716              
6717             # P.221 Capturing
6718             # in Chapter 5: Pattern Matching
6719             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6720              
6721             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
6722             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6723             }
6724              
6725             # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
6726             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6727 0 0       0 if ($1 <= $parens) {
6728 0         0 $char[$i] = '\\g{' . ($1 + 1) . '}';
6729             }
6730             }
6731              
6732             # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
6733             elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6734 0 0       0 if ($1 <= $parens) {
6735 0         0 $char[$i] = '\\g' . ($1 + 1);
6736             }
6737             }
6738              
6739             # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
6740             elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6741 0 0       0 if ($1 <= $parens) {
6742 0         0 $char[$i] = '\\' . ($1 + 1);
6743             }
6744             }
6745              
6746             # $0 --> $0
6747             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6748 0 0       0 if ($ignorecase) {
6749 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6750             }
6751             }
6752             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6753 0 0       0 if ($ignorecase) {
6754 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6755             }
6756             }
6757              
6758             # $$ --> $$
6759             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6760             }
6761              
6762             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6763             # $1, $2, $3 --> $1, $2, $3 otherwise
6764             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6765 0         0 $char[$i] = e_capture($1);
6766 0 0       0 if ($ignorecase) {
6767 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6768             }
6769             }
6770             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6771 0         0 $char[$i] = e_capture($1);
6772 0 0       0 if ($ignorecase) {
6773 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6774             }
6775             }
6776              
6777             # $$foo[ ... ] --> $ $foo->[ ... ]
6778             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
6779 0         0 $char[$i] = e_capture($1.'->'.$2);
6780 0 0       0 if ($ignorecase) {
6781 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6782             }
6783             }
6784              
6785             # $$foo{ ... } --> $ $foo->{ ... }
6786             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
6787 0         0 $char[$i] = e_capture($1.'->'.$2);
6788 0 0       0 if ($ignorecase) {
6789 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6790             }
6791             }
6792              
6793             # $$foo
6794             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6795 0         0 $char[$i] = e_capture($1);
6796 0 0       0 if ($ignorecase) {
6797 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6798             }
6799             }
6800              
6801             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
6802             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6803 4 50       12 if ($ignorecase) {
6804 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::PREMATCH())]}';
6805             }
6806             else {
6807 4         23 $char[$i] = '@{[Eeucjp::PREMATCH()]}';
6808             }
6809             }
6810              
6811             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
6812             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6813 4 50       14 if ($ignorecase) {
6814 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::MATCH())]}';
6815             }
6816             else {
6817 4         25 $char[$i] = '@{[Eeucjp::MATCH()]}';
6818             }
6819             }
6820              
6821             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
6822             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6823 3 50       8 if ($ignorecase) {
6824 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::POSTMATCH())]}';
6825             }
6826             else {
6827 3         18 $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
6828             }
6829             }
6830              
6831             # ${ foo }
6832             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
6833 0 0       0 if ($ignorecase) {
6834 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6835             }
6836             }
6837              
6838             # ${ ... }
6839             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6840 0         0 $char[$i] = e_capture($1);
6841 0 0       0 if ($ignorecase) {
6842 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6843             }
6844             }
6845              
6846             # $scalar or @array
6847             elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6848 9         20 $char[$i] = e_string($char[$i]);
6849 9 50       58 if ($ignorecase) {
6850 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6851             }
6852             }
6853              
6854             # quote character before ? + * {
6855             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6856 23 50       102 if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6857             }
6858             else {
6859 23         148 $char[$i-1] = '(?:' . $char[$i-1] . ')';
6860             }
6861             }
6862             }
6863              
6864             # make regexp string
6865 106         231 my $prematch = '';
6866 106 50       281 if ($] >= 5.010) {
6867 106         265 $prematch = "(?<_PREMATCH>$anchor)";
6868             }
6869             else {
6870 0         0 $prematch = "($anchor)";
6871             }
6872 106         146 $modifier =~ tr/i//d;
6873 106 50       308 if ($left_e > $right_e) {
6874 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6875             }
6876 106         1237 return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6877             }
6878              
6879             #
6880             # escape regexp (s'here'' or s'here''b)
6881             #
6882             sub e_s1_q {
6883 34     34 0 48 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6884 34   100     95 $modifier ||= '';
6885              
6886 34         34 $modifier =~ tr/p//d;
6887 34 50       128 if ($modifier =~ /([adlu])/oxms) {
6888 0         0 my $line = 0;
6889 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6890 0 0       0 if ($filename ne __FILE__) {
6891 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6892 0         0 last;
6893             }
6894             }
6895 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
6896             }
6897              
6898 34         41 $slash = 'div';
6899              
6900             # literal null string pattern
6901 34 100       65 if ($string eq '') {
    100          
6902 8         8 $modifier =~ tr/bB//d;
6903 8         6 $modifier =~ tr/i//d;
6904 8         40 return join '', $ope, $delimiter, $end_delimiter, $modifier;
6905             }
6906              
6907             # with /b /B modifier
6908             elsif ($modifier =~ tr/bB//d) {
6909 8         19 return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6910             }
6911              
6912             # without /b /B modifier
6913             else {
6914 18         38 return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6915             }
6916             }
6917              
6918             #
6919             # escape regexp (s'here'')
6920             #
6921             sub e_s1_qt {
6922 18     18 0 23 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6923              
6924 18 100       41 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6925              
6926             # split regexp
6927 18         586 my @char = $string =~ /\G((?>
6928             [^\x8E\x8F\xA1-\xFE\\\[\$\@\/] |
6929             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
6930             \[\^ |
6931             \[\: (?>[a-z]+) \:\] |
6932             \[\:\^ (?>[a-z]+) \:\] |
6933             [\$\@\/] |
6934             \\ (?:$q_char) |
6935             (?:$q_char)
6936             ))/oxmsg;
6937              
6938             # unescape character
6939 18         63 for (my $i=0; $i <= $#char; $i++) {
6940 36 50 100     146 if (0) {
    50 100        
    50 66        
    100          
    100          
    50          
6941             }
6942              
6943             # open character class [...]
6944 0         0 elsif ($char[$i] eq '[') {
6945 0         0 my $left = $i;
6946 0 0       0 if ($char[$i+1] eq ']') {
6947 0         0 $i++;
6948             }
6949 0         0 while (1) {
6950 0 0       0 if (++$i > $#char) {
6951 0         0 die __FILE__, ": Unmatched [] in regexp\n";
6952             }
6953 0 0       0 if ($char[$i] eq ']') {
6954 0         0 my $right = $i;
6955              
6956             # [...]
6957 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
6958              
6959 0         0 $i = $left;
6960 0         0 last;
6961             }
6962             }
6963             }
6964              
6965             # open character class [^...]
6966             elsif ($char[$i] eq '[^') {
6967 0         0 my $left = $i;
6968 0 0       0 if ($char[$i+1] eq ']') {
6969 0         0 $i++;
6970             }
6971 0         0 while (1) {
6972 0 0       0 if (++$i > $#char) {
6973 0         0 die __FILE__, ": Unmatched [] in regexp\n";
6974             }
6975 0 0       0 if ($char[$i] eq ']') {
6976 0         0 my $right = $i;
6977              
6978             # [^...]
6979 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6980              
6981 0         0 $i = $left;
6982 0         0 last;
6983             }
6984             }
6985             }
6986              
6987             # escape $ @ / and \
6988             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6989 0         0 $char[$i] = '\\' . $char[$i];
6990             }
6991              
6992             # rewrite character class or escape character
6993             elsif (my $char = character_class($char[$i],$modifier)) {
6994 6         14 $char[$i] = $char;
6995             }
6996              
6997             # /i modifier
6998             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
6999 2 50       4 if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
7000 2         4 $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
7001             }
7002             else {
7003 0         0 $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
7004             }
7005             }
7006              
7007             # quote character before ? + * {
7008             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7009 0 0       0 if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7010             }
7011             else {
7012 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
7013             }
7014             }
7015             }
7016              
7017 18         20 $modifier =~ tr/i//d;
7018 18         24 $delimiter = '/';
7019 18         15 $end_delimiter = '/';
7020 18         17 my $prematch = '';
7021 18 50       31 if ($] >= 5.010) {
7022 18         37 $prematch = "(?<_PREMATCH>$anchor)";
7023             }
7024             else {
7025 0         0 $prematch = "($anchor)";
7026             }
7027 18         138 return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7028             }
7029              
7030             #
7031             # escape regexp (s'here''b)
7032             #
7033             sub e_s1_qb {
7034 8     8 0 16 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7035              
7036             # split regexp
7037 8         31 my @char = $string =~ /\G (?>[^\\]|\\\\|[\x00-\xFF]) /oxmsg;
7038              
7039             # unescape character
7040 8         23 for (my $i=0; $i <= $#char; $i++) {
7041 24 50       77 if (0) {
    50          
7042             }
7043              
7044             # remain \\
7045 0         0 elsif ($char[$i] eq '\\\\') {
7046             }
7047              
7048             # escape $ @ / and \
7049             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7050 0         0 $char[$i] = '\\' . $char[$i];
7051             }
7052             }
7053              
7054 8         8 $delimiter = '/';
7055 8         9 $end_delimiter = '/';
7056 8         9 my $prematch = '';
7057 8         6 $prematch = q{(\G[\x00-\xFF]*?)};
7058 8         70 return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7059             }
7060              
7061             #
7062             # escape regexp (s''here')
7063             #
7064             sub e_s2_q {
7065 29     29 0 38 my($ope,$delimiter,$end_delimiter,$string) = @_;
7066              
7067 29         31 $slash = 'div';
7068              
7069 29         244 my @char = $string =~ / \G (?>[^\x8E\x8F\xA1-\xFE\\]|\\\\|$q_char) /oxmsg;
7070 29         80 for (my $i=0; $i <= $#char; $i++) {
7071 9 100       29 if (0) {
    100          
7072             }
7073              
7074             # not escape \\
7075 0         0 elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
7076             }
7077              
7078             # escape $ @ / and \
7079             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7080 5         15 $char[$i] = '\\' . $char[$i];
7081             }
7082             }
7083              
7084 29         83 return join '', $ope, $delimiter, @char, $end_delimiter;
7085             }
7086              
7087             #
7088             # escape regexp (s/here/and here/modifier)
7089             #
7090             sub e_sub {
7091 156     156 0 691 my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
7092 156   100     503 $modifier ||= '';
7093              
7094 156         249 $modifier =~ tr/p//d;
7095 156 50       420 if ($modifier =~ /([adlu])/oxms) {
7096 0         0 my $line = 0;
7097 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7098 0 0       0 if ($filename ne __FILE__) {
7099 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7100 0         0 last;
7101             }
7102             }
7103 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
7104             }
7105              
7106 156 100       347 if ($variable eq '') {
7107 37         35 $variable = '$_';
7108 37         39 $bind_operator = ' =~ ';
7109             }
7110              
7111 156         195 $slash = 'div';
7112              
7113             # P.128 Start of match (or end of previous match): \G
7114             # P.130 Advanced Use of \G with Perl
7115             # in Chapter 3: Overview of Regular Expression Features and Flavors
7116             # P.312 Iterative Matching: Scalar Context, with /g
7117             # in Chapter 7: Perl
7118             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
7119              
7120             # P.181 Where You Left Off: The \G Assertion
7121             # in Chapter 5: Pattern Matching
7122             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7123              
7124             # P.220 Where You Left Off: The \G Assertion
7125             # in Chapter 5: Pattern Matching
7126             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7127              
7128 156         207 my $e_modifier = $modifier =~ tr/e//d;
7129 156         176 my $r_modifier = $modifier =~ tr/r//d;
7130              
7131 156         178 my $my = '';
7132 156 50       350 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
7133 0         0 $my = $variable;
7134 0         0 $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
7135 0         0 $variable =~ s/ = .+ \z//oxms;
7136             }
7137              
7138 156         320 (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
7139 156         222 $variable_basename =~ s/ \s+ \z//oxms;
7140              
7141             # quote replacement string
7142 156         158 my $e_replacement = '';
7143 156 100       313 if ($e_modifier >= 1) {
7144 17         32 $e_replacement = e_qq('', '', '', $replacement);
7145 17         19 $e_modifier--;
7146             }
7147             else {
7148 139 100       275 if ($delimiter2 eq "'") {
7149 29         54 $e_replacement = e_s2_q('qq', '/', '/', $replacement);
7150             }
7151             else {
7152 110         234 $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
7153             }
7154             }
7155              
7156 156         207 my $sub = '';
7157              
7158             # with /r
7159 156 100       330 if ($r_modifier) {
7160 8 100       25 if (0) {
    50          
7161             }
7162              
7163             # s///gr with multibyte anchoring
7164 0         0 elsif ($modifier =~ /g/oxms) {
7165 4 50       16 $sub = sprintf(
7166             # 1 2 3 4 5
7167             q,
7168              
7169             $variable, # 1
7170             ($delimiter1 eq "'") ? # 2
7171             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7172             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7173             $s_matched, # 3
7174             $e_replacement, # 4
7175             '$EUCJP::re_r=CORE::eval $EUCJP::re_r; ' x $e_modifier, # 5
7176             );
7177             }
7178              
7179             # s///gr without multibyte anchoring
7180             elsif ($modifier =~ /g/oxms) {
7181 0 0       0 $sub = sprintf(
7182             # 1 2 3 4 5
7183             q,
7184              
7185             $variable, # 1
7186             ($delimiter1 eq "'") ? # 2
7187             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7188             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7189             $s_matched, # 3
7190             $e_replacement, # 4
7191             '$EUCJP::re_r=CORE::eval $EUCJP::re_r; ' x $e_modifier, # 5
7192             );
7193             }
7194              
7195             # s///r
7196             else {
7197              
7198 4         3 my $prematch = q{$`};
7199 4 50       7 if ($] >= 5.010) {
7200 4         4 $prematch = q{$+{_PREMATCH}};
7201             }
7202             else {
7203 0         0 $prematch = q{${1}};
7204             }
7205              
7206 4 50       11 $sub = sprintf(
7207             # 1 2 3 4 5 6 7
7208             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $EUCJP::re_r=%s; %s"%s$EUCJP::re_r$'" } : %s>,
7209              
7210             $variable, # 1
7211             ($delimiter1 eq "'") ? # 2
7212             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7213             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7214             $s_matched, # 3
7215             $e_replacement, # 4
7216             '$EUCJP::re_r=CORE::eval $EUCJP::re_r; ' x $e_modifier, # 5
7217             $prematch, # 6
7218             $variable, # 7
7219             );
7220             }
7221              
7222             # $var !~ s///r doesn't make sense
7223 8 50       19 if ($bind_operator =~ / !~ /oxms) {
7224 0         0 $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
7225             }
7226             }
7227              
7228             # without /r
7229             else {
7230 148 100       420 if (0) {
    50          
7231             }
7232              
7233             # s///g with multibyte anchoring
7234 0         0 elsif ($modifier =~ /g/oxms) {
7235 29 100       111 $sub = sprintf(
    100          
7236             # 1 2 3 4 5 6 7 8 9 10
7237             q,
7238              
7239             $variable, # 1
7240             ($delimiter1 eq "'") ? # 2
7241             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7242             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7243             $s_matched, # 3
7244             $e_replacement, # 4
7245             '$EUCJP::re_r=CORE::eval $EUCJP::re_r; ' x $e_modifier, # 5
7246             $variable, # 6
7247             $variable, # 7
7248             $variable, # 8
7249             $variable, # 9
7250              
7251             # Binary "!~" is just like "=~" except the return value is negated in the logical sense.
7252             # It returns false if the match succeeds, and true if it fails.
7253             # (and so on)
7254              
7255             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 10
7256             );
7257             }
7258              
7259             # s///g without multibyte anchoring
7260             elsif ($modifier =~ /g/oxms) {
7261 0 0       0 $sub = sprintf(
    0          
7262             # 1 2 3 4 5 6 7 8
7263             q,
7264              
7265             $variable, # 1
7266             ($delimiter1 eq "'") ? # 2
7267             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7268             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7269             $s_matched, # 3
7270             $e_replacement, # 4
7271             '$EUCJP::re_r=CORE::eval $EUCJP::re_r; ' x $e_modifier, # 5
7272             $variable, # 6
7273             $variable, # 7
7274             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
7275             );
7276             }
7277              
7278             # s///
7279             else {
7280              
7281 119         149 my $prematch = q{$`};
7282 119 50       270 if ($] >= 5.010) {
7283 119         137 $prematch = q{$+{_PREMATCH}};
7284             }
7285             else {
7286 0         0 $prematch = q{${1}};
7287             }
7288              
7289 119 100       600 $sub = sprintf(
    100          
7290              
7291             ($bind_operator =~ / =~ /oxms) ?
7292              
7293             # 1 2 3 4 5 6 7 8
7294             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $EUCJP::re_r=%s; %s%s="%s$EUCJP::re_r$'"; 1 } : undef> :
7295              
7296             # 1 2 3 4 5 6 7 8
7297             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $EUCJP::re_r=%s; %s%s="%s$EUCJP::re_r$'"; undef }>,
7298              
7299             $variable, # 1
7300             $bind_operator, # 2
7301             ($delimiter1 eq "'") ? # 3
7302             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7303             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7304             $s_matched, # 4
7305             $e_replacement, # 5
7306             '$EUCJP::re_r=CORE::eval $EUCJP::re_r; ' x $e_modifier, # 6
7307             $variable, # 7
7308             $prematch, # 8
7309             );
7310             }
7311             }
7312              
7313             # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
7314 156 50       397 if ($my ne '') {
7315 0         0 $sub = "($my, $sub)[1]";
7316             }
7317              
7318             # clear s/// variable
7319 156         235 $sub_variable = '';
7320 156         210 $bind_operator = '';
7321              
7322 156         1648 return $sub;
7323             }
7324              
7325             #
7326             # escape regexp of split qr//
7327             #
7328             sub e_split {
7329 137     137 0 333 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7330 137   100     422 $modifier ||= '';
7331              
7332 137         180 $modifier =~ tr/p//d;
7333 137 50       323 if ($modifier =~ /([adlu])/oxms) {
7334 0         0 my $line = 0;
7335 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7336 0 0       0 if ($filename ne __FILE__) {
7337 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7338 0         0 last;
7339             }
7340             }
7341 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
7342             }
7343              
7344 137         159 $slash = 'div';
7345              
7346             # /b /B modifier
7347 137 100       264 if ($modifier =~ tr/bB//d) {
7348 18         76 return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7349             }
7350              
7351 119 100       244 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7352 119         438 my $metachar = qr/[\@\\|[\]{^]/oxms;
7353              
7354             # split regexp
7355 119         15549 my @char = $string =~ /\G((?>
7356             [^\x8E\x8F\xA1-\xFE\\\$\@\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
7357             \\x (?>[0-9A-Fa-f]{1,2}) |
7358             \\ (?>[0-7]{2,3}) |
7359             \\c [\x40-\x5F] |
7360             \\x\{ (?>[0-9A-Fa-f]+) \} |
7361             \\o\{ (?>[0-7]+) \} |
7362             \\[bBNpP]\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
7363             \\ $q_char |
7364             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7365             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7366             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7367             [\$\@] $qq_variable |
7368             \$ (?>\s* [0-9]+) |
7369             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7370             \$ \$ (?![\w\{]) |
7371             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7372             \[\^ |
7373             \[\: (?>[a-z]+) :\] |
7374             \[\:\^ (?>[a-z]+) :\] |
7375             \(\? |
7376             $q_char
7377             ))/oxmsg;
7378              
7379 119         461 my $left_e = 0;
7380 119         119 my $right_e = 0;
7381 119         344 for (my $i=0; $i <= $#char; $i++) {
7382              
7383             # "\L\u" --> "\u\L"
7384 302 50 33     1801 if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
    50 33        
    100          
    100          
    50          
    50          
7385 0         0 @char[$i,$i+1] = @char[$i+1,$i];
7386             }
7387              
7388             # "\U\l" --> "\l\U"
7389             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7390 0         0 @char[$i,$i+1] = @char[$i+1,$i];
7391             }
7392              
7393             # octal escape sequence
7394             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7395 1         4 $char[$i] = Eeucjp::octchr($1);
7396             }
7397              
7398             # hexadecimal escape sequence
7399             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7400 1         3 $char[$i] = Eeucjp::hexchr($1);
7401             }
7402              
7403             # \b{...} --> b\{...}
7404             # \B{...} --> B\{...}
7405             # \N{CHARNAME} --> N\{CHARNAME}
7406             # \p{PROPERTY} --> p\{PROPERTY}
7407             # \P{PROPERTY} --> P\{PROPERTY}
7408             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
7409 0         0 $char[$i] = $1 . '\\' . $2;
7410             }
7411              
7412             # \p, \P, \X --> p, P, X
7413             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7414 0         0 $char[$i] = $1;
7415             }
7416              
7417 302 50 100     928 if (0) {
    100 100        
    100 66        
    100 100        
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
7418             }
7419              
7420             # join separated multiple-octet
7421 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7422 0 0 0     0 if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
    0 0        
    0 0        
      0        
      0        
      0        
7423 0         0 $char[$i] .= join '', splice @char, $i+1, 3;
7424             }
7425             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)) {
7426 0         0 $char[$i] .= join '', splice @char, $i+1, 2;
7427             }
7428             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)) {
7429 0         0 $char[$i] .= join '', splice @char, $i+1, 1;
7430             }
7431             }
7432              
7433             # open character class [...]
7434             elsif ($char[$i] eq '[') {
7435 3         4 my $left = $i;
7436 3 50       7 if ($char[$i+1] eq ']') {
7437 0         0 $i++;
7438             }
7439 3         4 while (1) {
7440 7 50       10 if (++$i > $#char) {
7441 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7442             }
7443 7 100       13 if ($char[$i] eq ']') {
7444 3         4 my $right = $i;
7445              
7446             # [...]
7447 3 50       16 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7448 0         0 splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
  0         0  
7449             }
7450             else {
7451 3         13 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
7452             }
7453              
7454 3         4 $i = $left;
7455 3         8 last;
7456             }
7457             }
7458             }
7459              
7460             # open character class [^...]
7461             elsif ($char[$i] eq '[^') {
7462 1         2 my $left = $i;
7463 1 50       4 if ($char[$i+1] eq ']') {
7464 0         0 $i++;
7465             }
7466 1         2 while (1) {
7467 2 50       5 if (++$i > $#char) {
7468 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7469             }
7470 2 100       4 if ($char[$i] eq ']') {
7471 1         1 my $right = $i;
7472              
7473             # [^...]
7474 1 50       8 if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7475 0         0 splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
  0         0  
7476             }
7477             else {
7478 1         6 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7479             }
7480              
7481 1         1 $i = $left;
7482 1         3 last;
7483             }
7484             }
7485             }
7486              
7487             # rewrite character class or escape character
7488             elsif (my $char = character_class($char[$i],$modifier)) {
7489 5         17 $char[$i] = $char;
7490             }
7491              
7492             # P.794 29.2.161. split
7493             # in Chapter 29: Functions
7494             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7495              
7496             # P.951 split
7497             # in Chapter 27: Functions
7498             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7499              
7500             # said "The //m modifier is assumed when you split on the pattern /^/",
7501             # but perl5.008 is not so. Therefore, this software adds //m.
7502             # (and so on)
7503              
7504             # split(m/^/) --> split(m/^/m)
7505             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7506 11         48 $modifier .= 'm';
7507             }
7508              
7509             # /i modifier
7510             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
7511 6 50       12 if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
7512 6         15 $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
7513             }
7514             else {
7515 0         0 $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
7516             }
7517             }
7518              
7519             # \u \l \U \L \F \Q \E
7520             elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
7521 2 50       9 if ($right_e < $left_e) {
7522 0         0 $char[$i] = '\\' . $char[$i];
7523             }
7524             }
7525             elsif ($char[$i] eq '\u') {
7526 0         0 $char[$i] = '@{[Eeucjp::ucfirst qq<';
7527 0         0 $left_e++;
7528             }
7529             elsif ($char[$i] eq '\l') {
7530 0         0 $char[$i] = '@{[Eeucjp::lcfirst qq<';
7531 0         0 $left_e++;
7532             }
7533             elsif ($char[$i] eq '\U') {
7534 0         0 $char[$i] = '@{[Eeucjp::uc qq<';
7535 0         0 $left_e++;
7536             }
7537             elsif ($char[$i] eq '\L') {
7538 0         0 $char[$i] = '@{[Eeucjp::lc qq<';
7539 0         0 $left_e++;
7540             }
7541             elsif ($char[$i] eq '\F') {
7542 0         0 $char[$i] = '@{[Eeucjp::fc qq<';
7543 0         0 $left_e++;
7544             }
7545             elsif ($char[$i] eq '\Q') {
7546 0         0 $char[$i] = '@{[CORE::quotemeta qq<';
7547 0         0 $left_e++;
7548             }
7549             elsif ($char[$i] eq '\E') {
7550 0 0       0 if ($right_e < $left_e) {
7551 0         0 $char[$i] = '>]}';
7552 0         0 $right_e++;
7553             }
7554             else {
7555 0         0 $char[$i] = '';
7556             }
7557             }
7558             elsif ($char[$i] eq '\Q') {
7559 0         0 while (1) {
7560 0 0       0 if (++$i > $#char) {
7561 0         0 last;
7562             }
7563 0 0       0 if ($char[$i] eq '\E') {
7564 0         0 last;
7565             }
7566             }
7567             }
7568             elsif ($char[$i] eq '\E') {
7569             }
7570              
7571             # $0 --> $0
7572             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7573 0 0       0 if ($ignorecase) {
7574 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7575             }
7576             }
7577             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7578 0 0       0 if ($ignorecase) {
7579 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7580             }
7581             }
7582              
7583             # $$ --> $$
7584             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7585             }
7586              
7587             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7588             # $1, $2, $3 --> $1, $2, $3 otherwise
7589             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7590 0         0 $char[$i] = e_capture($1);
7591 0 0       0 if ($ignorecase) {
7592 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7593             }
7594             }
7595             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7596 0         0 $char[$i] = e_capture($1);
7597 0 0       0 if ($ignorecase) {
7598 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7599             }
7600             }
7601              
7602             # $$foo[ ... ] --> $ $foo->[ ... ]
7603             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
7604 0         0 $char[$i] = e_capture($1.'->'.$2);
7605 0 0       0 if ($ignorecase) {
7606 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7607             }
7608             }
7609              
7610             # $$foo{ ... } --> $ $foo->{ ... }
7611             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
7612 0         0 $char[$i] = e_capture($1.'->'.$2);
7613 0 0       0 if ($ignorecase) {
7614 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7615             }
7616             }
7617              
7618             # $$foo
7619             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7620 0         0 $char[$i] = e_capture($1);
7621 0 0       0 if ($ignorecase) {
7622 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7623             }
7624             }
7625              
7626             # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
7627             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7628 12 50       21 if ($ignorecase) {
7629 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::PREMATCH())]}';
7630             }
7631             else {
7632 12         80 $char[$i] = '@{[Eeucjp::PREMATCH()]}';
7633             }
7634             }
7635              
7636             # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
7637             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7638 12 50       22 if ($ignorecase) {
7639 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::MATCH())]}';
7640             }
7641             else {
7642 12         85 $char[$i] = '@{[Eeucjp::MATCH()]}';
7643             }
7644             }
7645              
7646             # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
7647             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7648 9 50       17 if ($ignorecase) {
7649 0         0 $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::POSTMATCH())]}';
7650             }
7651             else {
7652 9         69 $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
7653             }
7654             }
7655              
7656             # ${ foo }
7657             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
7658 0 0       0 if ($ignorecase) {
7659 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $1 . ')]}';
7660             }
7661             }
7662              
7663             # ${ ... }
7664             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7665 0         0 $char[$i] = e_capture($1);
7666 0 0       0 if ($ignorecase) {
7667 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7668             }
7669             }
7670              
7671             # $scalar or @array
7672             elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7673 3         5 $char[$i] = e_string($char[$i]);
7674 3 50       21 if ($ignorecase) {
7675 0         0 $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7676             }
7677             }
7678              
7679             # quote character before ? + * {
7680             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7681 7 100       44 if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7682             }
7683             else {
7684 4         31 $char[$i-1] = '(?:' . $char[$i-1] . ')';
7685             }
7686             }
7687             }
7688              
7689             # make regexp string
7690 119         155 $modifier =~ tr/i//d;
7691 119 50       245 if ($left_e > $right_e) {
7692 0         0 return join '', 'Eeucjp::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
7693             }
7694 119         1137 return join '', 'Eeucjp::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7695             }
7696              
7697             #
7698             # escape regexp of split qr''
7699             #
7700             sub e_split_q {
7701 24     24 0 74 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7702 24   100     54 $modifier ||= '';
7703              
7704 24         63 $modifier =~ tr/p//d;
7705 24 50       98 if ($modifier =~ /([adlu])/oxms) {
7706 0         0 my $line = 0;
7707 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7708 0 0       0 if ($filename ne __FILE__) {
7709 0         0 $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7710 0         0 last;
7711             }
7712             }
7713 0         0 die qq{Unsupported modifier "$1" used at line $line.\n};
7714             }
7715              
7716 24         32 $slash = 'div';
7717              
7718             # /b /B modifier
7719 24 100       51 if ($modifier =~ tr/bB//d) {
7720 12         63 return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7721             }
7722              
7723 12 100       32 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7724              
7725             # split regexp
7726 12         174 my @char = $string =~ /\G((?>
7727             [^\x8E\x8F\xA1-\xFE\\\[] |
7728             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
7729             \[\^ |
7730             \[\: (?>[a-z]+) \:\] |
7731             \[\:\^ (?>[a-z]+) \:\] |
7732             \\ (?:$q_char) |
7733             (?:$q_char)
7734             ))/oxmsg;
7735              
7736             # unescape character
7737 12         37 for (my $i=0; $i <= $#char; $i++) {
7738 12 50 33     57 if (0) {
    50 100        
    50 66        
    50 33        
    100          
    50          
7739             }
7740              
7741             # open character class [...]
7742 0         0 elsif ($char[$i] eq '[') {
7743 0         0 my $left = $i;
7744 0 0       0 if ($char[$i+1] eq ']') {
7745 0         0 $i++;
7746             }
7747 0         0 while (1) {
7748 0 0       0 if (++$i > $#char) {
7749 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7750             }
7751 0 0       0 if ($char[$i] eq ']') {
7752 0         0 my $right = $i;
7753              
7754             # [...]
7755 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
7756              
7757 0         0 $i = $left;
7758 0         0 last;
7759             }
7760             }
7761             }
7762              
7763             # open character class [^...]
7764             elsif ($char[$i] eq '[^') {
7765 0         0 my $left = $i;
7766 0 0       0 if ($char[$i+1] eq ']') {
7767 0         0 $i++;
7768             }
7769 0         0 while (1) {
7770 0 0       0 if (++$i > $#char) {
7771 0         0 die __FILE__, ": Unmatched [] in regexp\n";
7772             }
7773 0 0       0 if ($char[$i] eq ']') {
7774 0         0 my $right = $i;
7775              
7776             # [^...]
7777 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7778              
7779 0         0 $i = $left;
7780 0         0 last;
7781             }
7782             }
7783             }
7784              
7785             # rewrite character class or escape character
7786             elsif (my $char = character_class($char[$i],$modifier)) {
7787 0         0 $char[$i] = $char;
7788             }
7789              
7790             # split(m/^/) --> split(m/^/m)
7791             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7792 0         0 $modifier .= 'm';
7793             }
7794              
7795             # /i modifier
7796             elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
7797 4 50       12 if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
7798 4         9 $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
7799             }
7800             else {
7801 0         0 $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
7802             }
7803             }
7804              
7805             # quote character before ? + * {
7806             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7807 0 0       0 if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7808             }
7809             else {
7810 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
7811             }
7812             }
7813             }
7814              
7815 12         16 $modifier =~ tr/i//d;
7816 12         80 return join '', 'Eeucjp::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7817             }
7818              
7819             #
7820             # instead of Carp::carp
7821             #
7822             sub carp {
7823 0     0 0   my($package,$filename,$line) = caller(1);
7824 0           print STDERR "@_ at $filename line $line.\n";
7825             }
7826              
7827             #
7828             # instead of Carp::croak
7829             #
7830             sub croak {
7831 0     0 0   my($package,$filename,$line) = caller(1);
7832 0           print STDERR "@_ at $filename line $line.\n";
7833 0           die "\n";
7834             }
7835              
7836             #
7837             # instead of Carp::cluck
7838             #
7839             sub cluck {
7840 0     0 0   my $i = 0;
7841 0           my @cluck = ();
7842 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7843 0           push @cluck, "[$i] $filename($line) $package::$subroutine\n";
7844 0           $i++;
7845             }
7846 0           print STDERR CORE::reverse @cluck;
7847 0           print STDERR "\n";
7848 0           carp @_;
7849             }
7850              
7851             #
7852             # instead of Carp::confess
7853             #
7854             sub confess {
7855 0     0 0   my $i = 0;
7856 0           my @confess = ();
7857 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7858 0           push @confess, "[$i] $filename($line) $package::$subroutine\n";
7859 0           $i++;
7860             }
7861 0           print STDERR CORE::reverse @confess;
7862 0           print STDERR "\n";
7863 0           croak @_;
7864             }
7865              
7866             1;
7867              
7868             __END__