From: Marius Gavrilescu Date: Sat, 9 Dec 2017 18:36:50 +0000 (+0200) Subject: LZMA compression + tests X-Git-Tag: 0.001~1 X-Git-Url: http://git.ieval.ro/?p=slob.git;a=commitdiff_plain;h=d50f39582b61e51d104a3fc4799163855d5a289b LZMA compression + tests --- diff --git a/MANIFEST b/MANIFEST index 823ea14..48b0971 100644 --- a/MANIFEST +++ b/MANIFEST @@ -3,5 +3,6 @@ Makefile.PL MANIFEST README t/Slob.t -t/freedict-01.slob +t/freedict-uncompressed.slob +t/freedict-lzma2.slob lib/Slob.pm diff --git a/Makefile.PL b/Makefile.PL index e336e8e..317d6c4 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -13,7 +13,9 @@ WriteMakefile( MIN_PERL_VERSION => '5.14.0', LICENSE => 'perl', SIGN => 1, - PREREQ_PM => {}, + PREREQ_PM => { + qw/Compress::Raw::Lzma 0/, + }, META_ADD => { dynamic_config => 0, resources => { diff --git a/README b/README index 9186721..b396344 100644 --- a/README +++ b/README @@ -12,7 +12,9 @@ To install this module type the following: DEPENDENCIES -This module requires no non-core modules and libraries. +This module requires these other modules and libraries: + + * Compress::Raw::Lzma COPYRIGHT AND LICENCE diff --git a/lib/Slob.pm b/lib/Slob.pm index 4b796cb..818ff78 100644 --- a/lib/Slob.pm +++ b/lib/Slob.pm @@ -10,12 +10,30 @@ use constant MAGIC => "!-1SLOB\x1F"; use Carp qw/croak verbose/; use Encode; +use Compress::Raw::Lzma; + +our %UNCOMPRESS = ( + '' => sub { $_[0] }, + 'lzma2' => sub { + my ($input) = @_; + 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; + $output + } +); + sub new { my ($class, $path) = @_; - my $fh = - ref $path eq 'IO' - ? $path - : open my $fh, '<', $path or croak "Cannot open \"$path\": $!"; + my $fh; + if (ref $path eq 'IO') { + $fh = $path + } else { + open $fh, '<', $path or croak "Cannot open \"$path\": $!" + } my $self = bless {path => $path, fh => $fh}, $class; $self->{header} = $self->read_header; $self @@ -109,7 +127,7 @@ sub ftell { sub uncompress { my ($self, $data) = @_; - $data + $UNCOMPRESS{$self->{header}{compression}}->($data) } sub read_header { @@ -122,7 +140,7 @@ sub read_header { $self->{encoding} = $encoding; my $compression = $self->read_tiny_text; - die "Compression not yet supported" if $compression; + die "Compression '$compression' not yet supported" unless exists $UNCOMPRESS{$compression}; my %tags = $self->read_tags; my @content_types = $self->read_content_types; my $blob_count = $self->read_int; diff --git a/t/Slob.t b/t/Slob.t index 395c59e..ef2aa21 100644 --- a/t/Slob.t +++ b/t/Slob.t @@ -2,30 +2,32 @@ use strict; use warnings; -use Test::More tests => 7; +use Test::More tests => 13; BEGIN { use_ok('Slob') }; -my $slob = Slob->new('t/freedict-01.slob'); +for my $path (qw/freedict-uncompressed.slob freedict-lzma2.slob/) { + my $slob = Slob->new("t/$path"); -my $nr_of_entries = $slob->ref_count; + my $nr_of_entries = $slob->ref_count; -my $second_ref = $slob->seek_and_read_ref(4); -my $bin = $slob->seek_and_read_storage_bin($second_ref->{bin_index}); + my $second_ref = $slob->seek_and_read_ref(4); + my $bin = $slob->seek_and_read_storage_bin($second_ref->{bin_index}); -is $second_ref->{key}, 'abacus'; -is $second_ref->{bin_index}, 0; -is $second_ref->{item_index}, 161; -my $count = scalar @{$bin->{positions}}; -is $count, 637; + is $second_ref->{key}, 'abacus'; + is $second_ref->{bin_index}, 0; + is $second_ref->{item_index}, 161; + my $count = scalar @{$bin->{positions}}; + is $count, 637; -my $expected = <<'EOF'; + my $expected = <<'EOF';
abacus
æbəkəs
      1. Rechenbrett
      m
EOF -chomp $expected; -is $slob->get_entry_of_storage_bin($bin, $second_ref->{item_index}), $expected; + chomp $expected; + is $slob->get_entry_of_storage_bin($bin, $second_ref->{item_index}), $expected; -is $slob->seek_and_read_ref_and_data(4)->{data}, $expected; + is $slob->seek_and_read_ref_and_data(4)->{data}, $expected; +} diff --git a/t/freedict-01.slob b/t/freedict-01.slob deleted file mode 100644 index c836579..0000000 Binary files a/t/freedict-01.slob and /dev/null differ diff --git a/t/freedict-lzma2.slob b/t/freedict-lzma2.slob new file mode 100644 index 0000000..c8d6483 Binary files /dev/null and b/t/freedict-lzma2.slob differ diff --git a/t/freedict-uncompressed.slob b/t/freedict-uncompressed.slob new file mode 100644 index 0000000..c836579 Binary files /dev/null and b/t/freedict-uncompressed.slob differ