File Coverage

lib/IOas/SJIS2004.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::SJIS2004;
2             ######################################################################
3             #
4             # IOas::SJIS2004 - provides SJIS2004 I/O subroutines for UTF-8 script
5             #
6             # http://search.cpan.org/dist/IOas-SJIS2004/
7             #
8             # Copyright (c) 2019 INABA Hitoshi in a CPAN
9             ######################################################################
10              
11 12     12   36659 use 5.00503; # Galapagos Consensus 1998 for primetools
  12         90  
12             # use 5.008001; # Lancaster Consensus 2013 for toolchains
13              
14             $VERSION = '0.08';
15             $VERSION = $VERSION;
16              
17 12     12   57 use strict;
  12         21  
  12         408  
18 12 50   12   179 BEGIN { $INC{'warnings.pm'} = '' if $] < 5.006 }; use warnings; $^W=1;
  12     12   53  
  12         34  
  12         480  
19 12     12   5095 use Symbol ();
  12         8479  
  12         253  
20 12     12   68634 use Jacode4e::RoundTrip; # pmake.bat makes META.yml, META.json and Makefile.PL by /^use /
  12         28480955  
  12         14156  
21              
22             #-----------------------------------------------------------------------------
23             # import
24             #-----------------------------------------------------------------------------
25              
26             sub import {
27 12     12   109 my $self = shift @_;
28 12 50 33     429 if (defined($_[0]) and ($_[0] =~ /\A[0123456789]/)) {
29 0 0       0 if ($_[0] != $IOas::SJIS2004::VERSION) {
30 0         0 my($package,$filename,$line) = caller;
31 0         0 die "$filename requires @{[__PACKAGE__]} $_[0], this is version $IOas::SJIS2004::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   103 my($s) = @_;
46 50         130 Jacode4e::RoundTrip::convert(\$s, 'utf8.1', $io_encoding);
47 50         5899 return $s;
48             };
49              
50             sub _io_output ($) {
51 262     262   468 my($s) = @_;
52 262         1199 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         22342 return $s;
63             };
64              
65             #-----------------------------------------------------------------------------
66             # Octet Length as I/O Encoding
67             #-----------------------------------------------------------------------------
68              
69             sub length (;$) {
70 18 100   18 0 502 return CORE::length _io_output(@_ ? $_[0] : $_);
71             }
72              
73             sub sprintf ($@) {
74 10     10 0 323 my($format, @list) = map { _io_output($_) } @_;
  19         31  
75 10         38 return _io_input(CORE::sprintf($format, @list));
76             }
77              
78             sub substr ($$;$$) {
79 6 100   6 0 194 if (@_ == 4) {
    100          
80 2         5 my $expr = _io_output($_[0]);
81 2         5 my $substr = CORE::substr($expr, $_[1], $_[2], _io_output($_[3]));
82 2         4 $_[0] = _io_input($expr);
83 2         4 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         7 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 611 sub cmp ($$) { _io_output($_[0]) cmp _io_output($_[1]) }
98 10     10 0 302 sub eq ($$) { _io_output($_[0]) eq _io_output($_[1]) }
99 10     10 0 9732 sub ne ($$) { _io_output($_[0]) ne _io_output($_[1]) }
100 10     10 0 200 sub ge ($$) { _io_output($_[0]) ge _io_output($_[1]) }
101 10     10 0 189 sub gt ($$) { _io_output($_[0]) gt _io_output($_[1]) }
102 10     10 0 221 sub le ($$) { _io_output($_[0]) le _io_output($_[1]) }
103 10     10 0 761 sub lt ($$) { _io_output($_[0]) lt _io_output($_[1]) }
104             sub sort (@) {
105 9         16 map { $_->[0] }
106 21         25 CORE::sort { $a->[1] cmp $b->[1] }
107 1     1 0 98 map { [ $_, _io_output($_) ] }
  9         14  
108             @_;
109             }
110              
111             #-----------------------------------------------------------------------------
112             # Encoding Convert on I/O Operations
113             #-----------------------------------------------------------------------------
114              
115             sub getc (;*) {
116 4 100   4 0 1275 my $fh = @_ ? Symbol::qualify_to_ref($_[0],caller()) : \*STDIN;
117 4         85 my $octet = CORE::getc($fh);
118 4 50       30 if ($io_encoding =~ /^(?:sjis2004|cp932|cp932ibm|cp932nec|sjis2004)$/) {
119 4 50       12 if ($octet =~ /\A[\x81-\x9F\xE0-\xFC]\z/) {
120 4         9 $octet .= CORE::getc($fh);
121              
122             # ('cp932'.'x') to escape from build system
123 4 50 33     16 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         9 return _io_input($octet);
130             }
131              
132             sub readline (;*) {
133 24 100   24 0 2809 my $fh = @_ ? Symbol::qualify_to_ref($_[0],caller()) : \*ARGV;
134 24 100       701 return wantarray ? map { _io_input($_) } <$fh> : _io_input(<$fh>);
  6         13  
135             }
136              
137             sub print (;*@) {
138 10 100 100 10 0 6373 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       311 return CORE::print {$fh} (map { _io_output($_) } (@_ ? @_ : $_));
  10         26  
  10         17  
140             }
141              
142             sub printf (;*@) {
143 20 100 66 20 0 4291 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       623 my($format, @list) = map { _io_output($_) } (@_ ? @_ : $_);
  38         90  
145 20         25 return CORE::printf {$fh} ($format, @list);
  20         128  
146             }
147              
148             1;
149              
150             __END__