File Coverage

blib/lib/PerlIO/via/Bzip2.pm
Criterion Covered Total %
statement 43 43 100.0
branch 19 24 79.1
condition 3 3 100.0
subroutine 10 10 100.0
pod 1 4 25.0
total 76 84 90.4


line stmt bran cond sub pod time code
1             package PerlIO::via::Bzip2;
2              
3 1     1   43820 use 5.008000;
  1         4  
  1         55  
4 1     1   6 use strict;
  1         1  
  1         33  
5 1     1   10 use warnings;
  1         7  
  1         30  
6              
7 1     1   1302 use Compress::Bzip2 ();
  1         18365  
  1         517  
8              
9             our $VERSION = '0.02';
10              
11             my $Buf_Size = 8192;
12              
13             # Default (de)compression parameters, see Compress::Bzip2 for details.
14             my $Level = 1; # Compression level 1..9
15              
16             # Get and set (de)compression level (0..9)
17             sub level {
18 4 100   4 1 809 $Level = $_[1] if $_[1];
19 4         27 $Level;
20             }
21              
22             sub import {
23 1     1   12 my ($class, %args) = @_;
24              
25 1         4 $class->level($args{level});
26             }
27              
28              
29             sub PUSHED {
30 11     11 0 3102 my ($class, $mode, $fh) = @_;
31              
32 11         36 my $self = {
33             buf => '',
34             mode => $mode,
35             };
36 11 100       35 if ($mode eq 'r') {
    100          
37 3 50       84 $self->{stream} = Compress::Bzip2::decompress_init()
38             or return -1;
39             }
40             elsif ($mode eq 'w') {
41 5 50       205 $self->{stream} = Compress::Bzip2::compress_init(level => $Level)
42             or return -1;
43             }
44             else {
45 3         20 return -1;
46             }
47 8         561 return bless $self => $class;
48             }
49              
50              
51             sub FILL {
52 6     6 0 1958 my ($self, $fh) = @_;
53              
54 6         7 my ($data);
55 6         13 my $stream = $self->{stream};
56 6 100 100     82 if ($stream and (read($fh, $data, $Buf_Size) > 0)) {
    100          
57 2         10 return $stream->add($data);
58             }
59             elsif ($stream) {
60 2         5 $self->{stream} = undef;
61 2         9 return $stream->finish;
62             }
63             else {
64 2         9 return;
65             }
66             }
67              
68              
69             sub WRITE {
70 4     4   11 my ($self, $buf, $fh) = @_;
71              
72 4         19 my $data = $self->{stream}->add($buf);
73 4 50       383 return if not defined $data;
74 4 50       7 return (print {$fh} $data) ? 1 : 0;
  4         29  
75             }
76              
77              
78             sub FLUSH {
79 8     8 0 1436 my ($self, $fh) = @_;
80              
81 8 100       98 return 0 if $self->{mode} eq 'r';
82 5         23 my $data = $self->{stream}->finish;
83 5 100       6309 if ($data) {
84 4 50       7 return (print {$fh} $data) ? 0 : -1;
  4         314  
85             }
86 1         23 return 0;
87             }
88              
89             1;
90             __END__