File Coverage

blib/lib/String/Parity.pm
Criterion Covered Total %
statement 53 53 100.0
branch 10 12 83.3
condition n/a
subroutine 17 17 100.0
pod 14 14 100.0
total 94 96 97.9


line stmt bran cond sub pod time code
1             package String::Parity;
2              
3 1     1   644 use 5.006;
  1         3  
4 1     1   5 use strict;
  1         1  
  1         20  
5 1     1   5 use warnings;
  1         5  
  1         838  
6              
7             require Exporter;
8              
9             our @ISA = qw(Exporter);
10              
11             our $VERSION = "1.32";
12              
13             our @EXPORT = qw(
14             setEvenParity setOddParity
15             setMarkParity setSpaceParity
16             EvenBytes OddBytes
17             MarkBytes SpaceBytes
18             isEvenParity isOddParity
19             isMarkParity isSpaceParity
20             );
21              
22             our @EXPORT_OK = qw(
23             showParity showMarkSpace
24             $even_parity $odd_parity
25             $show_parity $even_codes
26             );
27             our ($even_parity, $odd_parity, $show_parity);
28              
29             my $even_bits = "\0";
30             my $odd_bits = "\200";
31             foreach (0 .. 7) {
32             $even_bits .= $odd_bits;
33             ($odd_bits = $even_bits) =~ tr/\0\200/\200\0/;
34             }
35              
36             my $codes = pack('C*', (0 .. 255));
37             ($even_parity = $codes ^ $even_bits) =~ s/(\W)/sprintf('\%o', ord $1)/eg;
38             ($odd_parity = $codes ^ $odd_bits) =~ s/(\W)/sprintf('\%o', ord $1)/eg;
39             ($show_parity = $even_bits) =~ tr /\0\200/eo/;
40              
41             my $even_codes = '';
42             while ($even_bits =~ /\0/g) {
43             $even_codes .= sprintf '\%o', (pos $even_bits) - 1;
44             }
45              
46 4 100   4 1 61 eval <
  4 100   4 1 9  
  4 50   2 1 9  
  4     2 1 11  
  4     2 1 9  
  4         9  
  4         10  
  4         14  
  2         146  
  2         5  
  4         10  
  2         11  
  2         78  
  2         4  
  4         9  
  2         11  
  2         58  
  2         5  
  2         5  
  2         9  
47              
48             sub setEvenParity {
49             my(\@s) = \@_;
50             foreach (\@s) {
51             tr/\\0-\\377/$even_parity/;
52             }
53             wantarray ? \@s : join '', \@s;
54             }
55              
56             sub setOddParity {
57             my(\@s) = \@_;
58             foreach (\@s) {
59             tr/\\0-\\377/$odd_parity/;
60             }
61             wantarray ? \@s : join '', \@s;
62             }
63              
64             sub showParity {
65             my(\@s) = \@_;
66             foreach (\@s) {
67             tr/\\0-\\377/$show_parity/;
68             }
69             wantarray ? \@s : join '', \@s;
70             }
71              
72             sub EvenBytes {
73             my \$count = 0;
74             foreach (\@_) {
75             \$count += tr/$even_codes//;
76             }
77             \$count;
78             }
79              
80             sub OddBytes {
81             my \$count = 0;
82             foreach (\@_) {
83             \$count += tr/$even_codes//c;
84             }
85             \$count;
86             }
87              
88             EDQ
89             die $@ if $@;
90              
91             sub isEvenParity {
92 2     2 1 112 ! &OddBytes;
93             }
94              
95             sub isOddParity {
96 2     2 1 62 ! &EvenBytes;
97             }
98              
99             sub setSpaceParity {
100 2     2 1 31 my(@s) = @_;
101 2         33 foreach (@s) {
102 4         9 tr/\200-\377/\0-\177/;
103             }
104 2 100       10 wantarray ? @s : join '', @s;
105             }
106              
107             sub setMarkParity {
108 2     2 1 16 my(@s) = @_;
109 2         4 foreach (@s) {
110 4         8 tr/\0-\177/\200-\377/;
111             }
112 2 100       15 wantarray ? @s : join '', @s;
113             }
114              
115             sub showMarkSpace {
116 2     2 1 20 my(@s) = @_;
117 2         4 foreach (@s) {
118 2         4 tr/\0-\177/s/;
119 2         4 tr/\200-\377/m/;
120             }
121 2 50       10 wantarray ? @s : join '', @s;
122             }
123              
124             sub SpaceBytes {
125 6     6 1 8 my $count = 0;
126 6         10 foreach (@_) {
127 6         13 $count += tr/\0-\177//;
128             }
129 6         14 $count;
130             }
131              
132             sub MarkBytes {
133 6     6 1 8 my $count = 0;
134 6         11 foreach (@_) {
135 6         9 $count += tr/\200-\377//;
136             }
137 6         19 $count;
138             }
139              
140             sub isSpaceParity {
141 4     4 1 28 ! &MarkBytes;
142             }
143              
144             sub isMarkParity {
145 4     4 1 34 ! &SpaceBytes;
146             }
147              
148             1;
149              
150             __END__