PerlIO-via-Bzip2

 view release on metacpan or  search on metacpan

lib/PerlIO/via/Bzip2.pm  view on Meta::CPAN

package PerlIO::via::Bzip2;

use 5.008000;
use strict;
use warnings;

use Compress::Bzip2 ();

our $VERSION = '0.02';

my $Buf_Size = 8192;

# Default (de)compression parameters, see Compress::Bzip2 for details.
my $Level    = 1;          # Compression level 1..9

# Get and set (de)compression level (0..9)
sub level {
    $Level = $_[1] if $_[1];
    $Level;
}

sub import {
    my ($class, %args) = @_;

    $class->level($args{level});
}


sub PUSHED {
    my ($class, $mode, $fh) = @_;

    my $self = {
        buf    => '',
        mode   => $mode,
    };
    if ($mode eq 'r') {
        $self->{stream} = Compress::Bzip2::decompress_init()
          or return -1;
    }
    elsif ($mode eq 'w') {
        $self->{stream} = Compress::Bzip2::compress_init(level => $Level)
          or return -1;
    }
    else {
        return -1;
    }
    return bless $self => $class;
}


sub FILL {
    my ($self, $fh) = @_;

    my ($data);
    my $stream = $self->{stream};
    if ($stream and (read($fh, $data, $Buf_Size) > 0)) {
        return $stream->add($data);
    }
    elsif ($stream) {
        $self->{stream} = undef;
        return $stream->finish;
    }
    else {
        return;
    }
}


sub WRITE {
    my ($self, $buf, $fh) = @_;

    my $data = $self->{stream}->add($buf);
    return if not defined $data;
    return (print {$fh} $data) ? 1 : 0;
}


sub FLUSH {
    my ($self, $fh) = @_;

    return 0 if $self->{mode} eq 'r';
    my $data = $self->{stream}->finish;
    if ($data) {
        return (print {$fh} $data) ? 0 : -1;
    }
    return 0;
}

1;
__END__

=head1 NAME

PerlIO::via::Bzip2 - PerlIO layer for Bzip2 (de)compression

=head1 SYNOPSIS

    use PerlIO::via::Bzip2;
    # or
    use PerlIO::via::Bzip2 level => 9; # Maximum compression

    # Read a bzip2 compressed file from disk.
    open(my $fh, "<:via(Bzip2)", "compressed_file");
    my $uncompressed_data = <$fh>;

    # Compress data on-the-fly to a bzip2 compressed file on disk.
    open(my $fh, ">:via(Bzip2)", "compressed_file");



( run in 3.352 seconds using v1.01-cache-2.11-cpan-5c0b1e786e0 )