File Coverage

blib/lib/IO/Uncompress/UnLzf.pm
Criterion Covered Total %
statement 93 94 98.9
branch 25 30 83.3
condition 2 3 66.6
subroutine 19 19 100.0
pod 2 12 16.6
total 141 158 89.2


line stmt bran cond sub pod time code
1             package IO::Uncompress::UnLzf ;
2              
3 11     11   97627 use strict ;
  11         25  
  11         326  
4 11     11   55 use warnings;
  11         25  
  11         291  
5 11     11   60 use bytes;
  11         25  
  11         50  
6              
7 11     11   401 use IO::Compress::Base::Common 2.205 qw(:Status createSelfTiedObject);
  11         245  
  11         1352  
8              
9 11     11   4639 use IO::Uncompress::Base 2.205 ;
  11         67808  
  11         700  
10 11     11   3654 use IO::Uncompress::Adapter::Lzf 2.205 ;
  11         214  
  11         1315  
11              
12              
13             require Exporter ;
14             our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnLzfError);
15              
16             $VERSION = '2.205';
17             $UnLzfError = '';
18              
19             @ISA = qw( IO::Uncompress::Base Exporter );
20             @EXPORT_OK = qw( $UnLzfError unlzf ) ;
21             #%EXPORT_TAGS = %IO::Uncompress::Base::EXPORT_TAGS ;
22             push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
23             #Exporter::export_ok_tags('all');
24              
25 11     11   77 use constant SIGNATURE => 'ZV';
  11         21  
  11         10686  
26              
27             sub new
28             {
29 786     786 1 1561855 my $class = shift ;
30 786         2665 my $obj = createSelfTiedObject($class, \$UnLzfError);
31              
32 786         31235 $obj->_create(undef, 0, @_);
33             }
34              
35             sub unlzf
36             {
37 63     63 1 91246 my $obj = createSelfTiedObject(undef, \$UnLzfError);
38 63         2704 return $obj->_inf(@_);
39             }
40              
41             sub getExtraParams
42             {
43 832     832 0 36408 return ();
44             }
45              
46             sub ckParams
47             {
48 838     838 0 63906 my $self = shift ;
49 838         1262 my $got = shift ;
50              
51 838         1415 return 1;
52             }
53              
54              
55             sub postCheckParams
56             {
57 828     828 0 163800 my $self = shift ;
58 828         1335 my $got = shift ;
59              
60 828 100       1963 return $self->saveErrorString(undef, "MultiStream not supported by Lzf", STATUS_ERROR)
61             if $got->getValue('multistream') ;
62              
63 826         5064 $got->setValue('multistream' => 0);
64 826         5202 return 1;
65             }
66              
67             sub mkUncomp
68             {
69 837     837 0 116868 my $self = shift ;
70 837         1340 my $got = shift ;
71              
72 837 100       1694 my $magic = $self->ckMagic()
73             or return 0;
74              
75 777 50       1670 *$self->{Info} = $self->readHeader($magic)
76             or return undef ;
77              
78 777         2232 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Lzf::mkUncompObject();
79              
80 777 50       1772 return $self->saveErrorString(undef, $errstr, $errno)
81             if ! defined $obj;
82              
83 777         1397 *$self->{Uncomp} = $obj;
84              
85 777         1746 return 1;
86             }
87              
88              
89             sub ckMagic
90             {
91 1018     1018 0 439276 my $self = shift;
92              
93 1018         1429 my $magic ;
94 1018         3094 $self->smartReadExact(\$magic, 3);
95              
96 1018         47011 *$self->{HeaderPending} = $magic ;
97              
98 1018 100       2784 return $self->HeaderError("Header size is " .
99             3 . " bytes")
100             if length $magic != 3;
101              
102 1010 100       2178 return $self->HeaderError("Bad Magic.")
103             if ! isLzfMagic($magic) ;
104              
105              
106 956         2117 *$self->{Type} = 'lzf';
107 956         2582 return $magic;
108             }
109              
110             sub readHeader
111             {
112 956     956 0 2471 my $self = shift;
113 956         1399 my $magic = shift ;
114              
115 956         2732 $self->pushBack($magic);
116 956         11322 *$self->{HeaderPending} = '';
117              
118             return {
119 956         5126 'Type' => 'lzf',
120             'FingerprintLength' => 3,
121             'HeaderLength' => 3,
122             'TrailerLength' => 0,
123             'Header' => '$magic'
124             };
125              
126              
127              
128             }
129              
130             sub chkTrailer
131             {
132 341     341 0 17897 return STATUS_OK;
133             }
134              
135             sub readBlock
136             {
137 1297     1297 0 1285869 my $self = shift ;
138 1297         1827 my $buff = shift ;
139 1297         1942 my $size = shift ;
140              
141 1297 100       3025 return STATUS_ENDSTREAM
142             if $self->smartEof() ;
143              
144 973         12327 my $buffer;
145              
146 973 100       2170 if ( ! $self->smartReadExact(\$buffer, 3 )){
147 1         20 $self->pushBack($buffer);
148 1         6 return STATUS_ENDSTREAM;
149             }
150              
151             #$self->smartReadExact(\$buffer, 3 )
152             # or return $self->saveErrorString(STATUS_ERROR,"Minimum header size is " .
153             # 3 . " bytes") ;
154              
155 972         29540 my $sig = substr($buffer, 0, 2);
156 972         2231 my $type = unpack 'C', substr($buffer, 2, 1);
157              
158 972 100       2120 if ($sig ne SIGNATURE) {
159 16         46 $self->pushBack($buffer);
160 16         167 return STATUS_ENDSTREAM
161             }
162              
163             #return STATUS_ENDSTREAM
164             # if $sig ne SIGNATURE;
165              
166 956         1358 my $cSize = 0;
167 956         1310 my $uSize = 0;
168 956 100       2125 if ($type == 0) { # uncompressed
    50          
169 790 100       1804 $self->smartReadExact(\$buffer, 2)
170             or return $self->saveErrorString(STATUS_ERROR, "xxx");
171 774         27754 $uSize = unpack("n", $buffer);
172 774         1265 $cSize = $uSize;
173 774         2135 *$self->{Uncomp}->setIdentity();
174             }
175             elsif ($type == 1) { # compressed
176 166 50       395 $self->smartReadExact(\$buffer, 4)
177             or return $self->saveErrorString(STATUS_ERROR, "xxx");
178 166         5715 ($cSize, $uSize) = unpack("n n", $buffer);
179 166         502 *$self->{Uncomp}->setUSize($uSize);
180             }
181             #elsif ($type == 2) { # CRC - not implemented by lzf yet
182             #}
183             else {
184 0         0 return $self->saveErrorString(STATUS_ERROR, "unexpected block type - $type", STATUS_ERROR);
185              
186             }
187              
188 940         2481 *$self->{LzfData}{compSize} = $cSize;
189 940         1578 *$self->{LzfData}{uncSize} = $uSize;
190              
191 940 100       2023 $self->smartReadExact($buff, $cSize)
192             or return $self->saveErrorString(STATUS_ERROR, "xxx");
193              
194 352         11620 return STATUS_OK;
195             }
196              
197              
198             sub postBlockChk
199             {
200 350     350 0 4977 my $self = shift ;
201 350         514 my $buffer = shift ;
202 350         486 my $offset = shift ;
203              
204             return $self->saveErrorString(STATUS_ERROR, "uncompressed size wrong", STATUS_ERROR)
205 350 50       877 if length($$buffer) - $offset != *$self->{LzfData}{uncSize} ;
206              
207 350         662 return STATUS_OK;
208             }
209              
210             sub isLzfMagic
211             {
212 1010     1010 0 1686 my $buffer = shift ;
213 1010         1946 my $sig = substr($buffer, 0, 2);
214 1010         2753 my $type = unpack 'C', substr($buffer, 2, 1);
215 1010   66     5106 return $sig eq SIGNATURE && ($type == 0 || $type == 1);
216             }
217              
218             1 ;
219              
220             __END__