File Coverage

lib/IOas/CP932.pm
Criterion Covered Total %
statement 65 72 90.2
branch 26 34 76.4
condition 7 12 58.3
subroutine 24 24 100.0
pod 0 15 0.0
total 122 157 77.7


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   37457 use 5.00503; # Universal Consensus 1998 for primetools
  12         113  
12             # use 5.008001; # Lancaster Consensus 2013 for toolchains
13              
14             $VERSION = '0.10';
15             $VERSION = $VERSION;
16              
17 12     12   61 use strict;
  12         21  
  12         370  
18 12 50   12   194 BEGIN { $INC{'warnings.pm'} = '' if $] < 5.006 }; use warnings; $^W=1;
  12     12   59  
  12         33  
  12         522  
19 12     12   5212 use Symbol ();
  12         8610  
  12         274  
20 12     12   72627 use Jacode4e::RoundTrip; # pmake.bat makes META.yml, META.json and Makefile.PL by /^use /
  12         29617709  
  12         15795  
21              
22             #-----------------------------------------------------------------------------
23             # import
24             #-----------------------------------------------------------------------------
25              
26             sub import {
27 12     12   115 my $self = shift @_;
28 12 50 33     466 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 58     58   122 my($s) = @_;
46 58 100       106 if (defined $s) {
47 56         124 Jacode4e::RoundTrip::convert(\$s, 'utf8.1', $io_encoding);
48             }
49 58         6492 return $s;
50             };
51              
52             sub _io_output ($) {
53 262     262   487 my($s) = @_;
54 262         1285 Jacode4e::RoundTrip::convert(\$s, $io_encoding, 'utf8.1', {
55             'OVERRIDE_MAPPING' => {
56              
57             # UTF-8.0 was popular in old days
58             "\xE2\x80\x95" => "\x81\x5C", # U+2015 HORIZONTAL BAR
59             "\xE2\x88\xA5" => "\x81\x61", # U+2225 PARALLEL TO
60             "\xEF\xBC\x8D" => "\x81\x7C", # U+FF0D FULLWIDTH HYPHEN-MINUS
61              
62             # UTF-8.1 will be popular in someday
63             "\xE2\x80\x94" => "\x81\x5C", # U+2014 EM DASH
64             "\xE2\x80\x96" => "\x81\x61", # U+2016 DOUBLE VERTICAL LINE
65             "\xE2\x88\x92" => "\x81\x7C", # U+2212 MINUS SIGN
66             },
67             });
68 262         23176 return $s;
69             };
70              
71             #-----------------------------------------------------------------------------
72             # Octet Length as I/O Encoding
73             #-----------------------------------------------------------------------------
74              
75             sub length (;$) {
76 18 100   18 0 577 return CORE::length _io_output(@_ ? $_[0] : $_);
77             }
78              
79             sub sprintf ($@) {
80 10     10 0 367 my($format, @list) = map { _io_output($_) } @_;
  19         30  
81 10         36 return _io_input(CORE::sprintf($format, @list));
82             }
83              
84             sub substr ($$;$$) {
85 6 100   6 0 234 if (@_ == 4) {
    100          
86 2         7 my $expr = _io_output($_[0]);
87 2         5 my $substr = CORE::substr($expr, $_[1], $_[2], _io_output($_[3]));
88 2         6 $_[0] = _io_input($expr);
89 2         23 return _io_input($substr);
90             }
91             elsif (@_ == 3) {
92 2         5 return _io_input(CORE::substr(_io_output($_[0]), $_[1], $_[2]));
93             }
94             else {
95 2         6 return _io_input(CORE::substr(_io_output($_[0]), $_[1]));
96             }
97             }
98              
99             #-----------------------------------------------------------------------------
100             # String Comparison as I/O Encoding
101             #-----------------------------------------------------------------------------
102              
103 20     20 0 592 sub cmp ($$) { _io_output($_[0]) cmp _io_output($_[1]) }
104 10     10 0 266 sub eq ($$) { _io_output($_[0]) eq _io_output($_[1]) } # must not optimize like "$_[0] eq $_[1]"
105 10     10 0 321 sub ne ($$) { _io_output($_[0]) ne _io_output($_[1]) } # must not optimize like "$_[0] ne $_[1]"
106 10     10 0 193 sub ge ($$) { _io_output($_[0]) ge _io_output($_[1]) }
107 10     10 0 276 sub gt ($$) { _io_output($_[0]) gt _io_output($_[1]) }
108 10     10 0 10582 sub le ($$) { _io_output($_[0]) le _io_output($_[1]) }
109 10     10 0 292 sub lt ($$) { _io_output($_[0]) lt _io_output($_[1]) }
110             sub sort (@) {
111 9         17 map { $_->[0] }
112 21         24 CORE::sort { $a->[1] cmp $b->[1] }
113 1     1 0 102 map { [ $_, _io_output($_) ] }
  9         15  
114             @_;
115             }
116              
117             #-----------------------------------------------------------------------------
118             # Encoding Convert on I/O Operations
119             #-----------------------------------------------------------------------------
120              
121             sub getc (;*) {
122 4 100   4 0 1649 my $fh = @_ ? Symbol::qualify_to_ref($_[0],caller()) : \*STDIN;
123 4         80 my $octet = CORE::getc($fh);
124 4 50       25 if ($io_encoding =~ /^(?:cp932|cp932|cp932ibm|cp932nec|sjis2004)$/) {
125 4 50       12 if ($octet =~ /\A[\x81-\x9F\xE0-\xFC]\z/) {
126 4         9 $octet .= CORE::getc($fh);
127              
128             # ('cp932'.'x') to escape from build system
129 4 50 33     21 if (($io_encoding eq ('cp932'.'x')) and ($octet eq "\x9C\x5A")) {
130 0         0 $octet .= CORE::getc($fh);
131 0         0 $octet .= CORE::getc($fh);
132             }
133             }
134             }
135 4         9 return _io_input($octet);
136             }
137              
138             sub readline (;*) {
139 32 100   32 0 3441 my $fh = @_ ? Symbol::qualify_to_ref($_[0],caller()) : \*ARGV;
140 32 100       770 return wantarray ? map { _io_input($_) } <$fh> : _io_input(scalar <$fh>);
  6         23  
141             }
142              
143             sub print (;*@) {
144 10 100 100 10 0 3006 my $fh = ((@_ >= 1) and defined(fileno(Symbol::qualify_to_ref($_[0],caller())))) ? Symbol::qualify_to_ref(shift,caller()) : Symbol::qualify_to_ref(select,caller());
145 10 100       348 return CORE::print {$fh} (map { _io_output($_) } (@_ ? @_ : $_));
  10         24  
  10         16  
146             }
147              
148             sub printf (;*@) {
149 20 100 66 20 0 4513 my $fh = ((@_ >= 1) and defined(fileno(Symbol::qualify_to_ref($_[0],caller())))) ? Symbol::qualify_to_ref(shift,caller()) : Symbol::qualify_to_ref(select,caller());
150 20 50       628 my($format, @list) = map { _io_output($_) } (@_ ? @_ : $_);
  38         58  
151 20         74 return CORE::printf {$fh} ($format, @list);
  20         128  
152             }
153              
154             1;
155              
156             __END__