From 3b2e2d0fa56ffe7b6823462b0cc32e6f8f76dfed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E7=91=AA=E8=B2=93?= Date: Sat, 19 Mar 2022 09:23:39 +0800 Subject: [PATCH] Replaced Compress::Zlib with IO::Compress::Gzip and IO::Uncompress::Gunzip. Replaced Compress::Bzip2 with IO::Compress::Bzip2 and IO::Uncompress::Bunzip2. --- Build.PL | 4 +- Changes | 6 +- Makefile.PL | 4 +- README.md | 76 ++++++++++++------------ arclog | 162 +++++++++++++++++++++++++-------------------------- t/_helper.pm | 71 ++++++++++------------ 6 files changed, 159 insertions(+), 164 deletions(-) diff --git a/Build.PL b/Build.PL index 33b8e88..f7aafe2 100755 --- a/Build.PL +++ b/Build.PL @@ -62,8 +62,8 @@ my $build = Module::Build->new( }, recommends => { "File::MMagic" => 0, - "Compress::Zlib" => 0, - "Compress::Bzip2" => 2, + "IO::Compress::Gzip" => 0, + "IO::Compress::Bzip2" => 2, "IO::Compress::Xz" => 0, "Term::ReadKey" => 0, }, diff --git a/Changes b/Changes index 0c9de0e..5de9f56 100644 --- a/Changes +++ b/Changes @@ -1,7 +1,11 @@ arclog change log 2022-03-19 - Added support for the xz compression. + 1. Added support for the xz compression. + 2. Replaced Compress::Zlib with IO::Compress::Gzip and + IO::Uncompress::Gunzip. + 2. Replaced Compress::Bzip2 with IO::Compress::Bzip2 and + IO::Uncompress::Bunzip2. 2020-02-06 version 3.05 1. Replaced the messy GNU-styled, multi-lingual documents with a diff --git a/Makefile.PL b/Makefile.PL index a10496d..8b49e45 100755 --- a/Makefile.PL +++ b/Makefile.PL @@ -52,8 +52,8 @@ EOT our (%OPT_PREREQ); %OPT_PREREQ = ( "File::MMagic" => 0, - "Compress::Zlib" => 0, - "Compress::Bzip2" => 2, + "IO::Compress::Gzip" => 0, + "IO::Compress::Bzip2" => 2, "IO::Compress::Xz" => 0, "Term::ReadKey" => 0, ); diff --git a/README.md b/README.md index 1cd02eb..fbae653 100644 --- a/README.md +++ b/README.md @@ -174,22 +174,23 @@ System Requirement the [GnuWin32] home page. Be sure to save it as `file.exe` somewhere in your `PATH`. - * [Compress::Zlib] + * [IO::Compress::Gzip] and [IO::Uncompress::Gunzip] - This is used to support reading/writing the gzip compressed + They are used to support reading/writing the gzip compressed files. It is only needed when gzip compressed files are - encountered. If it is not available, `arclog` tries the `gzip` - executable instead. If that is not available, too, `arclog` - fails. You should not worry about Compress::Zlib since it comes - with Perl since version 5.9.3. If not, it is contained in the - [IO-Compress] distribution. You can download and install it from - the CPAN archive, or install it with the CPAN shell: + encountered. If they are not available, `arclog` tries the + `gzip` executable instead. If that is not available, too, + `arclog` fails. You should not worry about IO::Compress::Gzip + since it comes with Perl since version 5.9.3. If not, it is + contained in the [IO-Compress] distribution. You can download + and install it from the CPAN archive, or install it with the + CPAN shell: - cpan Compress::Zlib + cpan IO::Compress::Gzip or with the CPANPLUS shell: - cpanp i Compress::Zlib + cpanp i IO::Compress::Gzip For Debian/Ubuntu: @@ -211,38 +212,39 @@ System Requirement [the gzip website]. Be sure to save it as `gzip.exe` somewhere in your `PATH`. - * [Compress::Bzip2] version 2 or above. + * [IO::Compress::Bzip2] and [IO::Uncompress::Bunzip2] - This is used to support reading/writing the bzip2 compressed - files. It is only needed when bzip2 compressed files are - encountered. If it is not available, `arclog` tries the `bzip2` - executable instead. If that is not available, too, `arclog` - fails. Notice that older versions before 2 does not work, since - the file I/O compression was not implemented yet. You can - download and install Compress::Bzip2 from the CPAN archive, or - install it with the CPAN shell: + They are used to support reading/writing the bzip2 compressed + files. They are only needed when bzip2 compressed files are + encountered. If they are not available, `arclog` tries the + `bzip2` executable instead. If that is not available, too, + `arclog` fails. You should not worry about IO::Compress::Bzip2 + since it comes with Perl since version 5.10.1. If not, it is + contained in the [IO-Compress] distribution. You can download + and install it from the CPAN archive, or install it with the + CPAN shell: - cpan Compress::Bzip2 + cpan IO::Compress::Bzip2 or with the CPANPLUS shell: - cpanp i Compress::Bzip2 + cpanp i IO::Compress::Bzip2 For Debian/Ubuntu: - sudo apt install libcompress-bzip2-perl + sudo apt install libio-compress-perl For Red Hat/Fedora/CentOS: - sudo yum install perl-Compress-Bzip2 + sudo yum install perl-IO-Compress For FreeBSD: - ports install p5-Compress-Bzip2 + ports install p5-IO-Compress For ActivePerl: - ppm install Compress-Bzip2 + ppm install IO-Compress The alternative `bzip2.exe` for MS-Windows can be obtained from [the bzip2 website]. Be sure to save it as `bzip2.exe` somewhere @@ -320,10 +322,12 @@ System Requirement [Date::Parse]: https://metacpan.org/pod/Date::Parse [File::MMagic]: https://metacpan.org/pod/File::MMagic [GnuWin32]: http://gnuwin32.sourceforge.net -[Compress::Zlib]: https://metacpan.org/pod/Compress::Zlib +[IO::Compress::Gzip]: https://metacpan.org/pod/IO::Compress::Gzip +[IO::Uncompress::Gunzip]: https://metacpan.org/pod/IO::Uncompress::Gunzip [the gzip website]: https://www.gzip.org [IO-Compress]: https://metacpan.org/dist/IO-Compress -[Compress::Bzip2]: https://metacpan.org/pod/Compress::Bzip2 +[IO::Compress::Bzip2]: https://metacpan.org/pod/IO::Compress::Bzip2 +[IO::Uncompress::Bunzip2]: https://metacpan.org/pod/IO::Uncompress::Bunzip2 [the bzip2 website]: http://www.bzip.org [IO::Compress::Xz]: https://metacpan.org/pod/IO::Compress::Xz [IO::Uncompress::UnXz]: https://metacpan.org/pod/IO::Uncompress::UnXz @@ -492,18 +496,18 @@ Options * `g`, `gzip` Compress with `gzip`. This is the default. `arclog` can use - `Compress::Zlib` to compress instead of calling `gzip`. This can - be safer and faster for not calling foreign binaries. If - `Compress::Zlib` is not installed, it tries `gzip` instead. If - `gzip` is not available, either, it fails. + `IO::Compress::Gzip` to compress instead of calling `gzip`. + This can be safer and faster for not calling foreign binaries. + If `IO::Compress::Gzip` is not installed, it tries `gzip` + instead. If `gzip` is not available, either, it fails. * `b`, `bzip2` - Compress with `bzip2`. `arclog` can use `Compress::Bzip2` to - compress instead of calling `bzip2`. This can be safer and faster - for not calling foreign binaries. If `Compress::Bzip2` is not - installed, it tries `bzip2` instead. If `bzip2` is not available, - either, it fails. + Compress with `bzip2`. `arclog` can use `IO::Compress::Bzip2` + to compress instead of calling `bzip2`. This can be safer and + faster for not calling foreign binaries. If + `IO::Compress::Bzip2` is not installed, it tries `bzip2` + instead. If `bzip2` is not available, either, it fails. * `x`, `xz` diff --git a/arclog b/arclog index 64f260a..96382df 100755 --- a/arclog +++ b/arclog @@ -824,7 +824,6 @@ sub check_type : method { # Check by file name suffix # Check by file name suffix on empty files, too. - # Compress::Bzip2 2 creates empty files that confuses further processing. if (-z $FH || $MAGIC_METHOD eq MAGIC_SUFFIX) { return TYPE_GZIP if $file =~ /\.gz$/; return TYPE_BZIP2 if $file =~ /\.bz2$/; @@ -1265,13 +1264,13 @@ sub check_gzip : method { # Checked before return ref($GZIP_IO)->new if defined $GZIP_IO; - # See whether Compress::Zlib or gzip + # See whether IO::Compress::Gzip or gzip print STDERR "Checking gzip I/O handler to use ... " if $VERBOSE > 1; - print STDERR "\n Checking Compress::Zlib ... " if $VERBOSE > 2; - # Check if we have Compress::Zlib - if (eval { require Compress::Zlib; 1; }) { + print STDERR "\n Checking IO::Compress::Gzip ... " if $VERBOSE > 2; + # Check if we have IO::Compress::Gzip + if (eval { require IO::Compress::Gzip; require IO::Uncompress::Gunzip; 1; }) { print STDERR "OK\nfound " if $VERBOSE > 2; - print STDERR "Compress::Zlib\n" if $VERBOSE > 1; + print STDERR "IO::Compress::Gzip\n" if $VERBOSE > 1; return ($GZIP_IO = _private::IO::Gzip::PM->new); } # Not found @@ -1290,7 +1289,7 @@ sub check_gzip : method { print STDERR "no\n" if $VERBOSE > 2; print STDERR "not found\n" if $VERBOSE > 1; - die "$THIS_FILE: Necessary Compress::Zlib or gzip not available.\n$SHORT_HELP\n"; + die "$THIS_FILE: Necessary IO::Compress::Gzip or gzip not available.\n$SHORT_HELP\n"; } # Check for compression method of bzip2 @@ -1300,13 +1299,13 @@ sub check_bzip2 : method { # Checked before return ref($BZIP2_IO)->new if defined $BZIP2_IO; - # See whether Compress::Bzip2 or bzip2 + # See whether IO::Compress::Bzip2 or bzip2 print STDERR "Checking bzip2 I/O handler to use ... " if $VERBOSE > 1; - print STDERR "\n Checking Compress::Bzip2 ... " if $VERBOSE > 2; - # Check if we have Compress::Bzip2 - if (eval { require Compress::Bzip2; import Compress::Bzip2 2.00; 1; }) { + print STDERR "\n Checking IO::Compress::Bzip2 ... " if $VERBOSE > 2; + # Check if we have IO::Compress::Bzip2 + if (eval { require IO::Compress::Bzip2; require IO::Uncompress::Bunzip2; 1; }) { print STDERR "OK\nfound " if $VERBOSE > 2; - print STDERR "Compress::Bzip2\n" if $VERBOSE > 1; + print STDERR "IO::Compress::Bzip2\n" if $VERBOSE > 1; return ($BZIP2_IO = _private::IO::Bzip2::PM->new); } # Not found @@ -1325,7 +1324,7 @@ sub check_bzip2 : method { print STDERR "no\n" if $VERBOSE > 2; print STDERR "not found\n" if $VERBOSE > 1; - die "$THIS_FILE: Necessary Compress::Bzip2 or bzip2 not available.\n$SHORT_HELP\n"; + die "$THIS_FILE: Necessary IO::Compress::Bzip2 or bzip2 not available.\n$SHORT_HELP\n"; } # Check for compression method of xz @@ -1599,9 +1598,9 @@ sub open_read : method { print STDERR "done\n" if $VERBOSE > 2; } ($self->{"file"}, $self->{"FH"}) = ($file, $FH); - import Compress::Zlib qw(gzopen); - print STDERR " Attaching file with gzopen(..., \"rb\") ... " if $VERBOSE > 2; - $self->{"gz"} = gzopen($FH, "rb") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Uncompress::Gunzip ... " if $VERBOSE > 2; + $self->{"gz"} = IO::Uncompress::Gunzip->new($FH) + or die "$THIS_FILE: $file: $IO::Uncompress::Gunzip::GunzipError"; print STDERR "done\n" if $VERBOSE > 2; return; } @@ -1620,9 +1619,9 @@ sub open_write : method { print STDERR "done\n" if $VERBOSE > 2; } ($self->{"file"}, $self->{"FH"}) = ($file, $FH); - import Compress::Zlib qw(gzopen); - print STDERR " Attaching file with gzopen(..., \"wb9\") ... " if $VERBOSE > 2; - $self->{"gz"} = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Compress::Gzip ... " if $VERBOSE > 2; + $self->{"gz"} = IO::Compress::Gzip->new($FH) + or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; print STDERR "done\n" if $VERBOSE > 2; return; } @@ -1641,7 +1640,6 @@ sub open_append : method { print STDERR "done\n" if $VERBOSE > 2; } ($self->{"file"}, $self->{"FH"}) = ($file, $FH); - import Compress::Zlib qw(gzopen); # Save the original data if file has content so that file size is # greater than 0. STDOUT is always of size 0. @@ -1662,18 +1660,20 @@ sub open_append : method { print STDERR "done\n" if $VERBOSE > 2; # Decompress the buffer and save to our file - print STDERR " Attaching buffer with gzopen(..., \"rb\") ... " if $VERBOSE > 2; - $gzt = gzopen($FHT, "rb") or die "$THIS_FILE: tempfile: $!"; + print STDERR " Attaching buffer with IO::Uncompress::Gunzip ... " if $VERBOSE > 2; + $gzt = IO::Uncompress::Gunzip->new($FHT) + or die "$THIS_FILE: tempfile: $IO::Uncompress::Gunzip::GunzipError"; print STDERR "done\n" if $VERBOSE > 2; - print STDERR " Attaching file with gzopen(..., \"wb9\") ... " if $VERBOSE > 2; - $gz = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Compress::Gzip ... " if $VERBOSE > 2; + $gz = IO::Compress::Gzip->new($FH) + or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; print STDERR "done\n" if $VERBOSE > 2; print STDERR " Reading old records back from the buffer ... " if $VERBOSE > 2; $count = 0; - while (($n = $gzt->gzreadline($_)) != 0) { - die "$THIS_FILE: tempfile: " . $gz->gzerror if $n == -1; - ($gz->gzwrite($_) == $n) or die "$THIS_FILE: $file: " . $gz->gzerror; + while (defined($_ = $gzt->getline)) { + ($gz->write($_) == length $_) + or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; $count++; } close $FHT or die "$THIS_FILE: tempfile: $!"; @@ -1681,8 +1681,9 @@ sub open_append : method { # A whole new file } else { - print STDERR " Attaching file with gzopen(..., \"wb9\") ... " if $VERBOSE > 2; - $gz = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Compress::Gzip ... " if $VERBOSE > 2; + $gz = IO::Compress::Gzip->new($FH) + or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; print STDERR "done\n" if $VERBOSE > 2; } @@ -1692,13 +1693,7 @@ sub open_append : method { # Read a line from the I/O stream sub readline : method { - local ($_, %_); - my ($self, $file, $gz, $n); - $self = $_[0]; - ($file, $gz) = ($self->{"file"}, $self->{"gz"}); - (($n = $gz->gzreadline($_)) != -1) or die "$THIS_FILE: $file: " . $gz->gzerror; - return undef if $n == 0; - return $_; + return $_[0]->{"gz"}->getline(); } # Output data to the I/O stream @@ -1707,7 +1702,7 @@ sub write : method { my ($self, $file, $gz); ($self, $_) = @_; ($file, $gz) = ($self->{"file"}, $self->{"gz"}); - ($gz->gzwrite($_) == length $_) or die "$THIS_FILE: $file: " . $gz->gzerror; + ($gz->write($_) == length $_) or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; return; } @@ -1729,15 +1724,16 @@ sub close : method { # Create empty compressed content print STDERR " Applying empty compressed content ... " if $VERBOSE > 2; - $_ = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; - $_->gzclose and die "$THIS_FILE: $file: " . $_->gzerror; + $_ = IO::Compress::Gzip->new($FH, Append => 0) + or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; + $_->close or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; undef $_; undef $gz; print STDERR "done\n" if $VERBOSE > 2; } if (defined $gz) { - $gz->gzclose and die "$THIS_FILE: $file: " . $gz->gzerror; + $gz->close or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError"; } CORE::close $self->{"FH"} if $self->{"FH"}->opened; delete $self->{"gz"}; @@ -2059,9 +2055,9 @@ sub open_read : method { print STDERR "done\n" if $VERBOSE > 2; } ($self->{"file"}, $self->{"FH"}) = ($file, $FH); - import Compress::Bzip2 qw(bzopen); - print STDERR " Attaching file with bzopen(..., \"rb\") ... " if $VERBOSE > 2; - $self->{"bz"} = bzopen($FH, "rb") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Uncompress::Bunzip2 ... " if $VERBOSE > 2; + $self->{"bz"} = IO::Uncompress::Bunzip2->new($FH) + or die "$THIS_FILE: $file: $IO::Uncompress::Bunzip2::Bunzip2Error"; print STDERR "done\n" if $VERBOSE > 2; return; } @@ -2080,9 +2076,9 @@ sub open_write : method { print STDERR "done\n" if $VERBOSE > 2; } ($self->{"file"}, $self->{"FH"}) = ($file, $FH); - import Compress::Bzip2 qw(bzopen); - print STDERR " Attaching file with bzopen(..., \"wb9\") ... " if $VERBOSE > 2; - $self->{"bz"} = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Compress::Bzip2 ... " if $VERBOSE > 2; + $self->{"bz"} = IO::Compress::Bzip2->new($FH) + or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error"; print STDERR "done\n" if $VERBOSE > 2; return; } @@ -2101,7 +2097,6 @@ sub open_append : method { print STDERR "done\n" if $VERBOSE > 2; } ($self->{"file"}, $self->{"FH"}) = ($file, $FH); - import Compress::Bzip2 qw(bzopen); # Save the original data if file has content so that file size is # greater than 0. STDOUT is always of size 0. @@ -2122,19 +2117,20 @@ sub open_append : method { print STDERR "done\n" if $VERBOSE > 2; # Decompress the buffer and save to our file - print STDERR " Attaching buffer with bzopen(..., \"rb\") ... " if $VERBOSE > 2; - $bzt = bzopen($FHT, "rb") or die "$THIS_FILE: tempfile: $!"; + print STDERR " Attaching buffer with IO::Uncompress::Bunzip2 ... " if $VERBOSE > 2; + $bzt = IO::Uncompress::Bunzip2->new($FHT) + or die "$THIS_FILE: $file: $IO::Uncompress::Bunzip2::Bunzip2Error"; print STDERR "done\n" if $VERBOSE > 2; - print STDERR " Attaching file with bzopen(..., \"wb9\") ... " if $VERBOSE > 2; - $bz = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Compress::Bzip2 ... " if $VERBOSE > 2; + $bz = IO::Compress::Bzip2->new($FH) + or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error"; print STDERR "done\n" if $VERBOSE > 2; print STDERR " Reading old records back from the buffer ... " if $VERBOSE > 2; $count = 0; - while (($n = $bzt->bzreadline($_)) != 0) { - die "$THIS_FILE: tempfile: " . $bz->bzerror if $n == -1; - ($bz->bzwrite($_, length $_) == length $_) - or die "$THIS_FILE: $file: " . $bz->bzerror; + while (defined($_ = $bzt->getline)) { + ($bz->write($_) == length $_) + or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error"; $count++; } close $FHT or die "$THIS_FILE: tempfile: $!"; @@ -2142,8 +2138,9 @@ sub open_append : method { # A whole new file } else { - print STDERR " Attaching file with bzopen(..., \"wb9\") ... " if $VERBOSE > 2; - $bz = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; + print STDERR " Attaching file with IO::Compress::Bzip2 ... " if $VERBOSE > 2; + $bz = IO::Compress::Bzip2->new($FH) + or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error"; print STDERR "done\n" if $VERBOSE > 2; } @@ -2153,13 +2150,7 @@ sub open_append : method { # Read a line from the I/O stream sub readline : method { - local ($_, %_); - my ($self, $file, $bz, $n); - $self = $_[0]; - ($file, $bz) = ($self->{"file"}, $self->{"bz"}); - (($n = $bz->bzreadline($_)) != -1) or die "$THIS_FILE: $file: " . $bz->bzerror; - return undef if $n == 0; - return $_; + return $_[0]->{"bz"}->getline(); } # Output data to the I/O stream @@ -2168,8 +2159,7 @@ sub write : method { my ($self, $file, $bz); ($self, $_) = @_; ($file, $bz) = ($self->{"file"}, $self->{"bz"}); - ($bz->bzwrite($_, length $_) == length $_) - or die "$THIS_FILE: $file: " . $bz->bzerror; + ($bz->write($_) == length $_) or die "$THIS_FILE: $file: $IO::Compress::Xz::XzError"; return; } @@ -2191,15 +2181,16 @@ sub close : method { # Create empty compressed content print STDERR " Applying empty compressed content ... " if $VERBOSE > 2; - $_ = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; - $_->bzclose and die "$THIS_FILE: $file: " . $_->bzerror; + $_ = IO::Compress::Bzip2->new($FH) + or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error"; + $_->close or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error"; undef $_; undef $bz; print STDERR "done\n" if $VERBOSE > 2; } if (defined $bz) { - $bz->bzclose and die "$THIS_FILE: $file: " . $bz->bzerror; + $bz->close or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error"; } CORE::close $self->{"FH"} if $self->{"FH"}->opened; delete $self->{"bz"}; @@ -3201,20 +3192,22 @@ them.) The following compression methods are supported: =item g, gzip Compress with L. This is the default. F -can use L to compress instead of -calling L. This can be safer and faster for not -calling foreign binaries. if L -is not installed, it tries L instead. If -L is not available, either, it fails. +can use L to compress +instead of calling L. This can be safer and faster +for not calling foreign binaries. if +L is not installed, it +tries L instead. If L is not +available, either, it fails. =item b, bzip2 Compress with L. F can use -L to compress instead of -calling L. This can be safer and faster for not -calling foreign binaries. If L -is not installed, it will try to use L instead. If -L is not available, either, it fails. +L to compress +instead of calling L. This can be safer and faster +for not calling foreign binaries. If +L is not installed, it +will try to use L instead. If L +is not available, either, it fails. =item x, xz @@ -3377,11 +3370,12 @@ messages. =head1 SEE ALSO -L, L, L, -L, L, -L, -L, +L, L, +L, +L, L, +L, +L, L, L, -L +L, L =cut diff --git a/t/_helper.pm b/t/_helper.pm index de9fd36..3abd91c 100644 --- a/t/_helper.pm +++ b/t/_helper.pm @@ -227,22 +227,20 @@ sub read_file($) { # a gzip compressed file if ($file =~ /\.gz$/) { - # Compress::Zlib - if (eval { require Compress::Zlib; - Compress::Zlib->import(qw(gzopen)); - 1; }) { - use Compress::Zlib qw(gzopen); + # IO::Uncompress::Gunzip + if (eval { require IO::Uncompress::Gunzip; 1; }) { my ($FH, $gz); $content = ""; open $FH, $file or die this_file . ": $file: $!"; - $gz = gzopen($FH, "rb") or die this_file . ": $file: $!"; + $gz = IO::Uncompress::Gunzip->new($FH) + or die this_file . ": $file: $IO::Uncompress::Gunzip::GunzipError"; while (1) { - ($gz->gzread($_, 10240) != -1) - or die this_file . ": $file: " . $gz->gzerror; + ($gz->read($_, 10240) != -1) + or die this_file . ": $file: $IO::Uncompress::Gunzip::GunzipError"; $content .= $_; last if length $_ < 10240; } - $gz->gzclose and die this_file . ": $file: " . $gz->gzerror; + $gz->close or die this_file . ": $file: $IO::Uncompress::Gunzip::GunzipError"; return $content; # gzip executable @@ -258,22 +256,20 @@ sub read_file($) { # a bzip compressed file } elsif ($file =~ /\.bz2$/) { - # Compress::Bzip2 - if (eval { require Compress::Bzip2; - Compress::Bzip2->import(2.00); - Compress::Bzip2->import(qw(bzopen)); - 1; }) { + # IO::Uncompress::Bunzip2 + if (eval { require IO::Uncompress::Bunzip2; 1; }) { my ($FH, $bz); $content = ""; open $FH, $file or die this_file . ": $file: $!"; - $bz = bzopen($FH, "rb") or die this_file . ": $file: $!"; + $bz = IO::Uncompress::Bunzip2->new($FH) + or die this_file . ": $file: $IO::Uncompress::Bunzip2::Bunzip2Error"; while (1) { - ($bz->bzread($_, 10240) != -1) - or die this_file . ": $file: " . $bz->bzerror; + ($bz->read($_, 10240) != -1) + or die this_file . ": $file: $IO::Uncompress::Bunzip2::Bunzip2Error"; $content .= $_; last if length $_ < 10240; } - $bz->bzclose and die this_file . ": $file: " . $bz->bzerror; + $bz->close or die this_file . ": $file: $IO::Uncompress::Bunzip2::Bunzip2Error"; return $content; # bzip2 executable @@ -353,16 +349,15 @@ sub write_file($$) { # a gzip compressed file if ($file =~ /\.gz$/) { - # Compress::Zlib - if (eval { require Compress::Zlib; - Compress::Zlib->import(qw(gzopen)); - 1; }) { + # IO::Compress::Gzip + if (eval { require IO::Compress::Gzip; 1; }) { my ($FH, $gz); open $FH, ">$file" or die this_file . ": $file: $!"; - $gz = gzopen($FH, "wb9") or die this_file . ": $file: $!"; - ($gz->gzwrite($content) == length $content) - or die this_file . ": $file: " . $gz->gzerror; - $gz->gzclose and die this_file . ": $file: " . $gz->gzerror; + $gz = IO::Compress::Gzip->new($FH) + or die this_file . ": $file: $IO::Compress::Gzip::GzipError"; + ($gz->write($content, length $content) == length $content) + or die this_file . ": $file: $IO::Compress::Gzip::GzipError"; + $gz->close or die this_file . ": $file: $IO::Compress::Gzip::GzipError"; return; # gzip executable @@ -378,17 +373,15 @@ sub write_file($$) { # a bzip compressed file } elsif ($file =~ /\.bz2$/) { - # Compress::Bzip2 - if (eval { require Compress::Bzip2; - Compress::Bzip2->import(2.00); - Compress::Bzip2->import(qw(bzopen)); - 1; }) { + # IO::Compress::Bzip2 + if (eval { require IO::Compress::Bzip2; 1; }) { my ($FH, $bz); open $FH, ">$file" or die this_file . ": $file: $!"; - $bz = bzopen($FH, "wb9") or die this_file . ": $file: $!"; - ($bz->bzwrite($content, length $content) == length $content) - or die this_file . ": $file: " . $bz->bzerror; - $bz->bzclose and die this_file . ": $file: " . $bz->bzerror; + $bz = IO::Compress::Bzip2->new($FH) + or die this_file . ": $file: $IO::Compress::Bzip2::Bzip2Error"; + ($bz->write($content, length $content) == length $content) + or die this_file . ": $file: $IO::Compress::Bzip2::Bzip2Error"; + $bz->close or die this_file . ": $file: $IO::Compress::Bzip2::Bzip2Error"; return; # bzip2 executable @@ -601,18 +594,18 @@ sub has_no_file() { # If we have gzip support somewhere sub has_no_gzip() { - $HAS_NO_GZIP = eval { require Compress::Zlib; 1; } + $HAS_NO_GZIP = eval { require IO::Compress::Gzip; require IO::Uncompress::Gunzip; 1; } || defined where_is "gzip"? - 0: "Compress::Zlib or gzip executable not available" + 0: "IO::Compress::Gzip or gzip executable not available" if !defined $HAS_NO_GZIP; return $HAS_NO_GZIP; } # If we have bzip2 support somewhere sub has_no_bzip2() { - $HAS_NO_BZIP2 = eval { require Compress::Bzip2; Compress::Bzip2->import(2.00); 1; } + $HAS_NO_BZIP2 = eval { require IO::Compress::Bzip2; require IO::Uncompress::Bunzip2; 1; } || defined where_is "bzip2"? - 0: "Compress::Bzip2 v2 or bzip2 executable not available" + 0: "IO::Compress::Bzip2 v2 or bzip2 executable not available" if !defined $HAS_NO_BZIP2; return $HAS_NO_BZIP2; }