File Coverage

blib/lib/Bit/Manip/PP.pm
Criterion Covered Total %
statement 79 79 100.0
branch 36 36 100.0
condition 5 6 83.3
subroutine 16 17 94.1
pod 9 9 100.0
total 145 147 98.6


line stmt bran cond sub pod time code
1             package Bit::Manip::PP;
2              
3 12     12   19099 use warnings;
  12         16  
  12         301  
4 12     12   34 use strict;
  12         12  
  12         310  
5              
6             our $VERSION = '1.06';
7              
8 12     12   34 use Exporter;
  12         15  
  12         8802  
9             our @ISA = qw(Exporter);
10              
11             our @EXPORT_OK = qw(
12             bit_get
13             bit_set
14             bit_clr
15             bit_toggle
16             bit_on
17             bit_off
18             bit_bin
19             bit_count
20             bit_mask
21             );
22              
23             our %EXPORT_TAGS;
24             $EXPORT_TAGS{all} = [@EXPORT_OK];
25              
26             sub _ref {
27 298 100   298   2277 shift if @_ == 2;
28 298 100 100     1487 if ($_[0] !~ /^\d+$/ && ref $_[0] ne 'SCALAR'){
29 3         13 die "your data must either be an integer or a SCALAR reference\n";
30             }
31              
32 295 100       404 if (ref $_[0]){
33 138 100       106 if (${ $_[0] } !~ /^\d+/){
  138         365  
34 1         4 die "data reference must contain only an integer\n";
35             }
36 137         253 return 1;
37             }
38 157         222 return 0;
39             }
40             sub bit_bin {
41 1030     1030 1 222436 my ($data) = @_;
42 1030         4461 return sprintf("%b", $data);
43             }
44             sub bit_count {
45 145     145 1 567 my ($n, $set) = @_;
46              
47 145 100 66     576 if (! defined $n || $n !~ /^\d+/){
48 2         8 die "bit_count() requires an integer param\n";
49             }
50              
51 143         384 my $bits = sprintf("%b", $n);
52 143         91 my $bit_count;
53              
54 143 100       157 if ($set){
55 15         22 $bit_count = $bits =~ tr/1/1/;
56             }
57             else {
58 128         107 $bit_count = length($bits);
59             }
60              
61 143         220 return $bit_count;
62             }
63             sub bit_mask {
64 112     112 1 170 my ($bits, $lsb) = @_;
65 112         211 return (2 ** $bits - 1) << $lsb;
66             }
67             sub bit_get {
68 20     20 1 6051 my ($data, $msb, $lsb) = @_;
69              
70 20 100       59 $lsb = 0 if ! defined $lsb;
71              
72 20         24 _check_msb($msb);
73 19         13 $msb++; # need to start from 1 here
74              
75 19         23 _check_lsb($lsb, $msb);
76              
77 16         25 return ($data & (2**$msb-1)) >> $lsb;
78             }
79             sub bit_set {
80 98     98 1 9204 my ($data, $lsb, $bits, $value) = @_;
81              
82 98 100       187 if (@_ != 4){
83 2         10 die "bit_set() requires four params\n";
84             }
85              
86 96         126 _check_value($value);
87              
88 96         114 my $value_bits = bit_count($value, 0);
89 96 100       132 if ($value_bits != $bits){
90 14         12 $value_bits = $bits;
91             }
92 96         107 my $mask = bit_mask($value_bits, $lsb);
93              
94 96 100       120 if (_ref($data)){
95 38         54 $$data = ($$data & ~($mask)) | ($value << $lsb);
96 38         45 return 0;
97             }
98             else {
99 58         74 $data = ($data & ~($mask)) | ($value << $lsb);
100 58         175 return $data;
101             }
102             }
103             sub bit_clr {
104 44     44 1 5615 my ($data, $lsb, $nbits) = @_;
105 44         58 return bit_set($data, $lsb, $nbits, 0);
106             }
107             sub bit_toggle {
108 96     96 1 33140 my ($data, $bit) = @_;
109              
110 96 100       134 if (_ref($data)){
111 48         57 $$data ^= 1 << $bit;
112 48         65 return 0;
113             }
114             else {
115 48         103 return $data ^= 1 << $bit;
116             }
117             }
118             sub bit_on {
119 48     48 1 19932 my ($data, $bit) = @_;
120              
121 48 100       74 if (_ref($data)){
122 24         29 $$data |= 1 << $bit;
123 24         35 return 0;
124             }
125             else {
126 24         49 return $data |= 1 << $bit;
127             }
128             }
129             sub bit_off {
130 48     48 1 24796 my ($data, $bit) = @_;
131              
132 48 100       72 if (_ref($data)){
133 24         39 $$data &= ~(1 << $bit);
134 24         35 return 0;
135             }
136             else {
137 24         54 return $data &= ~(1 << $bit);
138             }
139             }
140             sub _check_msb {
141 20     20   20 my ($msb) = @_;
142 20 100       32 if ($msb < 0){
143 1         4 die("\$msb param can not be negative\n");
144             }
145             }
146             sub _check_lsb {
147 19     19   17 my ($lsb, $msb) = @_;
148              
149 19 100       25 if ($lsb < 0){
150 1         4 die "\$lsb param can't be negative\n";
151             }
152 18 100       25 if (($lsb + 1) >= $msb){
153 2         10 die "\$lsb param must be less than \$msb\n";
154             }
155             }
156             sub _check_value {
157 97 100   97   141 shift if @_ > 1;
158 97         78 my ($val) = @_;
159 97 100       154 if ($val < 0){
160 1         4 die "\$value param must be zero or greater\n";
161             }
162             }
163       0     sub _vim{};
164              
165             1;
166             __END__