xref: /openbsd-src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm (revision 3d61058aa5c692477b6d18acfbbdb653a9930ff9)
1package IO::Compress::Bzip2 ;
2
3use strict ;
4use warnings;
5use bytes;
6require Exporter ;
7
8use IO::Compress::Base 2.212 ;
9
10use IO::Compress::Base::Common  2.212 qw();
11use IO::Compress::Adapter::Bzip2 2.212 ;
12
13
14
15our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error);
16
17$VERSION = '2.212';
18$Bzip2Error = '';
19
20@ISA    = qw(IO::Compress::Base Exporter);
21@EXPORT_OK = qw( $Bzip2Error bzip2 ) ;
22%EXPORT_TAGS = %IO::Compress::Base::EXPORT_TAGS ;
23push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
24Exporter::export_ok_tags('all');
25
26
27
28sub new
29{
30    my $class = shift ;
31
32    my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$Bzip2Error);
33    return $obj->_create(undef, @_);
34}
35
36sub bzip2
37{
38    my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$Bzip2Error);
39    $obj->_def(@_);
40}
41
42
43sub mkHeader
44{
45    my $self = shift ;
46    return '';
47
48}
49
50sub getExtraParams
51{
52    my $self = shift ;
53
54    use IO::Compress::Base::Common  2.212 qw(:Parse);
55
56    return (
57            'blocksize100k' => [IO::Compress::Base::Common::Parse_unsigned,  1],
58            'workfactor'    => [IO::Compress::Base::Common::Parse_unsigned,  0],
59            'verbosity'     => [IO::Compress::Base::Common::Parse_boolean,   0],
60        );
61}
62
63
64
65sub ckParams
66{
67    my $self = shift ;
68    my $got = shift;
69
70    # check that BlockSize100K is a number between 1 & 9
71    if ($got->parsed('blocksize100k')) {
72        my $value = $got->getValue('blocksize100k');
73        return $self->saveErrorString(undef, "Parameter 'BlockSize100K' not between 1 and 9, got $value")
74            unless defined $value && $value >= 1 && $value <= 9;
75
76    }
77
78    # check that WorkFactor between 0 & 250
79    if ($got->parsed('workfactor')) {
80        my $value = $got->getValue('workfactor');
81        return $self->saveErrorString(undef, "Parameter 'WorkFactor' not between 0 and 250, got $value")
82            unless $value >= 0 && $value <= 250;
83    }
84
85    return 1 ;
86}
87
88
89sub mkComp
90{
91    my $self = shift ;
92    my $got = shift ;
93
94    my $BlockSize100K = $got->getValue('blocksize100k');
95    my $WorkFactor    = $got->getValue('workfactor');
96    my $Verbosity     = $got->getValue('verbosity');
97
98    my ($obj, $errstr, $errno) = IO::Compress::Adapter::Bzip2::mkCompObject(
99                                               $BlockSize100K, $WorkFactor,
100                                               $Verbosity);
101
102    return $self->saveErrorString(undef, $errstr, $errno)
103        if ! defined $obj;
104
105    return $obj;
106}
107
108
109sub mkTrailer
110{
111    my $self = shift ;
112    return '';
113}
114
115sub mkFinalTrailer
116{
117    return '';
118}
119
120#sub newHeader
121#{
122#    my $self = shift ;
123#    return '';
124#}
125
126sub getInverseClass
127{
128    return ('IO::Uncompress::Bunzip2');
129}
130
131sub getFileInfo
132{
133    my $self = shift ;
134    my $params = shift;
135    my $file = shift ;
136
137}
138
1391;
140
141__END__
142
143=head1 NAME
144
145IO::Compress::Bzip2 - Write bzip2 files/buffers
146
147=head1 SYNOPSIS
148
149    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
150
151    my $status = bzip2 $input => $output [,OPTS]
152        or die "bzip2 failed: $Bzip2Error\n";
153
154    my $z = IO::Compress::Bzip2->new( $output [,OPTS] )
155        or die "bzip2 failed: $Bzip2Error\n";
156
157    $z->print($string);
158    $z->printf($format, $string);
159    $z->write($string);
160    $z->syswrite($string [, $length, $offset]);
161    $z->flush();
162    $z->tell();
163    $z->eof();
164    $z->seek($position, $whence);
165    $z->binmode();
166    $z->fileno();
167    $z->opened();
168    $z->autoflush();
169    $z->input_line_number();
170    $z->newStream( [OPTS] );
171
172    $z->close() ;
173
174    $Bzip2Error ;
175
176    # IO::File mode
177
178    print $z $string;
179    printf $z $format, $string;
180    tell $z
181    eof $z
182    seek $z, $position, $whence
183    binmode $z
184    fileno $z
185    close $z ;
186
187=head1 DESCRIPTION
188
189This module provides a Perl interface that allows writing bzip2
190compressed data to files or buffer.
191
192For reading bzip2 files/buffers, see the companion module
193L<IO::Uncompress::Bunzip2|IO::Uncompress::Bunzip2>.
194
195=head1 Functional Interface
196
197A top-level function, C<bzip2>, is provided to carry out
198"one-shot" compression between buffers and/or files. For finer
199control over the compression process, see the L</"OO Interface">
200section.
201
202    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
203
204    bzip2 $input_filename_or_reference => $output_filename_or_reference [,OPTS]
205        or die "bzip2 failed: $Bzip2Error\n";
206
207The functional interface needs Perl5.005 or better.
208
209=head2 bzip2 $input_filename_or_reference => $output_filename_or_reference [, OPTS]
210
211C<bzip2> expects at least two parameters,
212C<$input_filename_or_reference> and C<$output_filename_or_reference>
213and zero or more optional parameters (see L</Optional Parameters>)
214
215=head3 The C<$input_filename_or_reference> parameter
216
217The parameter, C<$input_filename_or_reference>, is used to define the
218source of the uncompressed data.
219
220It can take one of the following forms:
221
222=over 5
223
224=item A filename
225
226If the C<$input_filename_or_reference> parameter is a simple scalar, it is
227assumed to be a filename. This file will be opened for reading and the
228input data will be read from it.
229
230=item A filehandle
231
232If the C<$input_filename_or_reference> parameter is a filehandle, the input
233data will be read from it.  The string '-' can be used as an alias for
234standard input.
235
236=item A scalar reference
237
238If C<$input_filename_or_reference> is a scalar reference, the input data
239will be read from C<$$input_filename_or_reference>.
240
241=item An array reference
242
243If C<$input_filename_or_reference> is an array reference, each element in
244the array must be a filename.
245
246The input data will be read from each file in turn.
247
248The complete array will be walked to ensure that it only
249contains valid filenames before any data is compressed.
250
251=item An Input FileGlob string
252
253If C<$input_filename_or_reference> is a string that is delimited by the
254characters "<" and ">" C<bzip2> will assume that it is an
255I<input fileglob string>. The input is the list of files that match the
256fileglob.
257
258See L<File::GlobMapper|File::GlobMapper> for more details.
259
260=back
261
262If the C<$input_filename_or_reference> parameter is any other type,
263C<undef> will be returned.
264
265=head3 The C<$output_filename_or_reference> parameter
266
267The parameter C<$output_filename_or_reference> is used to control the
268destination of the compressed data. This parameter can take one of
269these forms.
270
271=over 5
272
273=item A filename
274
275If the C<$output_filename_or_reference> parameter is a simple scalar, it is
276assumed to be a filename.  This file will be opened for writing and the
277compressed data will be written to it.
278
279=item A filehandle
280
281If the C<$output_filename_or_reference> parameter is a filehandle, the
282compressed data will be written to it.  The string '-' can be used as
283an alias for standard output.
284
285=item A scalar reference
286
287If C<$output_filename_or_reference> is a scalar reference, the
288compressed data will be stored in C<$$output_filename_or_reference>.
289
290=item An Array Reference
291
292If C<$output_filename_or_reference> is an array reference,
293the compressed data will be pushed onto the array.
294
295=item An Output FileGlob
296
297If C<$output_filename_or_reference> is a string that is delimited by the
298characters "<" and ">" C<bzip2> will assume that it is an
299I<output fileglob string>. The output is the list of files that match the
300fileglob.
301
302When C<$output_filename_or_reference> is an fileglob string,
303C<$input_filename_or_reference> must also be a fileglob string. Anything
304else is an error.
305
306See L<File::GlobMapper|File::GlobMapper> for more details.
307
308=back
309
310If the C<$output_filename_or_reference> parameter is any other type,
311C<undef> will be returned.
312
313=head2 Notes
314
315When C<$input_filename_or_reference> maps to multiple files/buffers and
316C<$output_filename_or_reference> is a single
317file/buffer the input files/buffers will be stored
318in C<$output_filename_or_reference> as a concatenated series of compressed data streams.
319
320=head2 Optional Parameters
321
322The optional parameters for the one-shot function C<bzip2>
323are (for the most part) identical to those used with the OO interface defined in the
324L</"Constructor Options"> section. The exceptions are listed below
325
326=over 5
327
328=item C<< AutoClose => 0|1 >>
329
330This option applies to any input or output data streams to
331C<bzip2> that are filehandles.
332
333If C<AutoClose> is specified, and the value is true, it will result in all
334input and/or output filehandles being closed once C<bzip2> has
335completed.
336
337This parameter defaults to 0.
338
339=item C<< BinModeIn => 0|1 >>
340
341This option is now a no-op. All files will be read in binmode.
342
343=item C<< Append => 0|1 >>
344
345The behaviour of this option is dependent on the type of output data
346stream.
347
348=over 5
349
350=item * A Buffer
351
352If C<Append> is enabled, all compressed data will be append to the end of
353the output buffer. Otherwise the output buffer will be cleared before any
354compressed data is written to it.
355
356=item * A Filename
357
358If C<Append> is enabled, the file will be opened in append mode. Otherwise
359the contents of the file, if any, will be truncated before any compressed
360data is written to it.
361
362=item * A Filehandle
363
364If C<Append> is enabled, the filehandle will be positioned to the end of
365the file via a call to C<seek> before any compressed data is
366written to it.  Otherwise the file pointer will not be moved.
367
368=back
369
370When C<Append> is specified, and set to true, it will I<append> all compressed
371data to the output data stream.
372
373So when the output is a filehandle it will carry out a seek to the eof
374before writing any compressed data. If the output is a filename, it will be opened for
375appending. If the output is a buffer, all compressed data will be
376appended to the existing buffer.
377
378Conversely when C<Append> is not specified, or it is present and is set to
379false, it will operate as follows.
380
381When the output is a filename, it will truncate the contents of the file
382before writing any compressed data. If the output is a filehandle
383its position will not be changed. If the output is a buffer, it will be
384wiped before any compressed data is output.
385
386Defaults to 0.
387
388=back
389
390=head2 Oneshot Examples
391
392Here are a few example that show the capabilities of the module.
393
394=head3 Streaming
395
396This very simple command line example demonstrates the streaming capabilities of the module.
397The code reads data from STDIN, compresses it, and writes the compressed data to STDOUT.
398
399    $ echo hello world | perl -MIO::Compress::Bzip2=bzip2 -e 'bzip2 \*STDIN => \*STDOUT' >output.bz2
400
401The special filename "-" can be used as a standin for both C<\*STDIN> and C<\*STDOUT>,
402so the above can be rewritten as
403
404    $ echo hello world | perl -MIO::Compress::Bzip2=bzip2 -e 'bzip2 "-" => "-"' >output.bz2
405
406=head3 Compressing a file from the filesystem
407
408To read the contents of the file C<file1.txt> and write the compressed
409data to the file C<file1.txt.bz2>.
410
411    use strict ;
412    use warnings ;
413    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
414
415    my $input = "file1.txt";
416    bzip2 $input => "$input.bz2"
417        or die "bzip2 failed: $Bzip2Error\n";
418
419=head3 Reading from a Filehandle and writing to an in-memory buffer
420
421To read from an existing Perl filehandle, C<$input>, and write the
422compressed data to a buffer, C<$buffer>.
423
424    use strict ;
425    use warnings ;
426    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
427    use IO::File ;
428
429    my $input = IO::File->new( "<file1.txt" )
430        or die "Cannot open 'file1.txt': $!\n" ;
431    my $buffer ;
432    bzip2 $input => \$buffer
433        or die "bzip2 failed: $Bzip2Error\n";
434
435=head3 Compressing multiple files
436
437To compress all files in the directory "/my/home" that match "*.txt"
438and store the compressed data in the same directory
439
440    use strict ;
441    use warnings ;
442    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
443
444    bzip2 '</my/home/*.txt>' => '<*.bz2>'
445        or die "bzip2 failed: $Bzip2Error\n";
446
447and if you want to compress each file one at a time, this will do the trick
448
449    use strict ;
450    use warnings ;
451    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
452
453    for my $input ( glob "/my/home/*.txt" )
454    {
455        my $output = "$input.bz2" ;
456        bzip2 $input => $output
457            or die "Error compressing '$input': $Bzip2Error\n";
458    }
459
460=head1 OO Interface
461
462=head2 Constructor
463
464The format of the constructor for C<IO::Compress::Bzip2> is shown below
465
466    my $z = IO::Compress::Bzip2->new( $output [,OPTS] )
467        or die "IO::Compress::Bzip2 failed: $Bzip2Error\n";
468
469The constructor takes one mandatory parameter, C<$output>, defined below and
470zero or more C<OPTS>, defined in L<Constructor Options>.
471
472It returns an C<IO::Compress::Bzip2> object on success and C<undef> on failure.
473The variable C<$Bzip2Error> will contain an error message on failure.
474
475If you are running Perl 5.005 or better the object, C<$z>, returned from
476IO::Compress::Bzip2 can be used exactly like an L<IO::File|IO::File> filehandle.
477This means that all normal output file operations can be carried out
478with C<$z>.
479For example, to write to a compressed file/buffer you can use either of
480these forms
481
482    $z->print("hello world\n");
483    print $z "hello world\n";
484
485Below is a simple exaple of using the OO interface to create an output file
486C<myfile.bz2> and write some data to it.
487
488    my $filename = "myfile.bz2";
489    my $z = IO::Compress::Bzip2->new($filename)
490        or die "IO::Compress::Bzip2 failed: $Bzip2Error\n";
491
492    $z->print("abcde");
493    $z->close();
494
495See the L</Examples> for more.
496
497The mandatory parameter C<$output> is used to control the destination
498of the compressed data. This parameter can take one of these forms.
499
500=over 5
501
502=item A filename
503
504If the C<$output> parameter is a simple scalar, it is assumed to be a
505filename. This file will be opened for writing and the compressed data
506will be written to it.
507
508=item A filehandle
509
510If the C<$output> parameter is a filehandle, the compressed data will be
511written to it.
512The string '-' can be used as an alias for standard output.
513
514=item A scalar reference
515
516If C<$output> is a scalar reference, the compressed data will be stored
517in C<$$output>.
518
519=back
520
521If the C<$output> parameter is any other type, C<IO::Compress::Bzip2>::new will
522return undef.
523
524=head2 Constructor Options
525
526C<OPTS> is any combination of zero or more the following options:
527
528=over 5
529
530=item C<< AutoClose => 0|1 >>
531
532This option is only valid when the C<$output> parameter is a filehandle. If
533specified, and the value is true, it will result in the C<$output> being
534closed once either the C<close> method is called or the C<IO::Compress::Bzip2>
535object is destroyed.
536
537This parameter defaults to 0.
538
539=item C<< Append => 0|1 >>
540
541Opens C<$output> in append mode.
542
543The behaviour of this option is dependent on the type of C<$output>.
544
545=over 5
546
547=item * A Buffer
548
549If C<$output> is a buffer and C<Append> is enabled, all compressed data
550will be append to the end of C<$output>. Otherwise C<$output> will be
551cleared before any data is written to it.
552
553=item * A Filename
554
555If C<$output> is a filename and C<Append> is enabled, the file will be
556opened in append mode. Otherwise the contents of the file, if any, will be
557truncated before any compressed data is written to it.
558
559=item * A Filehandle
560
561If C<$output> is a filehandle, the file pointer will be positioned to the
562end of the file via a call to C<seek> before any compressed data is written
563to it.  Otherwise the file pointer will not be moved.
564
565=back
566
567This parameter defaults to 0.
568
569=item C<< BlockSize100K => number >>
570
571Specify the number of 100K blocks bzip2 uses during compression.
572
573Valid values are from 1 to 9, where 9 is best compression.
574
575The default is 1.
576
577=item C<< WorkFactor => number >>
578
579Specifies how much effort bzip2 should take before resorting to a slower
580fallback compression algorithm.
581
582Valid values range from 0 to 250, where 0 means use the default value 30.
583
584The default is 0.
585
586=item C<< Strict => 0|1 >>
587
588This is a placeholder option.
589
590=back
591
592=head2 Examples
593
594=head3 Streaming
595
596This very simple command line example demonstrates the streaming capabilities
597of the module. The code reads data from STDIN or all the files given on the
598commandline, compresses it, and writes the compressed data to STDOUT.
599
600    use strict ;
601    use warnings ;
602    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
603
604    my $z = IO::Compress::Bzip2->new("-", Stream => 1)
605        or die "IO::Compress::Bzip2 failed: $Bzip2Error\n";
606
607    while (<>) {
608        $z->print("abcde");
609    }
610    $z->close();
611
612Note the use of C<"-"> to means C<STDOUT>. Alternatively you can use C<\*STDOUT>.
613
614=head3 Compressing a file from the filesystem
615
616To read the contents of the file C<file1.txt> and write the compressed
617data to the file C<file1.txt.bz2> there are a few options
618
619Start by creating the compression object and opening the input file
620
621    use strict ;
622    use warnings ;
623    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
624
625    my $input = "file1.txt";
626    my $z = IO::Compress::Bzip2->new("file1.txt.bz2")
627        or die "IO::Compress::Bzip2 failed: $Bzip2Error\n";
628
629    # open the input file
630    open my $fh, "<", "file1.txt"
631        or die "Cannot open file1.txt: $!\n";
632
633    # loop through the input file & write to the compressed file
634    while (<$fh>) {
635        $z->print($_);
636    }
637
638    # not forgetting to close the compressed file
639    $z->close();
640
641=head1 Methods
642
643=head2 print
644
645Usage is
646
647    $z->print($data)
648    print $z $data
649
650Compresses and outputs the contents of the C<$data> parameter. This
651has the same behaviour as the C<print> built-in.
652
653Returns true if successful.
654
655=head2 printf
656
657Usage is
658
659    $z->printf($format, $data)
660    printf $z $format, $data
661
662Compresses and outputs the contents of the C<$data> parameter.
663
664Returns true if successful.
665
666=head2 syswrite
667
668Usage is
669
670    $z->syswrite $data
671    $z->syswrite $data, $length
672    $z->syswrite $data, $length, $offset
673
674Compresses and outputs the contents of the C<$data> parameter.
675
676Returns the number of uncompressed bytes written, or C<undef> if
677unsuccessful.
678
679=head2 write
680
681Usage is
682
683    $z->write $data
684    $z->write $data, $length
685    $z->write $data, $length, $offset
686
687Compresses and outputs the contents of the C<$data> parameter.
688
689Returns the number of uncompressed bytes written, or C<undef> if
690unsuccessful.
691
692=head2 flush
693
694Usage is
695
696    $z->flush;
697
698Flushes any pending compressed data to the output file/buffer.
699
700TODO
701
702Returns true on success.
703
704=head2 tell
705
706Usage is
707
708    $z->tell()
709    tell $z
710
711Returns the uncompressed file offset.
712
713=head2 eof
714
715Usage is
716
717    $z->eof();
718    eof($z);
719
720Returns true if the C<close> method has been called.
721
722=head2 seek
723
724    $z->seek($position, $whence);
725    seek($z, $position, $whence);
726
727Provides a sub-set of the C<seek> functionality, with the restriction
728that it is only legal to seek forward in the output file/buffer.
729It is a fatal error to attempt to seek backward.
730
731Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
732
733The C<$whence> parameter takes one the usual values, namely SEEK_SET,
734SEEK_CUR or SEEK_END.
735
736Returns 1 on success, 0 on failure.
737
738=head2 binmode
739
740Usage is
741
742    $z->binmode
743    binmode $z ;
744
745This is a noop provided for completeness.
746
747=head2 opened
748
749    $z->opened()
750
751Returns true if the object currently refers to a opened file/buffer.
752
753=head2 autoflush
754
755    my $prev = $z->autoflush()
756    my $prev = $z->autoflush(EXPR)
757
758If the C<$z> object is associated with a file or a filehandle, this method
759returns the current autoflush setting for the underlying filehandle. If
760C<EXPR> is present, and is non-zero, it will enable flushing after every
761write/print operation.
762
763If C<$z> is associated with a buffer, this method has no effect and always
764returns C<undef>.
765
766B<Note> that the special variable C<$|> B<cannot> be used to set or
767retrieve the autoflush setting.
768
769=head2 input_line_number
770
771    $z->input_line_number()
772    $z->input_line_number(EXPR)
773
774This method always returns C<undef> when compressing.
775
776=head2 fileno
777
778    $z->fileno()
779    fileno($z)
780
781If the C<$z> object is associated with a file or a filehandle, C<fileno>
782will return the underlying file descriptor. Once the C<close> method is
783called C<fileno> will return C<undef>.
784
785If the C<$z> object is associated with a buffer, this method will return
786C<undef>.
787
788=head2 close
789
790    $z->close() ;
791    close $z ;
792
793Flushes any pending compressed data and then closes the output file/buffer.
794
795For most versions of Perl this method will be automatically invoked if
796the IO::Compress::Bzip2 object is destroyed (either explicitly or by the
797variable with the reference to the object going out of scope). The
798exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
799these cases, the C<close> method will be called automatically, but
800not until global destruction of all live objects when the program is
801terminating.
802
803Therefore, if you want your scripts to be able to run on all versions
804of Perl, you should call C<close> explicitly and not rely on automatic
805closing.
806
807Returns true on success, otherwise 0.
808
809If the C<AutoClose> option has been enabled when the IO::Compress::Bzip2
810object was created, and the object is associated with a file, the
811underlying file will also be closed.
812
813=head2 newStream([OPTS])
814
815Usage is
816
817    $z->newStream( [OPTS] )
818
819Closes the current compressed data stream and starts a new one.
820
821OPTS consists of any of the options that are available when creating
822the C<$z> object.
823
824See the L</"Constructor Options"> section for more details.
825
826=head1 Importing
827
828No symbolic constants are required by IO::Compress::Bzip2 at present.
829
830=over 5
831
832=item :all
833
834Imports C<bzip2> and C<$Bzip2Error>.
835Same as doing this
836
837    use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
838
839=back
840
841=head1 EXAMPLES
842
843=head2 Apache::GZip Revisited
844
845See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
846
847=head2 Working with Net::FTP
848
849See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
850
851=head1 SUPPORT
852
853General feedback/questions/bug reports should be sent to
854L<https://github.com/pmqs/IO-Compress/issues> (preferred) or
855L<https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Compress>.
856
857=head1 SEE ALSO
858
859L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzip>, L<IO::Uncompress::UnLzip>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Compress::Zstd>, L<IO::Uncompress::UnZstd>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
860
861L<IO::Compress::FAQ|IO::Compress::FAQ>
862
863L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
864L<Archive::Tar|Archive::Tar>,
865L<IO::Zlib|IO::Zlib>
866
867The primary site for the bzip2 program is L<https://sourceware.org/bzip2/>.
868
869See the module L<Compress::Bzip2|Compress::Bzip2>
870
871=head1 AUTHOR
872
873This module was written by Paul Marquess, C<pmqs@cpan.org>.
874
875=head1 MODIFICATION HISTORY
876
877See the Changes file.
878
879=head1 COPYRIGHT AND LICENSE
880
881Copyright (c) 2005-2024 Paul Marquess. All rights reserved.
882
883This program is free software; you can redistribute it and/or
884modify it under the same terms as Perl itself.
885