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