File Coverage

lib/IOas/CP932.pm
Criterion Covered Total %
statement 64 71 90.1
branch 24 32 75.0
condition 7 12 58.3
subroutine 24 24 100.0
pod 0 15 0.0
total 119 154 77.2


line stmt bran cond sub pod time code
1             package IOas::CP932;
2             ######################################################################
3             #
4             # IOas::CP932 - provides CP932 I/O subroutines for UTF-8 script
5             #
6             # http://search.cpan.org/dist/IOas-CP932/
7             #
8             # Copyright (c) 2019 INABA Hitoshi in a CPAN
9             ######################################################################
10              
11 12     12   84531 use 5.00503; # Galapagos Consensus 1998 for primetools
  12         98  
12             # use 5.008001; # Lancaster Consensus 2013 for toolchains
13              
14             $VERSION = '0.08';
15             $VERSION = $VERSION;
16              
17 12     12   59 use strict;
  12         22  
  12         348  
18 12 50   12   177 BEGIN { $INC{'warnings.pm'} = '' if $] < 5.006 }; use warnings; $^W=1;
  12     12   54  
  12         38  
  12         497  
19 12     12   5044 use Symbol ();
  12         9288  
  12         253  
20 12     12   100467 use Jacode4e::RoundTrip; # pmake.bat makes META.yml, META.json and Makefile.PL by /^use /
  12         28917163  
  12         14288  
21              
22             #-----------------------------------------------------------------------------
23             # import
24             #-----------------------------------------------------------------------------
25              
26             sub import {
27 12     12   110 my $self = shift @_;
28 12 50 33     435 if (defined($_[0]) and ($_[0] =~ /\A[0123456789]/)) {
29 0 0       0 if ($_[0] != $IOas::CP932::VERSION) {
30 0         0 my($package,$filename,$line) = caller;
31 0         0 die "$filename requires @{[__PACKAGE__]} $_[0], this is version $IOas::CP932::VERSION, stopped at $filename line $line.\n";
  0         0  
32             }
33 0         0 shift @_;
34             }
35             }
36              
37             #-----------------------------------------------------------------------------
38             # autodetect I/O encoding from package name
39             #-----------------------------------------------------------------------------
40              
41             (my $__package__ = __PACKAGE__) =~ s/utf81/utf8.1/i;
42             my $io_encoding = lc((split /::/, $__package__)[-1]);
43              
44             sub _io_input ($) {
45 50     50   101 my($s) = @_;
46 50         139 Jacode4e::RoundTrip::convert(\$s, 'utf8.1', $io_encoding);
47 50         5944 return $s;
48             };
49              
50             sub _io_output ($) {
51 262     262   467 my($s) = @_;
52 262         1562 Jacode4e::RoundTrip::convert(\$s, $io_encoding, 'utf8.1', {
53             'OVERRIDE_MAPPING' => {
54             "\xE2\x80\x95" => "\x81\x5C",
55             "\xE2\x88\xA5" => "\x81\x61",
56             "\xEF\xBC\x8D" => "\x81\x7C",
57             "\xE2\x80\x94" => "\x81\x5C",
58             "\xE2\x80\x96" => "\x81\x61",
59             "\xE2\x88\x92" => "\x81\x7C",
60             },
61             });
62 262         22939 return $s;
63             };
64              
65             #-----------------------------------------------------------------------------
66             # Octet Length as I/O Encoding
67             #-----------------------------------------------------------------------------
68              
69             sub length (;$) {
70 18 100   18 0 483 return CORE::length _io_output(@_ ? $_[0] : $_);
71             }
72              
73             sub sprintf ($@) {
74 10     10 0 363 my($format, @list) = map { _io_output($_) } @_;
  19         42  
75 10         38 return _io_input(CORE::sprintf($format, @list));
76             }
77              
78             sub substr ($$;$$) {
79 6 100   6 0 255 if (@_ == 4) {
    100          
80 2         7 my $expr = _io_output($_[0]);
81 2         5 my $substr = CORE::substr($expr, $_[1], $_[2], _io_output($_[3]));
82 2         5 $_[0] = _io_input($expr);
83 2         5 return _io_input($substr);
84             }
85             elsif (@_ == 3) {
86 2         6 return _io_input(CORE::substr(_io_output($_[0]), $_[1], $_[2]));
87             }
88             else {
89 2         6 return _io_input(CORE::substr(_io_output($_[0]), $_[1]));
90             }
91             }
92              
93             #-----------------------------------------------------------------------------
94             # String Comparison as I/O Encoding
95             #-----------------------------------------------------------------------------
96              
97 20     20 0 606 sub cmp ($$) { _io_output($_[0]) cmp _io_output($_[1]) }
98 10     10 0 294 sub eq ($$) { _io_output($_[0]) eq _io_output($_[1]) }
99 10     10 0 317 sub ne ($$) { _io_output($_[0]) ne _io_output($_[1]) }
100 10     10 0 240 sub ge ($$) { _io_output($_[0]) ge _io_output($_[1]) }
101 10     10 0 1601 sub gt ($$) { _io_output($_[0]) gt _io_output($_[1]) }
102 10     10 0 752 sub le ($$) { _io_output($_[0]) le _io_output($_[1]) }
103 10     10 0 266 sub lt ($$) { _io_output($_[0]) lt _io_output($_[1]) }
104             sub sort (@) {
105 9         17 map { $_->[0] }
106 21         24 CORE::sort { $a->[1] cmp $b->[1] }
107 1     1 0 161 map { [ $_, _io_output($_) ] }
  9         17  
108             @_;
109             }
110              
111             #-----------------------------------------------------------------------------
112             # Encoding Convert on I/O Operations
113             #-----------------------------------------------------------------------------
114              
115             sub getc (;*) {
116 4 100   4 0 9231 my $fh = @_ ? Symbol::qualify_to_ref($_[0],caller()) : \*STDIN;
117 4         98 my $octet = CORE::getc($fh);
118 4 50       25 if ($io_encoding =~ /^(?:cp932|cp932|cp932ibm|cp932nec|sjis2004)$/) {
119 4 50       13 if ($octet =~ /\A[\x81-\x9F\xE0-\xFC]\z/) {
120 4         16 $octet .= CORE::getc($fh);
121              
122             # ('cp932'.'x') to escape from build system
123 4 50 33     13 if (($io_encoding eq ('cp932'.'x')) and ($octet eq "\x9C\x5A")) {
124 0         0 $octet .= CORE::getc($fh);
125 0         0 $octet .= CORE::getc($fh);
126             }
127             }
128             }
129 4         10 return _io_input($octet);
130             }
131              
132             sub readline (;*) {
133 24 100   24 0 4338 my $fh = @_ ? Symbol::qualify_to_ref($_[0],caller()) : \*ARGV;
134 24 100       691 return wantarray ? map { _io_input($_) } <$fh> : _io_input(<$fh>);
  6         12  
135             }
136              
137             sub print (;*@) {
138 10 100 100 10 0 5495 my $fh = ((@_ >= 1) and defined(fileno(Symbol::qualify_to_ref($_[0],caller())))) ? Symbol::qualify_to_ref(shift,caller()) : Symbol::qualify_to_ref(select,caller());
139 10 100       327 return CORE::print {$fh} (map { _io_output($_) } (@_ ? @_ : $_));
  10         24  
  10         18  
140             }
141              
142             sub printf (;*@) {
143 20 100 66 20 0 3445 my $fh = ((@_ >= 1) and defined(fileno(Symbol::qualify_to_ref($_[0],caller())))) ? Symbol::qualify_to_ref(shift,caller()) : Symbol::qualify_to_ref(select,caller());
144 20 50       608 my($format, @list) = map { _io_output($_) } (@_ ? @_ : $_);
  38         59  
145 20         27 return CORE::printf {$fh} ($format, @list);
  20         125  
146             }
147              
148             1;
149              
150             __END__