File Coverage

blib/lib/IO/Uncompress/AnyUncompress.pm
Criterion Covered Total %
statement 120 175 68.5
branch 20 56 35.7
condition 8 21 38.1
subroutine 31 31 100.0
pod 2 6 33.3
total 181 289 62.6


line stmt bran cond sub pod time code
1             package IO::Uncompress::AnyUncompress ;
2              
3 83     83   12555778 use strict;
  83         235  
  83         3223  
4 83     83   473 use warnings;
  83         199  
  83         4963  
5 83     83   3166 use bytes;
  83         3158  
  83         663  
6              
7 83     83   22291 use IO::Compress::Base::Common 2.220 ();
  83         2629  
  83         3462  
8              
9 83     83   21915 use IO::Uncompress::Base 2.220 ;
  83         2389  
  83         25778  
10              
11              
12             require Exporter ;
13              
14             our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError);
15              
16             $VERSION = '2.220';
17             $AnyUncompressError = '';
18              
19             @ISA = qw(IO::Uncompress::Base Exporter);
20             @EXPORT_OK = qw( $AnyUncompressError anyuncompress ) ;
21             %EXPORT_TAGS = %IO::Uncompress::Base::DEFLATE_CONSTANTS if keys %IO::Uncompress::Base::DEFLATE_CONSTANTS;
22             $EXPORT_TAGS{all} = [ defined $EXPORT_TAGS{all} ? @{ $EXPORT_TAGS{all} } : (), @EXPORT_OK ] ;
23             Exporter::export_ok_tags('all');
24              
25             # TODO - allow the user to pick a set of the three formats to allow
26             # or just assume want to auto-detect any of the three formats.
27              
28             BEGIN
29             {
30 83     83   751 local @INC = @INC;
31 83 50       525 pop @INC if $INC[-1] eq '.';
32              
33             # Don't trigger any __DIE__ Hooks.
34 83         491 local $SIG{__DIE__};
35              
36 83     83   8159 eval ' use IO::Uncompress::Adapter::Inflate 2.220 ;';
  83         23291  
  83         2013  
  83         1688  
37 83     83   7793 eval ' use IO::Uncompress::Adapter::Bunzip2 2.220 ;';
  83         31562  
  83         4179  
  83         1739  
38 83     83   5984 eval ' use IO::Uncompress::Adapter::LZO 2.217 ;';
  83         12978  
  0         0  
  0         0  
39 83     83   9704 eval ' use IO::Uncompress::Adapter::Lzf 2.217 ;';
  83         13023  
  0         0  
  0         0  
40 83     83   7779 eval ' use IO::Uncompress::Adapter::UnLzma 2.217 ;';
  83         34547  
  0         0  
  0         0  
41 83     83   39025 eval ' use IO::Uncompress::Adapter::UnXz 2.217 ;';
  83         37640  
  0         0  
  0         0  
42 83     83   35370 eval ' use IO::Uncompress::Adapter::UnZstd 2.217 ;';
  83         10091  
  0         0  
  0         0  
43 83     83   5641 eval ' use IO::Uncompress::Adapter::UnLzip 2.217 ;';
  83         42357  
  0         0  
  0         0  
44              
45 83     83   46394 eval ' use IO::Uncompress::Bunzip2 2.220 ;';
  83         45806  
  83         2658  
  83         3528  
46 83     83   13826 eval ' use IO::Uncompress::UnLzop 2.217 ;';
  83         10708  
  0         0  
  0         0  
47 83     83   5824 eval ' use IO::Uncompress::Gunzip 2.220 ;';
  83         45563  
  83         2265  
  83         3508  
48 83     83   6188 eval ' use IO::Uncompress::Inflate 2.220 ;';
  83         40723  
  83         2331  
  83         3539  
49 83     83   6793 eval ' use IO::Uncompress::RawInflate 2.220 ;';
  83         549  
  83         1169  
  83         2613  
50 83     83   5825 eval ' use IO::Uncompress::Unzip 2.220 ;';
  83         49483  
  83         2546  
  83         3712  
51 83     83   6662 eval ' use IO::Uncompress::UnLzf 2.217 ;';
  83         11543  
  0         0  
  0         0  
52 83     83   5968 eval ' use IO::Uncompress::UnLzma 2.217 ;';
  83         50760  
  0         0  
  0         0  
53 83     83   43330 eval ' use IO::Uncompress::UnXz 2.217 ;';
  83         46532  
  0         0  
  0         0  
54 83     83   39815 eval ' use IO::Uncompress::UnZstd 2.217 ;';
  83         11144  
  0         0  
  0         0  
55 83     83   5954 eval ' use IO::Uncompress::UnLzip 2.217 ;';
  83         45036  
  0         0  
  0         0  
56              
57             }
58              
59             sub new
60             {
61 1144     1144 1 370756 my $class = shift ;
62 1144         5410 my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$AnyUncompressError);
63 1144         5823 $obj->_create(undef, 0, @_);
64             }
65              
66             sub anyuncompress
67             {
68 285     285 1 379127 my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$AnyUncompressError);
69 285         2248 return $obj->_inf(@_) ;
70             }
71              
72             sub getExtraParams
73             {
74 1349     1349 0 15221 return ( 'rawinflate' => [IO::Compress::Base::Common::Parse_boolean, 0] ,
75             'unlzma' => [IO::Compress::Base::Common::Parse_boolean, 0] ) ;
76             }
77              
78             sub ckParams
79             {
80 1404     1404 0 2941 my $self = shift ;
81 1404         2657 my $got = shift ;
82              
83             # any always needs both crc32 and adler32
84 1404         5992 $got->setValue('crc32' => 1);
85 1404         4071 $got->setValue('adler32' => 1);
86              
87 1404         4457 return 1;
88             }
89              
90             sub mkUncomp
91             {
92 1404     1404 0 2999 my $self = shift ;
93 1404         2468 my $got = shift ;
94              
95 1404         2349 my $magic ;
96              
97             # try zlib first
98 1404 50       3796 if (defined $IO::Uncompress::RawInflate::VERSION )
99             {
100 1404         5903 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject();
101              
102 1404 50       4409 return $self->saveErrorString(undef, $errstr, $errno)
103             if ! defined $obj;
104              
105 1404         4542 *$self->{Uncomp} = $obj;
106              
107 1404         4650 my @possible = qw( Inflate Gunzip Unzip );
108 1404 100       5463 unshift @possible, 'RawInflate'
109             if $got->getValue('rawinflate');
110              
111 1404         4790 $magic = $self->ckMagic( @possible );
112              
113 1404 100       4130 if ($magic) {
114 1139 50       3785 *$self->{Info} = $self->readHeader($magic)
115             or return undef ;
116              
117 1139         6745 return 1;
118             }
119             }
120              
121 265 50 33     856 if (defined $IO::Uncompress::UnLzma::VERSION && $got->getValue('unlzma'))
122             {
123 0         0 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::UnLzma::mkUncompObject();
124              
125 0 0       0 return $self->saveErrorString(undef, $errstr, $errno)
126             if ! defined $obj;
127              
128 0         0 *$self->{Uncomp} = $obj;
129              
130 0         0 my @possible = qw( UnLzma );
131             #unshift @possible, 'RawInflate'
132             # if $got->getValue('rawinflate');
133              
134 0 0       0 if ( *$self->{Info} = $self->ckMagic( @possible ))
135             {
136 0         0 return 1;
137             }
138             }
139              
140 265 50 33     754 if (defined $IO::Uncompress::UnXz::VERSION and
141             $magic = $self->ckMagic('UnXz')) {
142 0 0       0 *$self->{Info} = $self->readHeader($magic)
143             or return undef ;
144              
145 0         0 my ($obj, $errstr, $errno) =
146             IO::Uncompress::Adapter::UnXz::mkUncompObject();
147              
148 0 0       0 return $self->saveErrorString(undef, $errstr, $errno)
149             if ! defined $obj;
150              
151 0         0 *$self->{Uncomp} = $obj;
152              
153 0         0 return 1;
154             }
155              
156 265 100 66     1124 if (defined $IO::Uncompress::Bunzip2::VERSION and
157             $magic = $self->ckMagic('Bunzip2')) {
158 250 50       941 *$self->{Info} = $self->readHeader($magic)
159             or return undef ;
160              
161 250         938 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Bunzip2::mkUncompObject();
162              
163 250 50       648 return $self->saveErrorString(undef, $errstr, $errno)
164             if ! defined $obj;
165              
166 250         1981 *$self->{Uncomp} = $obj;
167              
168 250         856 return 1;
169             }
170              
171 15 50 33     86 if (defined $IO::Uncompress::UnLzop::VERSION and
172             $magic = $self->ckMagic('UnLzop')) {
173              
174 0 0       0 *$self->{Info} = $self->readHeader($magic)
175             or return undef ;
176              
177 0         0 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::LZO::mkUncompObject();
178              
179 0 0       0 return $self->saveErrorString(undef, $errstr, $errno)
180             if ! defined $obj;
181              
182 0         0 *$self->{Uncomp} = $obj;
183              
184 0         0 return 1;
185             }
186              
187 15 50 33     90 if (defined $IO::Uncompress::UnLzf::VERSION and
188             $magic = $self->ckMagic('UnLzf')) {
189              
190 0 0       0 *$self->{Info} = $self->readHeader($magic)
191             or return undef ;
192              
193 0         0 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Lzf::mkUncompObject();
194              
195 0 0       0 return $self->saveErrorString(undef, $errstr, $errno)
196             if ! defined $obj;
197              
198 0         0 *$self->{Uncomp} = $obj;
199              
200 0         0 return 1;
201             }
202              
203 15 50 33     97 if (defined $IO::Uncompress::UnZstd::VERSION and
204             $magic = $self->ckMagic('UnZstd')) {
205              
206 0 0       0 *$self->{Info} = $self->readHeader($magic)
207             or return undef ;
208              
209 0         0 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::UnZstd::mkUncompObject();
210              
211 0 0       0 return $self->saveErrorString(undef, $errstr, $errno)
212             if ! defined $obj;
213              
214 0         0 *$self->{Uncomp} = $obj;
215              
216 0         0 return 1;
217             }
218              
219              
220 15 50 33     56 if (defined $IO::Uncompress::UnLzip::VERSION and
221             $magic = $self->ckMagic('UnLzip')) {
222              
223 0 0       0 *$self->{Info} = $self->readHeader($magic)
224             or return undef ;
225              
226 0         0 my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::UnLzip::mkUncompObject(*$self->{Info}{DictSize});
227              
228 0 0       0 return $self->saveErrorString(undef, $errstr, $errno)
229             if ! defined $obj;
230              
231 0         0 *$self->{Uncomp} = $obj;
232              
233 0         0 return 1;
234             }
235              
236 15         46 return 0 ;
237             }
238              
239              
240              
241             sub ckMagic
242             {
243 1669     1669 0 3033 my $self = shift;
244 1669         4567 my @names = @_ ;
245              
246 1669         5676 my $keep = ref $self ;
247 1669         4183 for my $class ( map { "IO::Uncompress::$_" } @names)
  5862         15187  
248             {
249 4093         18738 bless $self => $class;
250 4093         16895 my $magic = $self->ckMagic();
251              
252 4093 100       9233 if ($magic)
253             {
254             #bless $self => $class;
255 1389         6165 return $magic ;
256             }
257              
258 2704         8351 $self->pushBack(*$self->{HeaderPending}) ;
259 2704         6165 *$self->{HeaderPending} = '' ;
260             }
261              
262 280         1273 bless $self => $keep;
263 280         907 return undef;
264             }
265              
266             1 ;
267              
268             __END__