$value = Z_STREAM_END() if $gz->eof() && $value == 0 ;
}
_set_gzerr($value) ;
}
sub gzopen($$)
{
my ($file, $mode) = @_ ;
my $gz ;
my %defOpts = (Level => Z_DEFAULT_COMPRESSION(),
Strategy => Z_DEFAULT_STRATEGY(),
);
my $writing ;
$writing = ! ($mode =~ /r/i) ;
$writing = ($mode =~ /[wa]/i) ;
$defOpts{Level} = $1 if $mode =~ /(\d)/;
$defOpts{Strategy} = Z_FILTERED() if $mode =~ /f/i;
$defOpts{Strategy} = Z_HUFFMAN_ONLY() if $mode =~ /h/i;
$defOpts{Append} = 1 if $mode =~ /a/i;
my $infDef = $writing ? 'deflate' : 'inflate';
my @params = () ;
croak "gzopen: file parameter is not a filehandle or filename"
unless isaFilehandle $file || isaFilename $file ||
(ref $file && ref $file eq 'SCALAR');
return undef unless $mode =~ /[rwa]/i ;
_set_gzerr(0) ;
if ($writing) {
$gz = new IO::Compress::Gzip($file, Minimal => 1, AutoClose => 1,
%defOpts)
or $Compress::Zlib::gzerrno = $IO::Compress::Gzip::GzipError;
}
else {
$gz = new IO::Uncompress::Gunzip($file,
Transparent => 1,
Append => 0,
AutoClose => 1,
MultiStream => 1,
Strict => 0)
or $Compress::Zlib::gzerrno = $IO::Uncompress::Gunzip::GunzipError;
}
return undef
if ! defined $gz ;
bless [$gz, $infDef], 'Compress::Zlib::gzFile';
}
sub Compress::Zlib::gzFile::gzread
{
my $self = shift ;
return _set_gzerr(Z_STREAM_ERROR())
if $self->[1] ne 'inflate';
my $len = defined $_[1] ? $_[1] : 4096 ;
if ($self->gzeof() || $len == 0) {
# Zap the output buffer to match ver 1 behaviour.
$_[0] = "" ;
return 0 ;
}
my $gz = $self->[0] ;
my $status = $gz->read($_[0], $len) ;
_save_gzerr($gz, 1);
return $status ;
}
sub Compress::Zlib::gzFile::gzreadline
{
my $self = shift ;
my $gz = $self->[0] ;
{
# Maintain backward compatibility with 1.x behaviour
# It didn't support $/, so this can't either.
local $/ = "\n" ;
$_[0] = $gz->getline() ;
}
_save_gzerr($gz, 1);
return defined $_[0] ? length $_[0] : 0 ;
}
sub Compress::Zlib::gzFile::gzwrite
{
my $self = shift ;
my $gz = $self->[0] ;
return _set_gzerr(Z_STREAM_ERROR())
if $self->[1] ne 'deflate';
=2= |