X-Git-Url: http://git.ieval.ro/?p=slob.git;a=blobdiff_plain;f=lib%2FSlob.pm;h=3e9697fff3c7c2faea0550ea579f1f4bc6848a33;hp=b64664f1fcc016e32b73643d33d0de723b1876af;hb=1ca60f5557ed528aa1cdd7c50737c5d51b94682a;hpb=ded5800affabc2bca3daebf2d848edc977ed59d8 diff --git a/lib/Slob.pm b/lib/Slob.pm index b64664f..3e9697f 100644 --- a/lib/Slob.pm +++ b/lib/Slob.pm @@ -10,7 +10,9 @@ use constant MAGIC => "!-1SLOB\x1F"; use Carp qw/croak verbose/; use Encode; +use Compress::Raw::Bzip2; use Compress::Raw::Lzma; +use Compress::Raw::Zlib; our %UNCOMPRESS = ( '' => sub { $_[0] }, @@ -19,9 +21,37 @@ our %UNCOMPRESS = ( my ($lzma2, $code, $output); ($lzma2, $code) = Compress::Raw::Lzma::RawDecoder->new(Filter => Lzma::Filter::Lzma2()); die "Error creating LZMA2 decoder: $code\n" unless $code == LZMA_OK; + $code = $lzma2->code($input, $output); - die "Did not reach end of stream" if $code == LZMA_OK; - die "Error decoding LZMA2: $code" if $code != LZMA_STREAM_END; + die "Did not reach end of stream\n" if $code == LZMA_OK; + die "Error decoding LZMA2: $code\n" if $code != LZMA_STREAM_END; + $output + }, + + 'bz2' => sub { + my ($input) = @_; + my ($bz2, $code, $output); + ($bz2, $code)= Compress::Raw::Bunzip2->new; + die "Error creating Bunzip2: $code\n" unless $code == Z_OK; + + $code = $bz2->bzinflate($input, $output); + die "Did not reach end of stream\n" if $code == BZ_OK; + die "Error decoding Bzip2: $code\n" if $code != BZ_STREAM_END; + + $output + }, + + 'zlib' => sub { + my ($input) = @_; + my ($zlib, $code, $output); + ($zlib, $code) = Compress::Raw::Zlib::Inflate->new( + -WindowBits => WANT_GZIP_OR_ZLIB + ); + die "Error creating Zlib inflate: $code\n" unless $code == Z_OK; + + $code = $zlib->inflate($input, \$output, 1); + die "Did not reach end of stream\n" if $code == Z_OK; + die "Error inflating zlib: $code\n" if $code != Z_STREAM_END; $output } );