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   79307 use strict ;
  11         23  
  11         274  
4 11     11   48 use warnings;
  11         17  
  11         276  
5 11     11   49 use bytes;
  11         18  
  11         46  
6              
7 11     11   353 use IO::Compress::Base::Common 2.204 qw(:Status createSelfTiedObject);
  11         207  
  11         1195  
8              
9 11     11   3847 use IO::Uncompress::Base 2.204 ;
  11         57835  
  11         630  
10 11     11   3211 use IO::Uncompress::Adapter::Lzf 2.204 ;
  11         203  
  11         1053  
11              
12              
13             require Exporter ;
14             our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnLzfError);
15              
16             $VERSION = '2.204';
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   65 use constant SIGNATURE => 'ZV';
  11         19  
  11         8977  
26              
27             sub new
28             {
29 786     786 1 1374916 my $class = shift ;
30 786         2275 my $obj = createSelfTiedObject($class, \$UnLzfError);
31              
32 786         26785 $obj->_create(undef, 0, @_);
33             }
34              
35             sub unlzf
36             {
37 63     63 1 77978 my $obj = createSelfTiedObject(undef, \$UnLzfError);
38 63         2233 return $obj->_inf(@_);
39             }
40              
41             sub getExtraParams
42             {
43 832     832 0 31130 return ();
44             }
45              
46             sub ckParams
47             {
48 838     838 0 53129 my $self = shift ;
49 838         1288 my $got = shift ;
50              
51 838         1314 return 1;
52             }
53              
54              
55             sub postCheckParams
56             {
57 828     828 0 135242 my $self = shift ;
58 828         1028 my $got = shift ;
59              
60 828 100       1676 return $self->saveErrorString(undef, "MultiStream not supported by Lzf", STATUS_ERROR)
61             if $got->getValue('multistream') ;
62              
63 826         4191 $got->setValue('multistream' => 0);
64 826         4446 return 1;
65             }
66              
67             sub mkUncomp
68             {
69 837     837 0 98470 my $self = shift ;
70 837         1039 my $got = shift ;
71              
72 837 100       1414 my $magic = $self->ckMagic()
73             or return 0;
74              
75 777 50       1426 *$self->{Info} = $self->readHeader($magic)
76             or return undef ;
77              
78 777         1961 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Lzf::mkUncompObject();
79              
80 777 50       1478 return $self->saveErrorString(undef, $errstr, $errno)
81             if ! defined $obj;
82              
83 777         1168 *$self->{Uncomp} = $obj;
84              
85 777         1419 return 1;
86             }
87              
88              
89             sub ckMagic
90             {
91 1018     1018 0 375283 my $self = shift;
92              
93 1018         1225 my $magic ;
94 1018         2708 $self->smartReadExact(\$magic, 3);
95              
96 1018         42405 *$self->{HeaderPending} = $magic ;
97              
98 1018 100       2392 return $self->HeaderError("Header size is " .
99             3 . " bytes")
100             if length $magic != 3;
101              
102 1010 100       1914 return $self->HeaderError("Bad Magic.")
103             if ! isLzfMagic($magic) ;
104              
105              
106 956         1768 *$self->{Type} = 'lzf';
107 956         2226 return $magic;
108             }
109              
110             sub readHeader
111             {
112 956     956 0 2039 my $self = shift;
113 956         1188 my $magic = shift ;
114              
115 956         2227 $self->pushBack($magic);
116 956         9110 *$self->{HeaderPending} = '';
117              
118             return {
119 956         4043 '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 15386 return STATUS_OK;
133             }
134              
135             sub readBlock
136             {
137 1297     1297 0 1262015 my $self = shift ;
138 1297         1585 my $buff = shift ;
139 1297         1586 my $size = shift ;
140              
141 1297 100       2455 return STATUS_ENDSTREAM
142             if $self->smartEof() ;
143              
144 973         10107 my $buffer;
145              
146 973 100       1935 if ( ! $self->smartReadExact(\$buffer, 3 )){
147 1         18 $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         23791 my $sig = substr($buffer, 0, 2);
156 972         1962 my $type = unpack 'C', substr($buffer, 2, 1);
157              
158 972 100       1879 if ($sig ne SIGNATURE) {
159 16         58 $self->pushBack($buffer);
160 16         168 return STATUS_ENDSTREAM
161             }
162              
163             #return STATUS_ENDSTREAM
164             # if $sig ne SIGNATURE;
165              
166 956         1123 my $cSize = 0;
167 956         1074 my $uSize = 0;
168 956 100       1748 if ($type == 0) { # uncompressed
    50          
169 790 100       1417 $self->smartReadExact(\$buffer, 2)
170             or return $self->saveErrorString(STATUS_ERROR, "xxx");
171 774         22762 $uSize = unpack("n", $buffer);
172 774         997 $cSize = $uSize;
173 774         1745 *$self->{Uncomp}->setIdentity();
174             }
175             elsif ($type == 1) { # compressed
176 166 50       382 $self->smartReadExact(\$buffer, 4)
177             or return $self->saveErrorString(STATUS_ERROR, "xxx");
178 166         4815 ($cSize, $uSize) = unpack("n n", $buffer);
179 166         451 *$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         2008 *$self->{LzfData}{compSize} = $cSize;
189 940         1343 *$self->{LzfData}{uncSize} = $uSize;
190              
191 940 100       1717 $self->smartReadExact($buff, $cSize)
192             or return $self->saveErrorString(STATUS_ERROR, "xxx");
193              
194 352         10035 return STATUS_OK;
195             }
196              
197              
198             sub postBlockChk
199             {
200 350     350 0 4341 my $self = shift ;
201 350         456 my $buffer = shift ;
202 350         417 my $offset = shift ;
203              
204             return $self->saveErrorString(STATUS_ERROR, "uncompressed size wrong", STATUS_ERROR)
205 350 50       836 if length($$buffer) - $offset != *$self->{LzfData}{uncSize} ;
206              
207 350         576 return STATUS_OK;
208             }
209              
210             sub isLzfMagic
211             {
212 1010     1010 0 1422 my $buffer = shift ;
213 1010         1728 my $sig = substr($buffer, 0, 2);
214 1010         2281 my $type = unpack 'C', substr($buffer, 2, 1);
215 1010   66     4387 return $sig eq SIGNATURE && ($type == 0 || $type == 1);
216             }
217              
218             1 ;
219              
220             __END__