Compress-Raw-Lzma-2.101/0000755000175000017500000000000014014211600013411 5ustar paulpaulCompress-Raw-Lzma-2.101/lib/0000755000175000017500000000000014014211600014157 5ustar paulpaulCompress-Raw-Lzma-2.101/lib/Compress/0000755000175000017500000000000014014211600015752 5ustar paulpaulCompress-Raw-Lzma-2.101/lib/Compress/Raw/0000755000175000017500000000000014014211600016503 5ustar paulpaulCompress-Raw-Lzma-2.101/lib/Compress/Raw/Lzma.pm0000644000175000017500000013404114014176241017762 0ustar paulpaulpackage Compress::Raw::Lzma; use strict ; use warnings ; require 5.006 ; require Exporter; use AutoLoader; use Carp ; use bytes ; our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD); $VERSION = '2.101'; $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @ISA = qw(Exporter); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. @EXPORT = qw( LZMA_OK LZMA_STREAM_END LZMA_NO_CHECK LZMA_UNSUPPORTED_CHECK LZMA_GET_CHECK LZMA_MEM_ERROR LZMA_MEMLIMIT_ERROR LZMA_FORMAT_ERROR LZMA_OPTIONS_ERROR LZMA_DATA_ERROR LZMA_BUF_ERROR LZMA_PROG_ERROR LZMA_RUN LZMA_SYNC_FLUSH LZMA_FULL_FLUSH LZMA_FINISH LZMA_FILTER_X86 LZMA_FILTER_POWERPC LZMA_FILTER_IA64 LZMA_FILTER_ARM LZMA_FILTER_ARMTHUMB LZMA_FILTER_SPARC LZMA_BLOCK_HEADER_SIZE_MIN LZMA_BLOCK_HEADER_SIZE_MAX LZMA_CHECK_NONE LZMA_CHECK_CRC32 LZMA_CHECK_CRC64 LZMA_CHECK_SHA256 LZMA_CHECK_ID_MAX LZMA_CHECK_SIZE_MAX LZMA_PRESET_DEFAULT LZMA_PRESET_LEVEL_MASK LZMA_PRESET_EXTREME LZMA_TELL_NO_CHECK LZMA_TELL_UNSUPPORTED_CHECK LZMA_TELL_ANY_CHECK LZMA_CONCATENATED LZMA_FILTER_DELTA LZMA_DELTA_DIST_MIN LZMA_DELTA_DIST_MAX LZMA_DELTA_TYPE_BYTE LZMA_FILTERS_MAX LZMA_FILTER_LZMA2 LZMA_MF_HC3 LZMA_MF_HC4 LZMA_MF_BT2 LZMA_MF_BT3 LZMA_MF_BT4 LZMA_MODE_FAST LZMA_MODE_NORMAL LZMA_DICT_SIZE_MIN LZMA_DICT_SIZE_DEFAULT LZMA_LCLP_MIN LZMA_LCLP_MAX LZMA_LC_DEFAULT LZMA_LP_DEFAULT LZMA_PB_MIN LZMA_PB_MAX LZMA_PB_DEFAULT LZMA_STREAM_HEADER_SIZE LZMA_BACKWARD_SIZE_MIN LZMA_FILTER_SUBBLOCK LZMA_SUBFILTER_NONE LZMA_SUBFILTER_SET LZMA_SUBFILTER_RUN LZMA_SUBFILTER_FINISH LZMA_SUBBLOCK_ALIGNMENT_MIN LZMA_SUBBLOCK_ALIGNMENT_MAX LZMA_SUBBLOCK_ALIGNMENT_DEFAULT LZMA_SUBBLOCK_DATA_SIZE_MIN LZMA_SUBBLOCK_DATA_SIZE_MAX LZMA_SUBBLOCK_DATA_SIZE_DEFAULT LZMA_SUBBLOCK_RLE_OFF LZMA_SUBBLOCK_RLE_MIN LZMA_SUBBLOCK_RLE_MAX LZMA_VERSION LZMA_VERSION_MAJOR LZMA_VERSION_MINOR LZMA_VERSION_PATCH LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STRING LZMA_VERSION_STRING ); #LZMA_VLI_MAX #LZMA_VLI_UNKNOWN #LZMA_VLI_BYTES_MAX sub AUTOLOAD { my($constname); ($constname = $AUTOLOAD) =~ s/.*:://; my ($error, $val) = constant($constname); Carp::croak $error if $error; no strict 'refs'; *{$AUTOLOAD} = sub { $val }; goto &{$AUTOLOAD}; } use constant FLAG_APPEND => 1 ; use constant FLAG_CRC => 2 ; use constant FLAG_ADLER => 4 ; use constant FLAG_CONSUME_INPUT => 8 ; use constant FLAG_LIMIT_OUTPUT => 16 ; eval { require XSLoader; XSLoader::load('Compress::Raw::Lzma', $XS_VERSION); 1; } or do { require DynaLoader; local @ISA = qw(DynaLoader); bootstrap Compress::Raw::Lzma $XS_VERSION ; }; use constant Parse_any => 0x01; use constant Parse_unsigned => 0x02; use constant Parse_signed => 0x04; use constant Parse_boolean => 0x08; use constant Parse_string => 0x10; use constant Parse_custom => 0x12; use constant Parse_store_ref => 0x100 ; use constant OFF_PARSED => 0 ; use constant OFF_TYPE => 1 ; use constant OFF_DEFAULT => 2 ; use constant OFF_FIXED => 3 ; use constant OFF_FIRST_ONLY => 4 ; use constant OFF_STICKY => 5 ; sub ParseParameters { my $level = shift || 0 ; my $sub = (caller($level + 1))[3] ; #local $Carp::CarpLevel = 1 ; my $p = new Compress::Raw::Lzma::Parameters() ; $p->parse(@_) or croak "$sub: $p->{Error}" ; return $p; } sub Compress::Raw::Lzma::Parameters::new { my $class = shift ; my $obj = { Error => '', Got => {}, } ; #return bless $obj, ref($class) || $class || __PACKAGE__ ; return bless $obj, 'Compress::Raw::Lzma::Parameters' ; } sub Compress::Raw::Lzma::Parameters::setError { my $self = shift ; my $error = shift ; my $retval = @_ ? shift : undef ; $self->{Error} = $error ; return $retval; } #sub getError #{ # my $self = shift ; # return $self->{Error} ; #} sub Compress::Raw::Lzma::Parameters::parse { my $self = shift ; my $default = shift ; my $got = $self->{Got} ; my $firstTime = keys %{ $got } == 0 ; my (@Bad) ; my @entered = () ; # Allow the options to be passed as a hash reference or # as the complete hash. if (@_ == 0) { @entered = () ; } elsif (@_ == 1) { my $href = $_[0] ; return $self->setError("Expected even number of parameters, got 1") if ! defined $href or ! ref $href or ref $href ne "HASH" ; foreach my $key (keys %$href) { push @entered, $key ; push @entered, \$href->{$key} ; } } else { my $count = @_; return $self->setError("Expected even number of parameters, got $count") if $count % 2 != 0 ; for my $i (0.. $count / 2 - 1) { push @entered, $_[2* $i] ; push @entered, \$_[2* $i+1] ; } } while (my ($key, $v) = each %$default) { croak "need 4 params [@$v]" if @$v != 4 ; my ($first_only, $sticky, $type, $value) = @$v ; my $x ; $self->_checkType($key, \$value, $type, 0, \$x) or return undef ; $key = lc $key; if ($firstTime || ! $sticky) { $got->{$key} = [0, $type, $value, $x, $first_only, $sticky] ; } $got->{$key}[OFF_PARSED] = 0 ; } for my $i (0.. @entered / 2 - 1) { my $key = $entered[2* $i] ; my $value = $entered[2* $i+1] ; #print "Key [$key] Value [$value]" ; #print defined $$value ? "[$$value]\n" : "[undef]\n"; $key =~ s/^-// ; my $canonkey = lc $key; if ($got->{$canonkey} && ($firstTime || ! $got->{$canonkey}[OFF_FIRST_ONLY] )) { my $type = $got->{$canonkey}[OFF_TYPE] ; my $s ; $self->_checkType($key, $value, $type, 1, \$s) or return undef ; #$value = $$value unless $type & Parse_store_ref ; $value = $$value ; $got->{$canonkey} = [1, $type, $value, $s] ; } else { push (@Bad, $key) } } if (@Bad) { my ($bad) = join(", ", @Bad) ; return $self->setError("unknown key value(s) @Bad") ; } return 1; } sub Compress::Raw::Lzma::Parameters::_checkType { my $self = shift ; my $key = shift ; my $value = shift ; my $type = shift ; my $validate = shift ; my $output = shift; #local $Carp::CarpLevel = $level ; #print "PARSE $type $key $value $validate $sub\n" ; if ( $type & Parse_store_ref) { #$value = $$value # if ref ${ $value } ; $$output = $value ; return 1; } $value = $$value ; if ($type & Parse_any) { $$output = $value ; return 1; } elsif ($type & Parse_unsigned) { return $self->setError("Parameter '$key' must be an unsigned int, got 'undef'") if $validate && ! defined $value ; return $self->setError("Parameter '$key' must be an unsigned int, got '$value'") if $validate && $value !~ /^\d+$/; $$output = defined $value ? $value : 0 ; return 1; } elsif ($type & Parse_signed) { return $self->setError("Parameter '$key' must be a signed int, got 'undef'") if $validate && ! defined $value ; return $self->setError("Parameter '$key' must be a signed int, got '$value'") if $validate && $value !~ /^-?\d+$/; $$output = defined $value ? $value : 0 ; return 1 ; } elsif ($type & Parse_boolean) { return $self->setError("Parameter '$key' must be an int, got '$value'") if $validate && defined $value && $value !~ /^\d*$/; $$output = defined $value ? $value != 0 : 0 ; return 1; } elsif ($type & Parse_string) { $$output = defined $value ? $value : "" ; return 1; } $$output = $value ; return 1; } sub Compress::Raw::Lzma::Parameters::parsed { my $self = shift ; my $name = shift ; return $self->{Got}{lc $name}[OFF_PARSED] ; } sub Compress::Raw::Lzma::Parameters::value { my $self = shift ; my $name = shift ; if (@_) { $self->{Got}{lc $name}[OFF_PARSED] = 1; $self->{Got}{lc $name}[OFF_DEFAULT] = $_[0] ; $self->{Got}{lc $name}[OFF_FIXED] = $_[0] ; } return $self->{Got}{lc $name}[OFF_FIXED] ; } sub Compress::Raw::Lzma::Encoder::STORABLE_freeze { my $type = ref shift; croak "Cannot freeze $type object\n"; } sub Compress::Raw::Lzma::Encoder::STORABLE_thaw { my $type = ref shift; croak "Cannot thaw $type object\n"; } @Compress::Raw::Lzma::EasyEncoder::ISA = qw(Compress::Raw::Lzma::Encoder); sub Compress::Raw::Lzma::EasyEncoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'AppendOutput' => [1, 1, Parse_boolean, 0], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'Preset' => [1, 1, Parse_unsigned, LZMA_PRESET_DEFAULT()], 'Extreme' => [1, 1, Parse_boolean, 0], 'Check' => [1, 1, Parse_unsigned, LZMA_CHECK_CRC32()], }, @_) ; # croak "Compress::Raw::Lzma::EasyEncoder::new: Bufsize must be >= 1, you specified " . # $got->value('Bufsize') # unless $got->value('Bufsize') >= 1; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; my $preset = $got->value('Preset'); if ($got->value('Extreme')) { $preset |= LZMA_PRESET_EXTREME(); } lzma_easy_encoder($pkg, $flags, $got->value('Bufsize'), $preset, $got->value('Check')) ; } @Compress::Raw::Lzma::AloneEncoder::ISA = qw(Compress::Raw::Lzma::Encoder); sub Compress::Raw::Lzma::AloneEncoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'AppendOutput' => [1, 1, Parse_boolean, 0], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'Filter' => [1, 1, Parse_any, [] ], }, @_) ; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; my $filters = Lzma::Filters::validateFilters(1, 0, $got->value('Filter')) ; # TODO - check max of 1 filter & it is a reference to Lzma::Filter::Lzma1 lzma_alone_encoder($pkg, $flags, $got->value('Bufsize'), $filters); } @Compress::Raw::Lzma::StreamEncoder::ISA = qw(Compress::Raw::Lzma::Encoder); sub Compress::Raw::Lzma::StreamEncoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'AppendOutput' => [1, 1, Parse_boolean, 0], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'Filter' => [1, 1, Parse_any, [] ], 'Check' => [1, 1, Parse_unsigned, LZMA_CHECK_CRC32()], }, @_) ; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; my $filters = Lzma::Filters::validateFilters(1, 1, $got->value('Filter')) ; lzma_stream_encoder($pkg, $flags, $got->value('Bufsize'), $filters, $got->value('Check')); } @Compress::Raw::Lzma::RawEncoder::ISA = qw(Compress::Raw::Lzma::Encoder); sub Compress::Raw::Lzma::RawEncoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'ForZip' => [1, 1, Parse_boolean, 0], 'AppendOutput' => [1, 1, Parse_boolean, 0], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'Filter' => [1, 1, Parse_any, [] ], }, @_) ; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; my $forZip = $got->value('ForZip'); my $filters = Lzma::Filters::validateFilters(1, ! $forZip, $got->value('Filter')) ; lzma_raw_encoder($pkg, $flags, $got->value('Bufsize'), $filters, $forZip); } @Compress::Raw::Lzma::AutoDecoder::ISA = qw(Compress::Raw::Lzma::Decoder); sub Compress::Raw::Lzma::AutoDecoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'AppendOutput' => [1, 1, Parse_boolean, 0], 'LimitOutput' => [1, 1, Parse_boolean, 0], 'ConsumeInput' => [1, 1, Parse_boolean, 1], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'MemLimit' => [1, 1, Parse_unsigned, 128 *1024 *1024], }, @_) ; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; $flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ; $flags |= FLAG_LIMIT_OUTPUT if $got->value('LimitOutput') ; lzma_auto_decoder($pkg, $flags, $got->value('MemLimit')); } @Compress::Raw::Lzma::AloneDecoder::ISA = qw(Compress::Raw::Lzma::Decoder); sub Compress::Raw::Lzma::AloneDecoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'AppendOutput' => [1, 1, Parse_boolean, 0], 'LimitOutput' => [1, 1, Parse_boolean, 0], 'ConsumeInput' => [1, 1, Parse_boolean, 1], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'MemLimit' => [1, 1, Parse_unsigned, 128 *1024 *1024], }, @_) ; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; $flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ; $flags |= FLAG_LIMIT_OUTPUT if $got->value('LimitOutput') ; lzma_alone_decoder($pkg, $flags, $got->value('Bufsize'), $got->value('MemLimit')); } @Compress::Raw::Lzma::StreamDecoder::ISA = qw(Compress::Raw::Lzma::Decoder); sub Compress::Raw::Lzma::StreamDecoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'AppendOutput' => [1, 1, Parse_boolean, 0], 'LimitOutput' => [1, 1, Parse_boolean, 0], 'ConsumeInput' => [1, 1, Parse_boolean, 1], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'MemLimit' => [1, 1, Parse_unsigned, 128 *1024 *1024], 'Flags' => [1, 1, Parse_unsigned, 0], }, @_) ; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; $flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ; $flags |= FLAG_LIMIT_OUTPUT if $got->value('LimitOutput') ; lzma_stream_decoder($pkg, $flags, $got->value('Bufsize'), $got->value('MemLimit'), $got->value('Flags')); } @Compress::Raw::Lzma::RawDecoder::ISA = qw(Compress::Raw::Lzma::Decoder); sub Compress::Raw::Lzma::RawDecoder::new { my $pkg = shift ; my ($got) = ParseParameters(0, { 'AppendOutput' => [1, 1, Parse_boolean, 0], 'LimitOutput' => [1, 1, Parse_boolean, 0], 'ConsumeInput' => [1, 1, Parse_boolean, 1], 'Bufsize' => [1, 1, Parse_unsigned, 16 * 1024], 'Filter' => [1, 1, Parse_any, [] ], 'Properties' => [1, 1, Parse_any, undef], }, @_) ; my $flags = 0 ; $flags |= FLAG_APPEND if $got->value('AppendOutput') ; $flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ; $flags |= FLAG_LIMIT_OUTPUT if $got->value('LimitOutput') ; my $filters = Lzma::Filters::validateFilters(0, ! defined $got->value('Properties'), $got->value('Filter')) ; lzma_raw_decoder($pkg, $flags, $got->value('Bufsize'), $filters, $got->value('Properties')); } # LZMA1/2 # Preset # Dict # Lc # Lp # Pb # Mode LZMA_MODE_FAST, LZMA_MODE_NORMAL # Nice # Mf LZMA_MF_HC3 LZMA_MF_HC4 LZMA_MF_BT2 LZMA_MF_BT3 LZMA_MF_BT4 # Depth # BCJ # LZMA_FILTER_X86 # LZMA_FILTER_POWERPC # LZMA_FILTER_IA64 # LZMA_FILTER_ARM # LZMA_FILTER_ARMTHUMB # LZMA_FILTER_SPARC # # BCJ => LZMA_FILTER_X86 -- this assumes offset is 0 # BCJ => [LZMA_FILTER_X86, offset] # Delta # Dist 1 - 256, 1 # Subblock # Size # RLE # Align # Preset (0-9) LZMA_PRESET_EXTREME LZMA_PRESET_DEFAULT -- call lzma_lzma_preset # Memory # Check => LZMA_CHECK_NONE, LZMA_CHECK_CRC32, LZMA_CHECK_CRC64, LZMA_CHECK_SHA256 # my $bool = lzma_check_is_supported(LZMA_CHECK_CRC32); # my $int = lzma_check_size(LZMA_CHECK_CRC32); # my $int = $lzma->lzma_get_check(); #sub Compress::Raw::Lzma::new #{ # my $class = shift ; # my ($ptr, $status) = _new(@_); # return wantarray ? (undef, $status) : undef # unless $ptr ; # my $obj = bless [$ptr], $class ; # return wantarray ? ($obj, $status) : $obj; #} # #package Compress::Raw::UnLzma ; # #sub Compress::Raw::UnLzma::new #{ # my $class = shift ; # my ($ptr, $status) = _new(@_); # return wantarray ? (undef, $status) : undef # unless $ptr ; # my $obj = bless [$ptr], $class ; # return wantarray ? ($obj, $status) : $obj; #} sub Lzma::Filters::validateFilters { use UNIVERSAL ; use Scalar::Util qw(blessed ); my $encoding = shift; # not decoding my $lzma2 = shift; # my $objType = $lzma2 ? "Lzma::Filter::Lzma2" # : "Lzma::Filter::Lzma" ; my $objType = "Lzma::Filter::Lzma" ; # if only one, convert into an array reference if (blessed $_[0] ) { die "filter object $_[0] is not an $objType object" unless UNIVERSAL::isa($_[0], $objType); #$_[0] = [ $_[0] ] ; return [ $_[0] ] ; } if (ref $_[0] ne 'ARRAY') { die "$_[0] not Lzma::Filter object or ARRAY ref" } my $filters = $_[0] ; my $count = @$filters; # check number of filters die sprintf "Too many filters ($count), max is %d", LZMA_FILTERS_MAX() if $count > LZMA_FILTERS_MAX(); # TODO - add more tests here # Check that all filters inherit from Lzma::Filter # check that filters are supported # check memory requirements # need exactly one lzma1/2 filter # lzma1/2 is the last thing in the list for (my $i = 0; $i < @$filters ; ++$i) { my $filt = $filters->[$i]; die "filter is not an Lzma::Filter object" unless UNIVERSAL::isa($filt, 'Lzma::Filter'); die "Lzma filter must be last" if UNIVERSAL::isa($filt, 'Lzma::Filter::Lzma') && $i < $count -1 ; #die "xxx" unless lzma_filter_encoder_is_supported($filt->id()); } if (@$filters == 0) { push @$filters, $lzma2 ? Lzma::Filter::Lzma2() : Lzma::Filter::Lzma1(); } return $filters; } #package Lzma::Filter; #package Lzma::Filter::Lzma; #our ($VERSION, @ISA, @EXPORT, $AUTOLOAD); @Lzma::Filter::Lzma::ISA = qw(Lzma::Filter); sub Lzma::Filter::Lzma::mk { my $type = shift; my $got = Compress::Raw::Lzma::ParseParameters(0, { 'DictSize' => [1, 1, Parse_unsigned(), LZMA_DICT_SIZE_DEFAULT()], 'PresetDict' => [1, 1, Parse_string(), undef], 'Lc' => [1, 1, Parse_unsigned(), LZMA_LC_DEFAULT()], 'Lp' => [1, 1, Parse_unsigned(), LZMA_LP_DEFAULT()], 'Pb' => [1, 1, Parse_unsigned(), LZMA_PB_DEFAULT()], 'Mode' => [1, 1, Parse_unsigned(), LZMA_MODE_NORMAL()], 'Nice' => [1, 1, Parse_unsigned(), 64], 'Mf' => [1, 1, Parse_unsigned(), LZMA_MF_BT4()], 'Depth' => [1, 1, Parse_unsigned(), 0], }, @_) ; my $pkg = (caller(1))[3] ; my $DictSize = $got->value('DictSize'); die "Dictsize $DictSize not in range 4KiB - 1536Mib" if $DictSize < 1024 * 4 || $DictSize > 1024 * 1024 * 1536 ; my $Lc = $got->value('Lc'); die "Lc $Lc not in range 0-4" if $Lc < 0 || $Lc > 4; my $Lp = $got->value('Lp'); die "Lp $Lp not in range 0-4" if $Lp < 0 || $Lp > 4; die "Lc + Lp must be <= 4" if $Lc + $Lp > 4; my $Pb = $got->value('Pb'); die "Pb $Pb not in range 0-4" if $Pb < 0 || $Pb > 4; my $Mode = $got->value('Mode'); die "Mode $Mode not LZMA_MODE_FAST or LZMA_MODE_NORMAL" if $Mode != LZMA_MODE_FAST() && $Mode != LZMA_MODE_NORMAL(); my $Mf = $got->value('Mf'); die "Mf $Mf not valid" if ! grep { $Mf == $_ } ( LZMA_MF_HC3(), LZMA_MF_HC4(), LZMA_MF_BT2(), LZMA_MF_BT3(), LZMA_MF_BT4()); my $Nice = $got->value('Nice'); die "Nice $Nice not in range 2-273" if $Nice < 2 || $Nice > 273; my $obj = Lzma::Filter::Lzma::_mk($type, $DictSize, $Lc, $Lp, $Pb, $Mode, $Nice, $Mf, $got->value('Depth'), $got->value('PresetDict'), ); bless $obj, $pkg if defined $obj; $obj; } sub Lzma::Filter::Lzma::mkPreset { my $type = shift; my $preset = shift; my $pkg = (caller(1))[3] ; my $obj = Lzma::Filter::Lzma::_mkPreset($type, $preset); bless $obj, $pkg if defined $obj; $obj; } @Lzma::Filter::Lzma1::ISA = qw(Lzma::Filter::Lzma); sub Lzma::Filter::Lzma1 { Lzma::Filter::Lzma::mk(0, @_); } @Lzma::Filter::Lzma1::Preset::ISA = qw(Lzma::Filter::Lzma); sub Lzma::Filter::Lzma1::Preset { Lzma::Filter::Lzma::mkPreset(0, @_); } @Lzma::Filter::Lzma2::ISA = qw(Lzma::Filter::Lzma); sub Lzma::Filter::Lzma2 { Lzma::Filter::Lzma::mk(1, @_); } @Lzma::Filter::Lzma2::Preset::ISA = qw(Lzma::Filter::Lzma); sub Lzma::Filter::Lzma2::Preset { Lzma::Filter::Lzma::mkPreset(1, @_); } @Lzma::Filter::BCJ::ISA = qw(Lzma::Filter); sub Lzma::Filter::BCJ::mk { my $type = shift; my $got = Compress::Raw::Lzma::ParseParameters(0, { 'Offset' => [1, 1, Parse_unsigned(), 0], }, @_) ; my $pkg = (caller(1))[3] ; my $obj = Lzma::Filter::BCJ::_mk($type, $got->value('Offset')) ; bless $obj, $pkg if defined $obj; $obj; } @Lzma::Filter::X86::ISA = qw(Lzma::Filter::BCJ); sub Lzma::Filter::X86 { Lzma::Filter::BCJ::mk(LZMA_FILTER_X86(), @_); } @Lzma::Filter::PowerPC::ISA = qw(Lzma::Filter::BCJ); sub Lzma::Filter::PowerPC { Lzma::Filter::BCJ::mk(LZMA_FILTER_POWERPC(), @_); } @Lzma::Filter::IA64::ISA = qw(Lzma::Filter::BCJ); sub Lzma::Filter::IA64 { Lzma::Filter::BCJ::mk(LZMA_FILTER_IA64(), @_); } @Lzma::Filter::ARM::ISA = qw(Lzma::Filter::BCJ); sub Lzma::Filter::ARM { Lzma::Filter::BCJ::mk(LZMA_FILTER_ARM(), @_); } @Lzma::Filter::ARMThumb::ISA = qw(Lzma::Filter::BCJ); sub Lzma::Filter::ARMThumb { Lzma::Filter::BCJ::mk(LZMA_FILTER_ARMTHUMB(), @_); } @Lzma::Filter::Sparc::ISA = qw(Lzma::Filter::BCJ); sub Lzma::Filter::Sparc { Lzma::Filter::BCJ::mk(LZMA_FILTER_SPARC(), @_); } @Lzma::Filter::Delta::ISA = qw(Lzma::Filter); sub Lzma::Filter::Delta { #my $pkg = shift ; my ($got) = Compress::Raw::Lzma::ParseParameters(0, { 'Type' => [1, 1, Parse_unsigned, LZMA_DELTA_TYPE_BYTE()], 'Distance' => [1, 1, Parse_unsigned, LZMA_DELTA_DIST_MIN()], }, @_) ; Lzma::Filter::Delta::_mk($got->value('Type'), $got->value('Distance')) ; } #package Lzma::Filter::SubBlock; package Compress::Raw::Lzma; 1; __END__ =head1 NAME Compress::Raw::Lzma - Low-Level Interface to lzma compression library =head1 SYNOPSIS use Compress::Raw::Lzma ; # Encoders my ($lz, $status) = new Compress::Raw::Lzma::EasyEncoder [OPTS] or die "Cannot create lzma object: $status\n"; my ($lz, $status) = new Compress::Raw::Lzma::AloneEncoder [OPTS] or die "Cannot create lzma object: $status\n"; my ($lz, $status) = new Compress::Raw::Lzma::StreamEncoder [OPTS] or die "Cannot create lzma object: $status\n"; my ($lz, $status) = new Compress::Raw::Lzma::RawEncoder [OPTS] or die "Cannot create lzma object: $status\n"; $status = $lz->code($input, $output); $status = $lz->flush($output); # Decoders my ($lz, $status) = new Compress::Raw::Lzma::AloneDecoder [OPTS] or die "Cannot create bunzip2 object: $status\n"; my ($lz, $status) = new Compress::Raw::Lzma::AutoDecoder [OPTS] or die "Cannot create bunzip2 object: $status\n"; my ($lz, $status) = new Compress::Raw::Lzma::StreamDecoder [OPTS] or die "Cannot create bunzip2 object: $status\n"; my ($lz, $status) = new Compress::Raw::Lzma::RawDecoder [OPTS] or die "Cannot create bunzip2 object: $status\n"; $status = $lz->code($input, $output); my $version = Compress::Raw::Lzma::lzma_version_number(); my $version = Compress::Raw::Lzma::lzma_version_string(); =head1 DESCRIPTION C provides an interface to the in-memory compression/uncompression functions from the lzma compression library. Although the primary purpose for the existence of C is for use by the C, C, C and C modules, it can be used on its own for simple compression/uncompression tasks. There are two functions, called C and C, used in all the compression and uncompression interfaces defined in this module. By default both of these functions overwrites any data stored in its output buffer parameter. If you want to compress/uncompress to a single buffer, and have C and C append to that buffer, enable the C option when you create the compression/decompression object. =head1 Compression There are four compression interfaces available in this module. =over 5 =item Compress::Raw::Lzma::EasyEncoder =item Compress::Raw::Lzma::AloneEncoder =item Compress::Raw::Lzma::StreamEncoder =item Compress::Raw::Lzma::RawEncoder =back =head2 ($z, $status) = new Compress::Raw::Lzma::EasyEncoder [OPTS]; Creates a new I compression object. If successful, it will return the initialised compression object, C<$z> and a C<$status> of C in a list context. In scalar context it returns the deflation object, C<$z>, only. If not successful, the returned compression object, C<$z>, will be I and C<$status> will hold the an I error code. Below is a list of the valid options: =over 5 =item B<< Preset => $preset >> Used to choose the compression preset. Valid values are 0-9 and C. 0 is the fastest compression with the lowest memory usage and the lowest compression. 9 is the slowest compression with the highest memory usage but with the best compression. Defaults to C. =item B<< Extreme => 0|1 >> Makes the compression a lot slower, but a small compression gain. Defaults to 0. =item B<< Check => $check >> Used to specify the integrity check used in the xz data stream. Valid values are C, C, C, C. Defaults to C. =item B<< AppendOutput => 0|1 >> Controls whether the compressed data is appended to the output buffer in the C and C methods. Defaults to 0. (Note in versions of this module prior to 2.072 the default value was incorrectly documented as 1). =item B<< BufSize => $number >> Sets the initial size for the output buffer used by the C<$d-Ecode> method. If the buffer has to be reallocated to increase the size, it will grow in increments of C. Defaults to 16k. =back =head2 ($z, $status) = new Compress::Raw::Lzma::AloneEncoder [OPTS]; Creates a legacy I compression object. This format is also know as lzma_alone. If successful, it will return the initialised compression object, C<$z> and a C<$status> of C in a list context. In scalar context it returns the deflation object, C<$z>, only. If not successful, the returned compression object, C<$z>, will be I and C<$status> will hold the an I error code. Below is a list of the valid options: =over 5 =item B<< Filter => $filter >> The C< $filter > option must be an object of type C. See L for a definition of C. If this option is not present an C object with default values will be used. =item B<< AppendOutput => 0|1 >> Controls whether the compressed data is appended to the output buffer in the C and C methods. Defaults to 0. (Note in versions of this module prior to 2.072 the default value was incorrectly documented as 1). =item B<< BufSize => $number >> Sets the initial size for the output buffer used by the C<$d-Ecode> method. If the buffer has to be reallocated to increase the size, it will grow in increments of C. Defaults to 16k. =back =head2 ($z, $status) = new Compress::Raw::Lzma::StreamEncoder [OPTS]; Creates a I compression object. If successful, it will return the initialised compression object, C<$z> and a C<$status> of C in a list context. In scalar context it returns the deflation object, C<$z>, only. If not successful, the returned compression object, C<$z>, will be I and C<$status> will hold the an I error code. Below is a list of the valid options: =over 5 =item B<< Filter => $filter >> =item B<< Filter => [$filter1, $filter2,...] >> This option is used to change the bahaviour of the StreamEncoder by applying between one and C filters to the data stream during compression. See L for more details on the available filters. If this option is present it must either contain a single C filter object or an array reference containing between one and C filter objects. If this option is not present an C object with default values will be used. =item B<< Check => $check >> Used to specify the integrity check used in the xz data stream. Valid values are C, C, C, C. Defaults to C. =item B<< AppendOutput => 0|1 >> Controls whether the compressed data is appended to the output buffer in the C and C methods. Defaults to 0. (Note in versions of this module prior to 2.072 the default value was incorrectly documented as 1). =item B<< BufSize => $number >> Sets the initial size for the output buffer used by the C<$d-Ecode> method. If the buffer has to be reallocated to increase the size, it will grow in increments of C. Defaults to 16k. =back =head2 ($z, $status) = new Compress::Raw::Lzma::RawEncoder [OPTS]; Low level access to lzma. If successful, it will return the initialised compression object, C<$z> and a C<$status> of C in a list context. In scalar context it returns the deflation object, C<$z>, only. If not successful, the returned compression object, C<$z>, will be I and C<$status> will hold the an I error code. Below is a list of the valid options: =over 5 =item B<< Filter => $filter >> =item B<< Filter => [$filter1, $filter2,...] >> This option is used to change the bahaviour of the RawEncoder by applying between one and C filters to the data stream during compression. See L for more details on the available filters. If this option is present it must either contain a single C filter object or an array reference containing between one and C filter objects. If this option is not present an C object with default values will be used. =item B<< AppendOutput => 0|1 >> Controls whether the compressed data is appended to the output buffer in the C and C methods. Defaults to 0. (Note in versions of this module prior to 2.072 the default value was incorrectly documented as 1). =item B<< BufSize => $number >> Sets the initial size for the output buffer used by the C<$d-Ecode> method. If the buffer has to be reallocated to increase the size, it will grow in increments of C. Defaults to 16k. =item B<< ForZip => 1/0 >> This boolean option is used to enable prefixing the compressed data stream with an encoded copy of the filter properties. Defaults to 0. =back =head2 $status = $lz->code($input, $output); Reads the contents of C<$input>, compresses it and writes the compressed data to C<$output>. Returns C on success and an C error code on failure. If C is enabled in the constructor for the lzma object, the compressed data will be appended to C<$output>. If not enabled, C<$output> will be truncated before the compressed data is written to it. =head2 $status = $lz->flush($output, LZMA_FINISH); Flushes any pending compressed data to C<$output>. By default it terminates the compressed data stream. Returns C on success and an C error code on failure. =head2 Example TODO =head1 Uncompression There are four uncompression interfaces available in this module. =over 5 =item Compress::Raw::Lzma::AutoDecoder =item Compress::Raw::Lzma::AloneDecoder =item Compress::Raw::Lzma::StreamDecoder =item Compress::Raw::Lzma::RawDecoder =back =head2 ($z, $status) = new Compress::Raw::Lzma::AutoDecoder [OPTS] ; Create an object that can uncompress any of the compressed data streams that can be created by this module. If successful, it will return the initialised uncompression object, C<$z> and a C<$status> of C in a list context. In scalar context it returns the deflation object, C<$z>, only. If not successful, the returned uncompression object, C<$z>, will be I and C<$status> will hold the an I error code. Below is a list of the valid options: =over 5 =item B<-MemLimit> The number of bytes to use when uncompressing. Default is unlimited. =item B<-Bufsize> Sets the initial size for the output buffer used by the C<$i-Ecode> method. If the output buffer in this method has to be reallocated to increase the size, it will grow in increments of C. Default is 16k. =item B<-AppendOutput> This option controls how data is written to the output buffer by the C<$i-Ecode> method. If the option is set to false, the output buffer in the C<$i-Ecode> method will be truncated before uncompressed data is written to it. If the option is set to true, uncompressed data will be appended to the output buffer by the C<$i-Ecode> method. This option defaults to false. =item B<-ConsumeInput> If set to true, this option will remove compressed data from the input buffer of the C<< $i->code >> method as the uncompression progresses. This option can be useful when you are processing compressed data that is embedded in another file/buffer. In this case the data that immediately follows the compressed stream will be left in the input buffer. This option defaults to true. =item B<-LimitOutput> The C option changes the behavior of the C<< $i->code >> method so that the amount of memory used by the output buffer can be limited. When C is used the size of the output buffer used will either be the value of the C option or the amount of memory already allocated to C<$output>, whichever is larger. Predicting the output size available is tricky, so don't rely on getting an exact output buffer size. When C is not specified C<< $i->code >> will use as much memory as it takes to write all the uncompressed data it creates by uncompressing the input buffer. If C is enabled, the C option will also be enabled. This option defaults to false. See L for a discussion on why C is needed and how to use it. =back =head2 ($z, $status) = new Compress::Raw::Lzma::AloneDecoder [OPTS] ; Create an object that can uncompress an lzma_alone data stream. If successful, it will return the initialised uncompression object, C<$z> and a C<$status> of C in a list context. In scalar context it returns the deflation object, C<$z>, only. If not successful, the returned uncompression object, C<$z>, will be I and C<$status> will hold the an I error code. Below is a list of the valid options: =over 5 =item B<-MemLimit> The number of bytes to use when uncompressing. Default is unlimited. =item B<-Bufsize> Sets the initial size for the output buffer used by the C<$i-Ecode> method. If the output buffer in this method has to be reallocated to increase the size, it will grow in increments of C. Default is 16k. =item B<-AppendOutput> This option controls how data is written to the output buffer by the C<$i-Ecode> method. If the option is set to false, the output buffer in the C<$i-Ecode> method will be truncated before uncompressed data is written to it. If the option is set to true, uncompressed data will be appended to the output buffer by the C<$i-Ecode> method. This option defaults to false. =item B<-ConsumeInput> If set to true, this option will remove compressed data from the input buffer of the C<< $i->code >> method as the uncompression progresses. This option can be useful when you are processing compressed data that is embedded in another file/buffer. In this case the data that immediately follows the compressed stream will be left in the input buffer. This option defaults to true. =item B<-LimitOutput> The C option changes the behavior of the C<< $i->code >> method so that the amount of memory used by the output buffer can be limited. When C is used the size of the output buffer used will either be the value of the C option or the amount of memory already allocated to C<$output>, whichever is larger. Predicting the output size available is tricky, so don't rely on getting an exact output buffer size. When C is not specified C<< $i->code >> will use as much memory as it takes to write all the uncompressed data it creates by uncompressing the input buffer. If C is enabled, the C option will also be enabled. This option defaults to false. See L for a discussion on why C is needed and how to use it. =back =head2 $status = $z->code($input, $output); Uncompresses C<$input> and writes the uncompressed data to C<$output>. Returns C if the uncompression was successful, but the end of the compressed data stream has not been reached. Returns C on successful uncompression and the end of the compression stream has been reached. If C is enabled in the constructor for the lzma object, C<$input> will have all compressed data removed from it after uncompression. On C return this will mean that C<$input> will be an empty string; when C C<$input> will either be an empty string or will contain whatever data immediately followed the compressed data stream. If C is enabled in the constructor for the lzma object, the uncompressed data will be appended to C<$output>. If not enabled, C<$output> will be truncated before the uncompressed data is written to it. =head1 Filters TODO - more here A number of the Lzma compression interfaces (namely C & C) and the raw lzma uncompression interface make use of filters. These filters are used to change the behaviour of compression (and raw uncompression). All Lzma Filters are sub-classed from the C base-class. =head2 Lzma::Filter::Lzma The C class is used to... TODO - more here There are two subclasses of C, namely C and C. The former is typically used with C. The latter with C. When using Lzma filters an C I be included and it I be the last filter in the chain. There can only be one C filter in any filter chain. The C construction takes the following options. =over 5 =item DictSize => $value Dictionary size in bytes. This controls how many bytes of the recently processed uncompressed data is kept in memory. The size of the dictionary must be at least C. Defaults to C. =item PresetDict => $dict Provide an initial dictionary. This value is used to initialize the LZ77 history window. This feature only works correctly with raw encoding and decoding. You may not be able to decode other formats that have been encoded with a preset dictionary. C<$dict> should contain typical strings that occur in the files being compressed, with the most probably strings near the end fo the preset dictionary. If C<$dict> is larger than C, only the last C bytes are processed. =item Lc => $value Number of literal context bits. How many of the highest bits of the previous uncompressed eight-bit byte (also known as `literal') are taken into account when predicting the bits of the next literal. C<$value> must be a number between C and C. Note the sum of the C and C options cannot exceed 4. Defaults to C. =item Lp => $value Number of literal position bits. How many of the lowest bits of the current position (number of bytes from the beginning of the uncompressed data) in the uncompressed data is taken into account when predicting the bits of the next literal (a single eight-bit byte). Defaults to C. =item Pb => $value Number of position bits How many of the lowest bits of the current position in the uncompressed data is taken into account when estimating probabilities of matches. A match is a sequence of bytes for which a matching sequence is found from the dictionary and thus can be stored as distance-length pair. C<$value> must be a number between C and C. Defaults to C. =item Mode => $value The Compression Mode. Valid values are C and C. Defaults to C. =item Nice => $value Nice length of a match Defaults to 64. =item Mf => $value Defines which Match Finder to use. Valid values are C C, C C and C. Defaults to C. =item Depth => $value Maximum search depth in the match finder. Defaults to 0. =back =head2 Lzma::Filter::BCJ The sub-classes of C are the Branch/Call/Jump conversion filters. These filters are used to rewrite executable binary code for a number of processor architectures. None of these classes take any options. =over 5 =item Lzma::Filter::X86 Filter for x86 binaries. =item Lzma::Filter::PowerPC Filter for Big endian PowerPC binaries. =item Lzma::Filter::IA64 Filter for IA64 (Itanium) binaries. =item Lzma::Filter::ARM Filter for ARM binaries. =item Lzma::Filter::ARMThumb Filter for ARMThumb binaries. =item Lzma::Filter::Sparc Filter for Sparc binaries. =back =head2 Lzma::Filter::Delta Usage is Lzma::Filter::Delta [OPTS] =over 5 =item Type => $type Defines the type of Delta calculation. The only available type (and therefore the default) is C, =item Distance => $value Defines the Delta Distance. C<$value> must be a number between C and C. Default is C. =back =head1 Misc =head2 my $version = Compress::Raw::Lzma::lzma_version_number(); Returns the version of the underlying lzma library this module is using at run-time as a number. =head2 my $version = Compress::Raw::Lzma::lzma_version_string(); Returns the version of the underlying lzma library this module is using at run-time as a string. =head2 my $version = Compress::Raw::Lzma::LZMA_VERSION(); Returns the version of the underlying lzma library this module was using at compile-time as a number. =head2 my $version = Compress::Raw::Lzma::LZMA_VERSION_STRING(); Returns the version of the underlying lzma library this module was using at compile-time as a string. =head1 Constants The following lzma constants are exported by this module TODO - more here =head1 SUPPORT General feedback/questions/bug reports should be sent to L (preferred) or L. =head1 SEE ALSO L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L L L, L, L, L =head1 AUTHOR This module was written by Paul Marquess, C. =head1 MODIFICATION HISTORY See the Changes file. =head1 COPYRIGHT AND LICENSE Copyright (c) 2005-2021 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Compress-Raw-Lzma-2.101/MANIFEST0000644000175000017500000000105613767226711014573 0ustar paulpaulChanges config.in fallback/constants.h fallback/constants.xs lib/Compress/Raw/Lzma.pm Lzma.xs Makefile.PL MANIFEST ppport.h private/MakeUtil.pm README t/001version.t t/02filters.t t/09limitoutput.t t/01llzma-generic.t t/050interop-xz.t t/10preset_dict.t t/19nonpv.t t/99pod.t t/meta-json.t t/meta-yaml.t t/compress/CompTestUtils.pm t/Test/Builder.pm t/Test/More.pm t/Test/Simple.pm typemap META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) Compress-Raw-Lzma-2.101/private/0000755000175000017500000000000014014211600015063 5ustar paulpaulCompress-Raw-Lzma-2.101/private/MakeUtil.pm0000644000175000017500000001760613747272666017205 0ustar paulpaulpackage MakeUtil ; package main ; use strict ; use Config qw(%Config); use File::Copy; my $VERSION = '1.0'; BEGIN { eval { require File::Spec::Functions ; File::Spec::Functions->import() } ; if ($@) { *catfile = sub { return "$_[0]/$_[1]" } } } require VMS::Filespec if $^O eq 'VMS'; unless($ENV{PERL_CORE}) { $ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV; } $ENV{SKIP_FOR_CORE} = 1 if $ENV{PERL_CORE} || $ENV{MY_PERL_CORE} ; sub MY::libscan { my $self = shift; my $path = shift; return undef if $path =~ /(~|\.bak|_bak)$/ || $path =~ /\..*\.sw(o|p)$/ || $path =~ /\B\.svn\b/; return $path; } sub MY::postamble { return '' if $ENV{PERL_CORE} ; my @files = getPerlFiles('MANIFEST'); # Note: Once you remove all the layers of shell/makefile escaping # the regular expression below reads # # /^\s*local\s*\(\s*\$^W\s*\)/ # my $postamble = ' MyTrebleCheck: @echo Checking for $$^W in files: '. "@files" . ' perl -ne \' \ exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \' \ ' . " @files || " . ' \ (echo found unexpected $$^W ; exit 1) @echo All is ok. '; return $postamble; } sub getPerlFiles { my @manifests = @_ ; my @files = (); for my $manifest (@manifests) { my $prefix = './'; $prefix = $1 if $manifest =~ m#^(.*/)#; open M, "<$manifest" or die "Cannot open '$manifest': $!\n"; while () { chomp ; next if /^\s*#/ || /^\s*$/ ; s/^\s+//; s/\s+$//; #next if m#t/Test/More\.pm$# or m#t/Test/Builder\.pm$#; /^(\S+)\s*(.*)$/; my ($file, $rest) = ($1, $2); if ($file =~ /\.(pm|pl|t)$/ and $file !~ /MakeUtil.pm/) { push @files, "$prefix$file"; } elsif ($rest =~ /perl/i) { push @files, "$prefix$file"; } } close M; } return @files; } sub UpDowngrade { return if defined $ENV{TipTop}; my @files = @_ ; # our and use bytes/utf8 is stable from 5.6.0 onward # warnings is stable from 5.6.1 onward # Note: this code assumes that each statement it modifies is not # split across multiple lines. my $warn_sub = ''; my $our_sub = '' ; my $upgrade ; my $downgrade ; my $do_downgrade ; my $caller = (caller(1))[3] || ''; if ($caller =~ /downgrade/) { $downgrade = 1; } elsif ($caller =~ /upgrade/) { $upgrade = 1; } else { $do_downgrade = 1 if $] < 5.006001 ; } # else # { # my $opt = shift @ARGV || '' ; # $upgrade = ($opt =~ /^-upgrade/i); # $downgrade = ($opt =~ /^-downgrade/i); # push @ARGV, $opt unless $downgrade || $upgrade; # } if ($downgrade || $do_downgrade) { # From: use|no warnings "blah" # To: local ($^W) = 1; # use|no warnings "blah" $warn_sub = sub { s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ; s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ; }; } #elsif ($] >= 5.006001 || $upgrade) { elsif ($upgrade) { # From: local ($^W) = 1; # use|no warnings "blah" # To: use|no warnings "blah" $warn_sub = sub { s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ; }; } if ($downgrade || $do_downgrade) { $our_sub = sub { if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) { my $indent = $1; my $vars = join ' ', split /\s*,\s*/, $2; $_ = "${indent}use vars qw($vars);\n"; } elsif ( /^(\s*)((use|no)\s+(bytes|utf8)\s*;.*)$/) { $_ = "$1# $2\n"; } }; } #elsif ($] >= 5.006000 || $upgrade) { elsif ($upgrade) { $our_sub = sub { if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) { my $indent = $1; my $vars = join ', ', split ' ', $2; $_ = "${indent}our ($vars);\n"; } elsif ( /^(\s*)#\s*((use|no)\s+(bytes|utf8)\s*;.*)$/) { $_ = "$1$2\n"; } }; } if (! $our_sub && ! $warn_sub) { warn "Up/Downgrade not needed.\n"; if ($upgrade || $downgrade) { exit 0 } else { return } } foreach (@files) { #if (-l $_ ) { doUpDown($our_sub, $warn_sub, $_) } #else #{ doUpDownViaCopy($our_sub, $warn_sub, $_) } } warn "Up/Downgrade complete.\n" ; exit 0 if $upgrade || $downgrade; } sub doUpDown { my $our_sub = shift; my $warn_sub = shift; return if -d $_[0]; local ($^I) = ($^O eq 'VMS') ? "_bak" : ".bak"; local (@ARGV) = shift; while (<>) { print, last if /^__(END|DATA)__/ ; &{ $our_sub }() if $our_sub ; &{ $warn_sub }() if $warn_sub ; print ; } return if eof ; while (<>) { print } } sub doUpDownViaCopy { my $our_sub = shift; my $warn_sub = shift; my $file = shift ; use File::Copy ; return if -d $file ; my $backup = $file . ($^O eq 'VMS') ? "_bak" : ".bak"; copy($file, $backup) or die "Cannot copy $file to $backup: $!"; my @keep = (); { open F, "<$file" or die "Cannot open $file: $!\n" ; while () { if (/^__(END|DATA)__/) { push @keep, $_; last ; } &{ $our_sub }() if $our_sub ; &{ $warn_sub }() if $warn_sub ; push @keep, $_; } if (! eof F) { while () { push @keep, $_ } } close F; } { open F, ">$file" or die "Cannot open $file: $!\n"; print F @keep ; close F; } } sub FindBrokenDependencies { my $version = shift ; my %thisModule = map { $_ => 1} @_; my @modules = qw( IO::Compress::Base IO::Compress::Base::Common IO::Uncompress::Base Compress::Raw::Zlib Compress::Raw::Bzip2 IO::Compress::RawDeflate IO::Uncompress::RawInflate IO::Compress::Deflate IO::Uncompress::Inflate IO::Compress::Gzip IO::Compress::Gzip::Constants IO::Uncompress::Gunzip IO::Compress::Zip IO::Uncompress::Unzip IO::Compress::Bzip2 IO::Uncompress::Bunzip2 IO::Compress::Lzf IO::Uncompress::UnLzf IO::Compress::Lzop IO::Uncompress::UnLzop Compress::Zlib ); my @broken = (); foreach my $module ( grep { ! $thisModule{$_} } @modules) { my $hasVersion = getInstalledVersion($module); # No need to upgrade if the module isn't installed at all next if ! defined $hasVersion; # If already have C::Z version 1, then an upgrade to any of the # IO::Compress modules will not break it. next if $module eq 'Compress::Zlib' && $hasVersion < 2; if ($hasVersion < $version) { push @broken, $module } } return @broken; } sub getInstalledVersion { my $module = shift; my $version; eval " require $module; "; if ($@ eq '') { no strict 'refs'; $version = ${ $module . "::VERSION" }; $version = 0 } return $version; } package MakeUtil ; 1; Compress-Raw-Lzma-2.101/README0000644000175000017500000001532114014204206014277 0ustar paulpaul Compress-Raw-Lzma Version 2.101 20 Feburary 2021 Copyright (c) 2009-2021 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. DESCRIPTION ----------- This module provides a Perl interface to allow reading and writing of lzma, lzip and xz files/buffers. PREREQUISITES ------------- Before you can build Compress-Raw-Lzma you need to have the following installed on your system: * A C compiler * Perl 5.006 or better. * A copy of liblzma liblzma is part of the XZ Utils which is available at http://tukaani.org/xz/ Next you must edit the file config.in that comes with this distribution. If necessary, change the INCLUDE and LIB variable to the directories where liblzma and the lzma include file are installed. BUILDING THE MODULE ------------------- Assuming you have met all the prerequisites, the module can now be built using this sequence of commands: perl Makefile.PL make make test INSTALLATION ------------ To install Compress-Raw-Lzma, run the command below: make install TROUBLESHOOTING --------------- Test harness fails with: Undefined symbol "lzma_properties_size" ---------------------------------------------------------------- If the module appears to have built correctly, but the t/001version.t test harness fails with the error Undefined symbol "lzma_properties_size" it means you have two libraries called liblzma installed on your system. The version of liblzma used by this module comes from http://tukaani.org/xz/. There is another distribution, that comes from http://tokyocabinet.sourceforge.net/misc/ that also builds a library called liblzma. The tokyocabinet version of liblzma is not compatible with this module. Note that the Perl module Compress-Lzma-Simple uses the tokyocabinet version of liblzma. The solution is either: 1. Set the LIB variable in config.in to point to the directory where the correct liblzma library is installed. 2. Remove the offending version of liblzma. Solaris build fails with "language optional software package not installed" --------------------------------------------------------------------------- If you are trying to build this module under Solaris and you get an error message like this /usr/ucb/cc: language optional software package not installed it means that Perl cannot find the C compiler on your system. The cryptic message is just Sun's way of telling you that you haven't bought their C compiler. When you build a Perl module that needs a C compiler, the Perl build system tries to use the same C compiler that was used to build perl itself. In this case your Perl binary was built with a C compiler that lived in /usr/ucb. To continue with building this module, you need to get a C compiler, or tell Perl where your C compiler is, if you already have one. Assuming you have now got a C compiler, what you do next will be dependent on what C compiler you have installed. If you have just installed Sun's C compiler, you shouldn't have to do anything. Just try rebuilding this module. If you have installed another C compiler, say gcc, you have to tell perl how to use it instead of /usr/ucb/cc. This set of options seems to work if you want to use gcc. Your mileage may vary. perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " make test If that doesn't work for you, it's time to make changes to the Makefile by hand. Good luck! Solaris build fails with "gcc: unrecognized option `-KPIC'" ----------------------------------------------------------- You are running Solaris and you get an error like this when you try to build this Perl module gcc: unrecognized option `-KPIC' This symptom usually means that you are using a Perl binary that has been built with the Sun C compiler, but you are using gcc to build this module. When Perl builds modules that need a C compiler, it will attempt to use the same C compiler and command line options that was used to build perl itself. In this case "-KPIC" is a valid option for the Sun C compiler, but not for gcc. The equivalent option for gcc is "-fPIC". The solution is either: 1. Build both Perl and this module with the same C compiler, either by using the Sun C compiler for both or gcc for both. 2. Try generating the Makefile for this module like this perl perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " LD=gcc make test This second option seems to work when mixing a Perl binary built with the Sun C compiler and this module built with gcc. Your mileage may vary. HP-UX Notes ----------- I've had a report that when building Compress-Raw-Lzma under HP-UX that it is necessary to have first built the lzma library with the -fpic option. SUPPORT ------- General feedback/questions/bug reports should be sent to https://github.com/pmqs/Compress-Raw-Lzma/issues (preferred) or https://rt.cpan.org/Public/Dist/Display.html?Name=Compress-Raw-Lzma. FEEDBACK -------- How to report a problem with Compress-Raw-Lzma. To help me help you, I need all of the following information: 1. The Versions of everything relevant. This includes: a. The *complete* output from running this perl -V Do not edit the output in any way. Note, I want you to run "perl -V" and NOT "perl -v". If your perl does not understand the "-V" option it is too old. This module needs Perl version 5.004 or better. b. The version of Compress-Raw-Lzma you have. If you have successfully installed Compress-Raw-Lzma, this one-liner will tell you: perl -MCompress::Raw::Lzma -e 'print qq[ver $Compress::Raw::Lzma::VERSION\n]' If you are running windows use this perl -MCompress::Raw::Lzma -e "print qq[ver $Compress::Raw::Lzma::VERSION\n]" If you haven't installed Compress-Raw-Lzma then search Compress::Raw::Lzma.pm for a line like this: $VERSION = "2.101" ; c. The version of lzma you have used. If you have successfully installed Compress-Raw-Lzma, this one-liner will tell you: perl -MCompress::Raw::Lzma -e "print q[lzma ver ]. Compress::Raw::Lzma::ZLIB_VERSION.qq[\n]" If not, look at the beginning of the file zlib.h. 2. If you are having problems building Compress-Raw-Lzma, send me a complete log of what happened. Start by unpacking the Compress-Raw-Lzma module into a fresh directory and keep a log of all the steps [edit config.in, if necessary] perl Makefile.PL make make test TEST_VERBOSE=1 Paul Marquess Compress-Raw-Lzma-2.101/ppport.h0000644000175000017500000055352213443224331015134 0ustar paulpaul#if 0 <<'SKIP'; #endif /* ---------------------------------------------------------------------- ppport.h -- Perl/Pollution/Portability Version 3.20_01 Automatically created by Devel::PPPort running under perl 5.016001. Do NOT edit this file directly! -- Edit PPPort_pm.PL and the includes in parts/inc/ instead. Use 'perldoc ppport.h' to view the documentation below. ---------------------------------------------------------------------- SKIP =pod =head1 NAME ppport.h - Perl/Pollution/Portability version 3.20_01 =head1 SYNOPSIS perl ppport.h [options] [source files] Searches current directory for files if no [source files] are given --help show short help --version show version --patch=file write one patch file with changes --copy=suffix write changed copies with suffix --diff=program use diff program and options --compat-version=version provide compatibility with Perl version --cplusplus accept C++ comments --quiet don't output anything except fatal errors --nodiag don't show diagnostics --nohints don't show hints --nochanges don't suggest changes --nofilter don't filter input files --strip strip all script and doc functionality from ppport.h --list-provided list provided API --list-unsupported list unsupported API --api-info=name show Perl API portability information =head1 COMPATIBILITY This version of F is designed to support operation with Perl installations back to 5.003, and has been tested up to 5.11.5. =head1 OPTIONS =head2 --help Display a brief usage summary. =head2 --version Display the version of F. =head2 --patch=I If this option is given, a single patch file will be created if any changes are suggested. This requires a working diff program to be installed on your system. =head2 --copy=I If this option is given, a copy of each file will be saved with the given suffix that contains the suggested changes. This does not require any external programs. Note that this does not automagially add a dot between the original filename and the suffix. If you want the dot, you have to include it in the option argument. If neither C<--patch> or C<--copy> are given, the default is to simply print the diffs for each file. This requires either C or a C program to be installed. =head2 --diff=I Manually set the diff program and options to use. The default is to use C, when installed, and output unified context diffs. =head2 --compat-version=I Tell F to check for compatibility with the given Perl version. The default is to check for compatibility with Perl version 5.003. You can use this option to reduce the output of F if you intend to be backward compatible only down to a certain Perl version. =head2 --cplusplus Usually, F will detect C++ style comments and replace them with C style comments for portability reasons. Using this option instructs F to leave C++ comments untouched. =head2 --quiet Be quiet. Don't print anything except fatal errors. =head2 --nodiag Don't output any diagnostic messages. Only portability alerts will be printed. =head2 --nohints Don't output any hints. Hints often contain useful portability notes. Warnings will still be displayed. =head2 --nochanges Don't suggest any changes. Only give diagnostic output and hints unless these are also deactivated. =head2 --nofilter Don't filter the list of input files. By default, files not looking like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. =head2 --strip Strip all script and documentation functionality from F. This reduces the size of F dramatically and may be useful if you want to include F in smaller modules without increasing their distribution size too much. The stripped F will have a C<--unstrip> option that allows you to undo the stripping, but only if an appropriate C module is installed. =head2 --list-provided Lists the API elements for which compatibility is provided by F. Also lists if it must be explicitly requested, if it has dependencies, and if there are hints or warnings for it. =head2 --list-unsupported Lists the API elements that are known not to be supported by F and below which version of Perl they probably won't be available or work. =head2 --api-info=I Show portability information for API elements matching I. If I is surrounded by slashes, it is interpreted as a regular expression. =head1 DESCRIPTION In order for a Perl extension (XS) module to be as portable as possible across differing versions of Perl itself, certain steps need to be taken. =over 4 =item * Including this header is the first major one. This alone will give you access to a large part of the Perl API that hasn't been available in earlier Perl releases. Use perl ppport.h --list-provided to see which API elements are provided by ppport.h. =item * You should avoid using deprecated parts of the API. For example, using global Perl variables without the C prefix is deprecated. Also, some API functions used to have a C prefix. Using this form is also deprecated. You can safely use the supported API, as F will provide wrappers for older Perl versions. =item * If you use one of a few functions or variables that were not present in earlier versions of Perl, and that can't be provided using a macro, you have to explicitly request support for these functions by adding one or more C<#define>s in your source code before the inclusion of F. These functions or variables will be marked C in the list shown by C<--list-provided>. Depending on whether you module has a single or multiple files that use such functions or variables, you want either C or global variants. For a C function or variable (used only in a single source file), use: #define NEED_function #define NEED_variable For a global function or variable (used in multiple source files), use: #define NEED_function_GLOBAL #define NEED_variable_GLOBAL Note that you mustn't have more than one global request for the same function or variable in your project. Function / Variable Static Request Global Request ----------------------------------------------------------------------------------------- PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL grok_number() NEED_grok_number NEED_grok_number_GLOBAL grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL load_module() NEED_load_module NEED_load_module_GLOBAL my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL pv_display() NEED_pv_display NEED_pv_display_GLOBAL pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL vload_module() NEED_vload_module NEED_vload_module_GLOBAL vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL warner() NEED_warner NEED_warner_GLOBAL To avoid namespace conflicts, you can change the namespace of the explicitly exported functions / variables using the C macro. Just C<#define> the macro before including C: #define DPPP_NAMESPACE MyOwnNamespace_ #include "ppport.h" The default namespace is C. =back The good thing is that most of the above can be checked by running F on your source code. See the next section for details. =head1 EXAMPLES To verify whether F is needed for your module, whether you should make any changes to your code, and whether any special defines should be used, F can be run as a Perl script to check your source code. Simply say: perl ppport.h The result will usually be a list of patches suggesting changes that should at least be acceptable, if not necessarily the most efficient solution, or a fix for all possible problems. If you know that your XS module uses features only available in newer Perl releases, if you're aware that it uses C++ comments, and if you want all suggestions as a single patch file, you could use something like this: perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff If you only want your code to be scanned without any suggestions for changes, use: perl ppport.h --nochanges You can specify a different C program or options, using the C<--diff> option: perl ppport.h --diff='diff -C 10' This would output context diffs with 10 lines of context. If you want to create patched copies of your files instead, use: perl ppport.h --copy=.new To display portability information for the C function, use: perl ppport.h --api-info=newSVpvn Since the argument to C<--api-info> can be a regular expression, you can use perl ppport.h --api-info=/_nomg$/ to display portability information for all C<_nomg> functions or perl ppport.h --api-info=/./ to display information for all known API elements. =head1 BUGS If this version of F is causing failure during the compilation of this module, please check if newer versions of either this module or C are available on CPAN before sending a bug report. If F was generated using the latest version of C and is causing failure of this module, please file a bug report using the CPAN Request Tracker at L. Please include the following information: =over 4 =item 1. The complete output from running "perl -V" =item 2. This file. =item 3. The name and version of the module you were trying to build. =item 4. A full log of the build that failed. =item 5. Any other information that you think could be relevant. =back For the latest version of this code, please get the C module from CPAN. =head1 COPYRIGHT Version 3.x, Copyright (c) 2004-2012, Marcus Holland-Moritz. Version 2.x, Copyright (C) 2001, Paul Marquess. Version 1.x, Copyright (C) 1999, Kenneth Albanowski. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO See L. =cut use strict; # Disable broken TRIE-optimization BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } my $VERSION = 3.20_01; my %opt = ( quiet => 0, diag => 1, hints => 1, changes => 1, cplusplus => 0, filter => 1, strip => 0, version => 0, ); my($ppport) = $0 =~ /([\w.]+)$/; my $LF = '(?:\r\n|[\r\n])'; # line feed my $HS = "[ \t]"; # horizontal whitespace # Never use C comments in this file! my $ccs = '/'.'*'; my $cce = '*'.'/'; my $rccs = quotemeta $ccs; my $rcce = quotemeta $cce; eval { require Getopt::Long; Getopt::Long::GetOptions(\%opt, qw( help quiet diag! filter! hints! changes! cplusplus strip version patch=s copy=s diff=s compat-version=s list-provided list-unsupported api-info=s )) or usage(); }; if ($@ and grep /^-/, @ARGV) { usage() if "@ARGV" =~ /^--?h(?:elp)?$/; die "Getopt::Long not found. Please don't use any options.\n"; } if ($opt{version}) { print "This is $0 $VERSION.\n"; exit 0; } usage() if $opt{help}; strip() if $opt{strip}; if (exists $opt{'compat-version'}) { my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; if ($@) { die "Invalid version number format: '$opt{'compat-version'}'\n"; } die "Only Perl 5 is supported\n" if $r != 5; die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; } else { $opt{'compat-version'} = 5; } my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ ? ( $1 => { ($2 ? ( base => $2 ) : ()), ($3 ? ( todo => $3 ) : ()), (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), } ) : die "invalid spec: $_" } qw( AvFILLp|5.004050||p AvFILL||| BhkDISABLE||5.017004| BhkENABLE||5.017004| BhkENTRY_set||5.017004| BhkENTRY||| BhkFLAGS||| CALL_BLOCK_HOOKS||| CLASS|||n CPERLscope|5.005000||p CX_CURPAD_SAVE||| CX_CURPAD_SV||| CopFILEAV|5.006000||p CopFILEGV_set|5.006000||p CopFILEGV|5.006000||p CopFILESV|5.006000||p CopFILE_set|5.006000||p CopFILE|5.006000||p CopSTASHPV_set|5.006000||p CopSTASHPV|5.006000||p CopSTASH_eq|5.006000||p CopSTASH_set|5.006000||p CopSTASH|5.006000||p CopyD|5.009002|5.004050|p Copy||| CvPADLIST||5.008001| CvSTASH||| CvWEAKOUTSIDE||| DEFSV_set|5.010001||p DEFSV|5.004050||p END_EXTERN_C|5.005000||p ENTER||| ERRSV|5.004050||p EXTEND||| EXTERN_C|5.005000||p F0convert|||n FREETMPS||| GIMME_V||5.004000|n GIMME|||n GROK_NUMERIC_RADIX|5.007002||p G_ARRAY||| G_DISCARD||| G_EVAL||| G_METHOD|5.006001||p G_NOARGS||| G_SCALAR||| G_VOID||5.004000| GetVars||| GvAV||| GvCV||| GvHV||| GvSVn|5.009003||p GvSV||| Gv_AMupdate||5.011000| HEf_SVKEY||5.004000| HeHASH||5.004000| HeKEY||5.004000| HeKLEN||5.004000| HePV||5.004000| HeSVKEY_force||5.004000| HeSVKEY_set||5.004000| HeSVKEY||5.004000| HeUTF8||5.010001| HeVAL||5.004000| HvENAMELEN||5.015004| HvENAMEUTF8||5.015004| HvENAME||5.013007| HvNAMELEN_get|5.009003||p HvNAMELEN||5.015004| HvNAMEUTF8||5.015004| HvNAME_get|5.009003||p HvNAME||| INT2PTR|5.006000||p IN_LOCALE_COMPILETIME|5.007002||p IN_LOCALE_RUNTIME|5.007002||p IN_LOCALE|5.007002||p IN_PERL_COMPILETIME|5.008001||p IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p IS_NUMBER_INFINITY|5.007002||p IS_NUMBER_IN_UV|5.007002||p IS_NUMBER_NAN|5.007003||p IS_NUMBER_NEG|5.007002||p IS_NUMBER_NOT_INT|5.007002||p IVSIZE|5.006000||p IVTYPE|5.006000||p IVdf|5.006000||p LEAVE||| LINKLIST||5.013006| LVRET||| MARK||| MULTICALL||5.017004| MY_CXT_CLONE|5.009002||p MY_CXT_INIT|5.007003||p MY_CXT|5.007003||p MoveD|5.009002|5.004050|p Move||| NOOP|5.005000||p NUM2PTR|5.006000||p NVTYPE|5.006000||p NVef|5.006001||p NVff|5.006001||p NVgf|5.006001||p Newxc|5.009003||p Newxz|5.009003||p Newx|5.009003||p Nullav||| Nullch||| Nullcv||| Nullhv||| Nullsv||| OP_CLASS||5.013007| OP_DESC||5.007003| OP_NAME||5.007003| ORIGMARK||| PAD_BASE_SV||| PAD_CLONE_VARS||| PAD_COMPNAME_FLAGS||| PAD_COMPNAME_GEN_set||| PAD_COMPNAME_GEN||| PAD_COMPNAME_OURSTASH||| PAD_COMPNAME_PV||| PAD_COMPNAME_TYPE||| PAD_RESTORE_LOCAL||| PAD_SAVE_LOCAL||| PAD_SAVE_SETNULLPAD||| PAD_SETSV||| PAD_SET_CUR_NOSAVE||| PAD_SET_CUR||| PAD_SVl||| PAD_SV||| PERLIO_FUNCS_CAST|5.009003||p PERLIO_FUNCS_DECL|5.009003||p PERL_ABS|5.008001||p PERL_BCDVERSION|5.017004||p PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p PERL_HASH|5.004000||p PERL_INT_MAX|5.004000||p PERL_INT_MIN|5.004000||p PERL_LONG_MAX|5.004000||p PERL_LONG_MIN|5.004000||p PERL_MAGIC_arylen|5.007002||p PERL_MAGIC_backref|5.007002||p PERL_MAGIC_bm|5.007002||p PERL_MAGIC_collxfrm|5.007002||p PERL_MAGIC_dbfile|5.007002||p PERL_MAGIC_dbline|5.007002||p PERL_MAGIC_defelem|5.007002||p PERL_MAGIC_envelem|5.007002||p PERL_MAGIC_env|5.007002||p PERL_MAGIC_ext|5.007002||p PERL_MAGIC_fm|5.007002||p PERL_MAGIC_glob|5.017004||p PERL_MAGIC_isaelem|5.007002||p PERL_MAGIC_isa|5.007002||p PERL_MAGIC_mutex|5.017004||p PERL_MAGIC_nkeys|5.007002||p PERL_MAGIC_overload_elem|5.017004||p PERL_MAGIC_overload_table|5.007002||p PERL_MAGIC_overload|5.017004||p PERL_MAGIC_pos|5.007002||p PERL_MAGIC_qr|5.007002||p PERL_MAGIC_regdata|5.007002||p PERL_MAGIC_regdatum|5.007002||p PERL_MAGIC_regex_global|5.007002||p PERL_MAGIC_shared_scalar|5.007003||p PERL_MAGIC_shared|5.007003||p PERL_MAGIC_sigelem|5.007002||p PERL_MAGIC_sig|5.007002||p PERL_MAGIC_substr|5.007002||p PERL_MAGIC_sv|5.007002||p PERL_MAGIC_taint|5.007002||p PERL_MAGIC_tiedelem|5.007002||p PERL_MAGIC_tiedscalar|5.007002||p PERL_MAGIC_tied|5.007002||p PERL_MAGIC_utf8|5.008001||p PERL_MAGIC_uvar_elem|5.007003||p PERL_MAGIC_uvar|5.007002||p PERL_MAGIC_vec|5.007002||p PERL_MAGIC_vstring|5.008001||p PERL_PV_ESCAPE_ALL|5.009004||p PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p PERL_PV_ESCAPE_NOCLEAR|5.009004||p PERL_PV_ESCAPE_QUOTE|5.009004||p PERL_PV_ESCAPE_RE|5.009005||p PERL_PV_ESCAPE_UNI_DETECT|5.009004||p PERL_PV_ESCAPE_UNI|5.009004||p PERL_PV_PRETTY_DUMP|5.009004||p PERL_PV_PRETTY_ELLIPSES|5.010000||p PERL_PV_PRETTY_LTGT|5.009004||p PERL_PV_PRETTY_NOCLEAR|5.010000||p PERL_PV_PRETTY_QUOTE|5.009004||p PERL_PV_PRETTY_REGPROP|5.009004||p PERL_QUAD_MAX|5.004000||p PERL_QUAD_MIN|5.004000||p PERL_REVISION|5.006000||p PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p PERL_SCAN_DISALLOW_PREFIX|5.007003||p PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p PERL_SCAN_SILENT_ILLDIGIT|5.008001||p PERL_SHORT_MAX|5.004000||p PERL_SHORT_MIN|5.004000||p PERL_SIGNALS_UNSAFE_FLAG|5.008001||p PERL_SUBVERSION|5.006000||p PERL_SYS_INIT3||5.006000| PERL_SYS_INIT||| PERL_SYS_TERM||5.017004| PERL_UCHAR_MAX|5.004000||p PERL_UCHAR_MIN|5.004000||p PERL_UINT_MAX|5.004000||p PERL_UINT_MIN|5.004000||p PERL_ULONG_MAX|5.004000||p PERL_ULONG_MIN|5.004000||p PERL_UNUSED_ARG|5.009003||p PERL_UNUSED_CONTEXT|5.009004||p PERL_UNUSED_DECL|5.007002||p PERL_UNUSED_VAR|5.007002||p PERL_UQUAD_MAX|5.004000||p PERL_UQUAD_MIN|5.004000||p PERL_USE_GCC_BRACE_GROUPS|5.009004||p PERL_USHORT_MAX|5.004000||p PERL_USHORT_MIN|5.004000||p PERL_VERSION|5.006000||p PL_DBsignal|5.005000||p PL_DBsingle|||pn PL_DBsub|||pn PL_DBtrace|||pn PL_Sv|5.005000||p PL_bufend|5.017004||p PL_bufptr|5.017004||p PL_check||5.006000| PL_compiling|5.004050||p PL_comppad_name||5.017004| PL_comppad||5.008001| PL_copline|5.017004||p PL_curcop|5.004050||p PL_curpad||5.005000| PL_curstash|5.004050||p PL_debstash|5.004050||p PL_defgv|5.004050||p PL_diehook|5.004050||p PL_dirty|5.004050||p PL_dowarn|||pn PL_errgv|5.004050||p PL_error_count|5.017004||p PL_expect|5.017004||p PL_hexdigit|5.005000||p PL_hints|5.005000||p PL_in_my_stash|5.017004||p PL_in_my|5.017004||p PL_keyword_plugin||5.011002| PL_last_in_gv|||n PL_laststatval|5.005000||p PL_lex_state|5.017004||p PL_lex_stuff|5.017004||p PL_linestr|5.017004||p PL_modglobal||5.005000|n PL_na|5.004050||pn PL_no_modify|5.006000||p PL_ofsgv|||n PL_opfreehook||5.011000|n PL_parser|5.009005|5.009005|p PL_peepp||5.007003|n PL_perl_destruct_level|5.004050||p PL_perldb|5.004050||p PL_ppaddr|5.006000||p PL_rpeepp||5.013005|n PL_rsfp_filters|5.017004||p PL_rsfp|5.017004||p PL_rs|||n PL_signals|5.008001||p PL_stack_base|5.004050||p PL_stack_sp|5.004050||p PL_statcache|5.005000||p PL_stdingv|5.004050||p PL_sv_arenaroot|5.004050||p PL_sv_no|5.004050||pn PL_sv_undef|5.004050||pn PL_sv_yes|5.004050||pn PL_tainted|5.004050||p PL_tainting|5.004050||p PL_tokenbuf|5.017004||p POP_MULTICALL||5.017004| POPi|||n POPl|||n POPn|||n POPpbytex||5.007001|n POPpx||5.005030|n POPp|||n POPs|||n PTR2IV|5.006000||p PTR2NV|5.006000||p PTR2UV|5.006000||p PTR2nat|5.009003||p PTR2ul|5.007001||p PTRV|5.006000||p PUSHMARK||| PUSH_MULTICALL||5.017004| PUSHi||| PUSHmortal|5.009002||p PUSHn||| PUSHp||| PUSHs||| PUSHu|5.004000||p PUTBACK||| PadARRAY||5.017004| PadMAX||5.017004| PadlistARRAY||5.017004| PadlistMAX||5.017004| PadlistNAMESARRAY||5.017004| PadlistNAMESMAX||5.017004| PadlistNAMES||5.017004| PadlistREFCNT||5.017004| PadnameIsOUR||| PadnameIsSTATE||| PadnameLEN||5.017004| PadnameOURSTASH||| PadnameOUTER||| PadnamePV||5.017004| PadnameSV||5.017004| PadnameTYPE||| PadnameUTF8||5.017004| PadnamelistARRAY||5.017004| PadnamelistMAX||5.017004| PerlIO_clearerr||5.007003| PerlIO_close||5.007003| PerlIO_context_layers||5.009004| PerlIO_eof||5.007003| PerlIO_error||5.007003| PerlIO_fileno||5.007003| PerlIO_fill||5.007003| PerlIO_flush||5.007003| PerlIO_get_base||5.007003| PerlIO_get_bufsiz||5.007003| PerlIO_get_cnt||5.007003| PerlIO_get_ptr||5.007003| PerlIO_read||5.007003| PerlIO_seek||5.007003| PerlIO_set_cnt||5.007003| PerlIO_set_ptrcnt||5.007003| PerlIO_setlinebuf||5.007003| PerlIO_stderr||5.007003| PerlIO_stdin||5.007003| PerlIO_stdout||5.007003| PerlIO_tell||5.007003| PerlIO_unread||5.007003| PerlIO_write||5.007003| Perl_signbit||5.009005|n PoisonFree|5.009004||p PoisonNew|5.009004||p PoisonWith|5.009004||p Poison|5.008000||p RETVAL|||n Renewc||| Renew||| SAVECLEARSV||| SAVECOMPPAD||| SAVEPADSV||| SAVETMPS||| SAVE_DEFSV|5.004050||p SPAGAIN||| SP||| START_EXTERN_C|5.005000||p START_MY_CXT|5.007003||p STMT_END|||p STMT_START|||p STR_WITH_LEN|5.009003||p ST||| SV_CONST_RETURN|5.009003||p SV_COW_DROP_PV|5.008001||p SV_COW_SHARED_HASH_KEYS|5.009005||p SV_GMAGIC|5.007002||p SV_HAS_TRAILING_NUL|5.009004||p SV_IMMEDIATE_UNREF|5.007001||p SV_MUTABLE_RETURN|5.009003||p SV_NOSTEAL|5.009002||p SV_SMAGIC|5.009003||p SV_UTF8_NO_ENCODING|5.008001||p SVfARG|5.009005||p SVf_UTF8|5.006000||p SVf|5.006000||p SVt_IV||| SVt_NV||| SVt_PVAV||| SVt_PVCV||| SVt_PVHV||| SVt_PVMG||| SVt_PV||| Safefree||| Slab_Alloc||| Slab_Free||| Slab_to_ro||| Slab_to_rw||| StructCopy||| SvCUR_set||| SvCUR||| SvEND||| SvGAMAGIC||5.006001| SvGETMAGIC|5.004050||p SvGROW||| SvIOK_UV||5.006000| SvIOK_notUV||5.006000| SvIOK_off||| SvIOK_only_UV||5.006000| SvIOK_only||| SvIOK_on||| SvIOKp||| SvIOK||| SvIVX||| SvIV_nomg|5.009001||p SvIV_set||| SvIVx||| SvIV||| SvIsCOW_shared_hash||5.008003| SvIsCOW||5.008003| SvLEN_set||| SvLEN||| SvLOCK||5.007003| SvMAGIC_set|5.009003||p SvNIOK_off||| SvNIOKp||| SvNIOK||| SvNOK_off||| SvNOK_only||| SvNOK_on||| SvNOKp||| SvNOK||| SvNVX||| SvNV_nomg||5.013002| SvNV_set||| SvNVx||| SvNV||| SvOK||| SvOOK_offset||5.011000| SvOOK||| SvPOK_off||| SvPOK_only_UTF8||5.006000| SvPOK_only||| SvPOK_on||| SvPOKp||| SvPOK||| SvPVX_const|5.009003||p SvPVX_mutable|5.009003||p SvPVX||| SvPV_const|5.009003||p SvPV_flags_const_nolen|5.009003||p SvPV_flags_const|5.009003||p SvPV_flags_mutable|5.009003||p SvPV_flags|5.007002||p SvPV_force_flags_mutable|5.009003||p SvPV_force_flags_nolen|5.009003||p SvPV_force_flags|5.007002||p SvPV_force_mutable|5.009003||p SvPV_force_nolen|5.009003||p SvPV_force_nomg_nolen|5.009003||p SvPV_force_nomg|5.007002||p SvPV_force|||p SvPV_mutable|5.009003||p SvPV_nolen_const|5.009003||p SvPV_nolen|5.006000||p SvPV_nomg_const_nolen|5.009003||p SvPV_nomg_const|5.009003||p SvPV_nomg_nolen|5.013007|5.013007|p SvPV_nomg|5.007002||p SvPV_renew|5.009003||p SvPV_set||| SvPVbyte_force||5.009002| SvPVbyte_nolen||5.006000| SvPVbytex_force||5.006000| SvPVbytex||5.006000| SvPVbyte|5.006000||p SvPVutf8_force||5.006000| SvPVutf8_nolen||5.006000| SvPVutf8x_force||5.006000| SvPVutf8x||5.006000| SvPVutf8||5.006000| SvPVx||| SvPV||| SvREFCNT_dec||| SvREFCNT_inc_NN|5.009004||p SvREFCNT_inc_simple_NN|5.009004||p SvREFCNT_inc_simple_void_NN|5.009004||p SvREFCNT_inc_simple_void|5.009004||p SvREFCNT_inc_simple|5.009004||p SvREFCNT_inc_void_NN|5.009004||p SvREFCNT_inc_void|5.009004||p SvREFCNT_inc|||p SvREFCNT||| SvROK_off||| SvROK_on||| SvROK||| SvRV_set|5.009003||p SvRV||| SvRXOK||5.009005| SvRX||5.009005| SvSETMAGIC||| SvSHARED_HASH|5.009003||p SvSHARE||5.007003| SvSTASH_set|5.009003||p SvSTASH||| SvSetMagicSV_nosteal||5.004000| SvSetMagicSV||5.004000| SvSetSV_nosteal||5.004000| SvSetSV||| SvTAINTED_off||5.004000| SvTAINTED_on||5.004000| SvTAINTED||5.004000| SvTAINT||| SvTHINKFIRST||| SvTRUE_nomg||5.013006| SvTRUE||| SvTYPE||| SvUNLOCK||5.007003| SvUOK|5.007001|5.006000|p SvUPGRADE||| SvUTF8_off||5.006000| SvUTF8_on||5.006000| SvUTF8||5.006000| SvUVXx|5.004000||p SvUVX|5.004000||p SvUV_nomg|5.009001||p SvUV_set|5.009003||p SvUVx|5.004000||p SvUV|5.004000||p SvVOK||5.008001| SvVSTRING_mg|5.009004||p THIS|||n UNDERBAR|5.009002||p UTF8_MAXBYTES|5.009002||p UVSIZE|5.006000||p UVTYPE|5.006000||p UVXf|5.007001||p UVof|5.006000||p UVuf|5.006000||p UVxf|5.006000||p WARN_ALL|5.006000||p WARN_AMBIGUOUS|5.006000||p WARN_ASSERTIONS|5.017004||p WARN_BAREWORD|5.006000||p WARN_CLOSED|5.006000||p WARN_CLOSURE|5.006000||p WARN_DEBUGGING|5.006000||p WARN_DEPRECATED|5.006000||p WARN_DIGIT|5.006000||p WARN_EXEC|5.006000||p WARN_EXITING|5.006000||p WARN_GLOB|5.006000||p WARN_INPLACE|5.006000||p WARN_INTERNAL|5.006000||p WARN_IO|5.006000||p WARN_LAYER|5.008000||p WARN_MALLOC|5.006000||p WARN_MISC|5.006000||p WARN_NEWLINE|5.006000||p WARN_NUMERIC|5.006000||p WARN_ONCE|5.006000||p WARN_OVERFLOW|5.006000||p WARN_PACK|5.006000||p WARN_PARENTHESIS|5.006000||p WARN_PIPE|5.006000||p WARN_PORTABLE|5.006000||p WARN_PRECEDENCE|5.006000||p WARN_PRINTF|5.006000||p WARN_PROTOTYPE|5.006000||p WARN_QW|5.006000||p WARN_RECURSION|5.006000||p WARN_REDEFINE|5.006000||p WARN_REGEXP|5.006000||p WARN_RESERVED|5.006000||p WARN_SEMICOLON|5.006000||p WARN_SEVERE|5.006000||p WARN_SIGNAL|5.006000||p WARN_SUBSTR|5.006000||p WARN_SYNTAX|5.006000||p WARN_TAINT|5.006000||p WARN_THREADS|5.008000||p WARN_UNINITIALIZED|5.006000||p WARN_UNOPENED|5.006000||p WARN_UNPACK|5.006000||p WARN_UNTIE|5.006000||p WARN_UTF8|5.006000||p WARN_VOID|5.006000||p XCPT_CATCH|5.009002||p XCPT_RETHROW|5.009002||p XCPT_TRY_END|5.009002||p XCPT_TRY_START|5.009002||p XPUSHi||| XPUSHmortal|5.009002||p XPUSHn||| XPUSHp||| XPUSHs||| XPUSHu|5.004000||p XSPROTO|5.010000||p XSRETURN_EMPTY||| XSRETURN_IV||| XSRETURN_NO||| XSRETURN_NV||| XSRETURN_PV||| XSRETURN_UNDEF||| XSRETURN_UV|5.008001||p XSRETURN_YES||| XSRETURN|||p XST_mIV||| XST_mNO||| XST_mNV||| XST_mPV||| XST_mUNDEF||| XST_mUV|5.008001||p XST_mYES||| XS_APIVERSION_BOOTCHECK||5.013004| XS_EXTERNAL||5.017004| XS_INTERNAL||5.017004| XS_VERSION_BOOTCHECK||| XS_VERSION||| XSprePUSH|5.006000||p XS||| XopDISABLE||5.017004| XopENABLE||5.017004| XopENTRY_set||5.017004| XopENTRY||5.017004| XopFLAGS||5.013007| ZeroD|5.009002||p Zero||| _aMY_CXT|5.007003||p _add_range_to_invlist||| _append_range_to_invlist||| _core_swash_init||| _get_swash_invlist||| _invlist_array_init||| _invlist_contains_cp||| _invlist_contents||| _invlist_intersection_maybe_complement_2nd||| _invlist_intersection||| _invlist_invert_prop||| _invlist_invert||| _invlist_populate_swatch||| _invlist_search||| _invlist_subtract||| _invlist_union_maybe_complement_2nd||| _invlist_union||| _is_swash_user_defined||| _is_utf8__perl_idstart||| _is_utf8_quotemeta||| _new_invlist_C_array||| _new_invlist||| _pMY_CXT|5.007003||p _swash_inversion_hash||| _swash_to_invlist||| _to_fold_latin1||| _to_uni_fold_flags||5.013011| _to_upper_title_latin1||| _to_utf8_fold_flags||5.015006| _to_utf8_lower_flags||5.015006| _to_utf8_title_flags||5.015006| _to_utf8_upper_flags||5.015006| aMY_CXT_|5.007003||p aMY_CXT|5.007003||p aTHXR_|5.017004||p aTHXR|5.017004||p aTHX_|5.006000||p aTHX|5.006000||p aassign_common_vars||| add_alternate||| add_cp_to_invlist||| add_data|||n add_utf16_textfilter||| addmad||| adjust_stack_on_leave||| alloc_maybe_populate_EXACT||| alloccopstash||| allocmy||| amagic_call||| amagic_cmp_locale||| amagic_cmp||| amagic_deref_call||5.013007| amagic_i_ncmp||| amagic_is_enabled||| amagic_ncmp||| anonymise_cv_maybe||| any_dup||| ao||| append_madprops||| apply_attrs_my||| apply_attrs_string||5.006001| apply_attrs||| apply||| assert_uft8_cache_coherent||| atfork_lock||5.007003|n atfork_unlock||5.007003|n av_arylen_p||5.009003| av_clear||| av_create_and_push||5.009005| av_create_and_unshift_one||5.009005| av_delete||5.006000| av_exists||5.006000| av_extend_guts||| av_extend||| av_fetch||| av_fill||| av_iter_p||5.011000| av_len||| av_make||| av_pop||| av_push||| av_reify||| av_shift||| av_store||| av_undef||| av_unshift||| ax|||n bad_type_pv||| bad_type_sv||| bind_match||| block_end||| block_gimme||5.004000| block_start||| blockhook_register||5.013003| boolSV|5.004000||p boot_core_PerlIO||| boot_core_UNIVERSAL||| boot_core_mro||| bytes_cmp_utf8||5.013007| bytes_from_utf8||5.007001| bytes_to_uni|||n bytes_to_utf8||5.006001| call_argv|5.006000||p call_atexit||5.006000| call_list||5.004000| call_method|5.006000||p call_pv|5.006000||p call_sv|5.006000||p caller_cx||5.013005| calloc||5.007002|n cando||| cast_i32||5.006000| cast_iv||5.006000| cast_ulong||5.006000| cast_uv||5.006000| check_locale_boundary_crossing||| check_type_and_open||| check_uni||| check_utf8_print||| checkcomma||| checkposixcc||| ckWARN|5.006000||p ck_entersub_args_core||| ck_entersub_args_list||5.013006| ck_entersub_args_proto_or_list||5.013006| ck_entersub_args_proto||5.013006| ck_warner_d||5.011001|v ck_warner||5.011001|v ckwarn_common||| ckwarn_d||5.009003| ckwarn||5.009003| cl_and|||n cl_anything|||n cl_init|||n cl_is_anything|||n cl_or|||n clear_placeholders||| clone_params_del|||n clone_params_new|||n closest_cop||| compute_EXACTish||| convert||| cop_fetch_label||5.015001| cop_free||| cop_hints_2hv||5.013007| cop_hints_fetch_pvn||5.013007| cop_hints_fetch_pvs||5.013007| cop_hints_fetch_pv||5.013007| cop_hints_fetch_sv||5.013007| cop_store_label||5.015001| cophh_2hv||5.013007| cophh_copy||5.013007| cophh_delete_pvn||5.013007| cophh_delete_pvs||5.013007| cophh_delete_pv||5.013007| cophh_delete_sv||5.013007| cophh_fetch_pvn||5.013007| cophh_fetch_pvs||5.013007| cophh_fetch_pv||5.013007| cophh_fetch_sv||5.013007| cophh_free||5.013007| cophh_new_empty||5.017004| cophh_store_pvn||5.013007| cophh_store_pvs||5.013007| cophh_store_pv||5.013007| cophh_store_sv||5.013007| core_prototype||| core_regclass_swash||| coresub_op||| cr_textfilter||| create_eval_scope||| croak_no_modify||5.013003| croak_nocontext|||vn croak_sv||5.013001| croak_xs_usage||5.010001| croak|||v csighandler||5.009003|n curmad||| current_re_engine||| curse||| custom_op_desc||5.007003| custom_op_name||5.007003| custom_op_register||5.013007| custom_op_xop||5.013007| cv_ckproto_len_flags||| cv_clone||| cv_const_sv||5.004000| cv_dump||| cv_forget_slab||| cv_get_call_checker||5.013006| cv_set_call_checker||5.013006| cv_undef||| cvgv_set||| cvstash_set||| cx_dump||5.005000| cx_dup||| cxinc||| dAXMARK|5.009003||p dAX|5.007002||p dITEMS|5.007002||p dMARK||| dMULTICALL||5.009003| dMY_CXT_SV|5.007003||p dMY_CXT|5.007003||p dNOOP|5.006000||p dORIGMARK||| dSP||| dTHR|5.004050||p dTHXR|5.017004||p dTHXa|5.006000||p dTHXoa|5.006000||p dTHX|5.006000||p dUNDERBAR|5.009002||p dVAR|5.009003||p dXCPT|5.009002||p dXSARGS||| dXSI32||| dXSTARG|5.006000||p deb_curcv||| deb_nocontext|||vn deb_stack_all||| deb_stack_n||| debop||5.005000| debprofdump||5.005000| debprof||| debstackptrs||5.007003| debstack||5.007003| debug_start_match||| deb||5.007003|v del_sv||| delete_eval_scope||| delimcpy||5.004000|n deprecate_commaless_var_list||| despatch_signals||5.007001| destroy_matcher||| die_nocontext|||vn die_sv||5.013001| die_unwind||| die|||v dirp_dup||| div128||| djSP||| do_aexec5||| do_aexec||| do_aspawn||| do_binmode||5.004050| do_chomp||| do_close||| do_delete_local||| do_dump_pad||| do_eof||| do_exec3||| do_execfree||| do_exec||| do_gv_dump||5.006000| do_gvgv_dump||5.006000| do_hv_dump||5.006000| do_ipcctl||| do_ipcget||| do_join||| do_magic_dump||5.006000| do_msgrcv||| do_msgsnd||| do_ncmp||| do_oddball||| do_op_dump||5.006000| do_op_xmldump||| do_open9||5.006000| do_openn||5.007001| do_open||5.004000| do_pmop_dump||5.006000| do_pmop_xmldump||| do_print||| do_readline||| do_seek||| do_semop||| do_shmio||| do_smartmatch||| do_spawn_nowait||| do_spawn||| do_sprintf||| do_sv_dump||5.006000| do_sysseek||| do_tell||| do_trans_complex_utf8||| do_trans_complex||| do_trans_count_utf8||| do_trans_count||| do_trans_simple_utf8||| do_trans_simple||| do_trans||| do_vecget||| do_vecset||| do_vop||| docatch||| doeval||| dofile||| dofindlabel||| doform||| doing_taint||5.008001|n dooneliner||| doopen_pm||| doparseform||| dopoptoeval||| dopoptogiven||| dopoptolabel||| dopoptoloop||| dopoptosub_at||| dopoptowhen||| doref||5.009003| dounwind||| dowantarray||| dump_all_perl||| dump_all||5.006000| dump_eval||5.006000| dump_exec_pos||| dump_fds||| dump_form||5.006000| dump_indent||5.006000|v dump_mstats||| dump_packsubs_perl||| dump_packsubs||5.006000| dump_sub_perl||| dump_sub||5.006000| dump_sv_child||| dump_trie_interim_list||| dump_trie_interim_table||| dump_trie||| dump_vindent||5.006000| dumpuntil||| dup_attrlist||| emulate_cop_io||| eval_pv|5.006000||p eval_sv|5.006000||p exec_failed||| expect_number||| fbm_compile||5.005000| fbm_instr||5.005000| feature_is_enabled||| filter_add||| filter_del||| filter_gets||| filter_read||| finalize_optree||| finalize_op||| find_and_forget_pmops||| find_array_subscript||| find_beginning||| find_byclass||| find_hash_subscript||| find_in_my_stash||| find_runcv_where||| find_runcv||5.008001| find_rundefsv2||| find_rundefsvoffset||5.009002| find_rundefsv||5.013002| find_script||| find_uninit_var||| first_symbol|||n foldEQ_latin1||5.013008|n foldEQ_locale||5.013002|n foldEQ_utf8_flags||5.013010| foldEQ_utf8||5.013002| foldEQ||5.013002|n fold_constants||| forbid_setid||| force_ident||| force_list||| force_next||| force_strict_version||| force_version||| force_word||| forget_pmop||| form_nocontext|||vn form||5.004000|v fp_dup||| fprintf_nocontext|||vn free_global_struct||| free_tied_hv_pool||| free_tmps||| gen_constant_list||| get_aux_mg||| get_av|5.006000||p get_context||5.006000|n get_cvn_flags|5.009005||p get_cvs|5.011000||p get_cv|5.006000||p get_db_sub||| get_debug_opts||| get_hash_seed||| get_hv|5.006000||p get_invlist_iter_addr||| get_invlist_len_addr||| get_invlist_version_id_addr||| get_invlist_zero_addr||| get_mstats||| get_no_modify||| get_num||| get_op_descs||5.005000| get_op_names||5.005000| get_opargs||| get_ppaddr||5.006000| get_re_arg||| get_sv|5.006000||p get_vtbl||5.005030| getcwd_sv||5.007002| getenv_len||| glob_2number||| glob_assign_glob||| glob_assign_ref||| gp_dup||| gp_free||| gp_ref||| grok_bin|5.007003||p grok_bslash_N||| grok_bslash_c||| grok_bslash_o||| grok_bslash_x||| grok_hex|5.007003||p grok_number|5.007002||p grok_numeric_radix|5.007002||p grok_oct|5.007003||p group_end||| gv_AVadd||| gv_HVadd||| gv_IOadd||| gv_SVadd||| gv_add_by_type||5.011000| gv_autoload4||5.004000| gv_autoload_pvn||5.015004| gv_autoload_pv||5.015004| gv_autoload_sv||5.015004| gv_check||| gv_const_sv||5.009003| gv_dump||5.006000| gv_efullname3||5.004000| gv_efullname4||5.006001| gv_efullname||| gv_ename||| gv_fetchfile_flags||5.009005| gv_fetchfile||| gv_fetchmeth_autoload||5.007003| gv_fetchmeth_pv_autoload||5.015004| gv_fetchmeth_pvn_autoload||5.015004| gv_fetchmeth_pvn||5.015004| gv_fetchmeth_pv||5.015004| gv_fetchmeth_sv_autoload||5.015004| gv_fetchmeth_sv||5.015004| gv_fetchmethod_autoload||5.004000| gv_fetchmethod_pv_flags||5.015004| gv_fetchmethod_pvn_flags||5.015004| gv_fetchmethod_sv_flags||5.015004| gv_fetchmethod||| gv_fetchmeth||| gv_fetchpvn_flags|5.009002||p gv_fetchpvs|5.009004||p gv_fetchpv||| gv_fetchsv|5.009002||p gv_fullname3||5.004000| gv_fullname4||5.006001| gv_fullname||| gv_get_super_pkg||| gv_handler||5.007001| gv_init_pvn||5.015004| gv_init_pv||5.015004| gv_init_svtype||| gv_init_sv||5.015004| gv_init||| gv_magicalize_isa||| gv_name_set||5.009004| gv_stashpvn|5.004000||p gv_stashpvs|5.009003||p gv_stashpv||| gv_stashsv||| gv_try_downgrade||| he_dup||| hek_dup||| hfree_next_entry||| hfreeentries||| hsplit||| hv_assert||| hv_auxinit|||n hv_backreferences_p||| hv_clear_placeholders||5.009001| hv_clear||| hv_common_key_len||5.010000| hv_common||5.010000| hv_copy_hints_hv||5.009004| hv_delayfree_ent||5.004000| hv_delete_common||| hv_delete_ent||5.004000| hv_delete||| hv_eiter_p||5.009003| hv_eiter_set||5.009003| hv_ename_add||| hv_ename_delete||| hv_exists_ent||5.004000| hv_exists||| hv_fetch_ent||5.004000| hv_fetchs|5.009003||p hv_fetch||| hv_fill||5.013002| hv_free_ent_ret||| hv_free_ent||5.004000| hv_iterinit||| hv_iterkeysv||5.004000| hv_iterkey||| hv_iternext_flags||5.008000| hv_iternextsv||| hv_iternext||| hv_iterval||| hv_kill_backrefs||| hv_ksplit||5.004000| hv_magic_check|||n hv_magic||| hv_name_set||5.009003| hv_notallowed||| hv_placeholders_get||5.009003| hv_placeholders_p||5.009003| hv_placeholders_set||5.009003| hv_riter_p||5.009003| hv_riter_set||5.009003| hv_scalar||5.009001| hv_store_ent||5.004000| hv_store_flags||5.008000| hv_stores|5.009004||p hv_store||| hv_undef_flags||| hv_undef||| ibcmp_locale||5.004000| ibcmp_utf8||5.007003| ibcmp||| incline||| incpush_if_exists||| incpush_use_sep||| incpush||| ingroup||| init_argv_symbols||| init_constants||| init_dbargs||| init_debugger||| init_global_struct||| init_i18nl10n||5.006000| init_i18nl14n||5.006000| init_ids||| init_interp||| init_main_stash||| init_perllib||| init_postdump_symbols||| init_predump_symbols||| init_stacks||5.005000| init_tm||5.007002| inplace_aassign||| instr|||n intro_my||| intuit_method||| intuit_more||| invert||| invlist_array||| invlist_clone||| invlist_extend||| invlist_highest||| invlist_iterinit||| invlist_iternext||| invlist_len||| invlist_max||| invlist_set_len||| invlist_trim||| invoke_exception_hook||| io_close||| isALNUMC|5.006000||p isALPHA||| isASCII|5.006000||p isBLANK|5.006001||p isCNTRL|5.006000||p isDIGIT||| isGRAPH|5.006000||p isGV_with_GP|5.009004||p isLOWER||| isOCTAL||5.013005| isPRINT|5.004000||p isPSXSPC|5.006001||p isPUNCT|5.006000||p isSPACE||| isUPPER||| isWORDCHAR||5.013006| isXDIGIT|5.006000||p is_an_int||| is_ascii_string||5.011000|n is_handle_constructor|||n is_list_assignment||| is_lvalue_sub||5.007001| is_uni_alnum_lc||5.006000| is_uni_alnum||5.006000| is_uni_alpha_lc||5.006000| is_uni_alpha||5.006000| is_uni_ascii_lc||5.006000| is_uni_ascii||5.006000| is_uni_blank||5.017002| is_uni_cntrl_lc||5.006000| is_uni_cntrl||5.006000| is_uni_digit_lc||5.006000| is_uni_digit||5.006000| is_uni_graph_lc||5.006000| is_uni_graph||5.006000| is_uni_idfirst_lc||5.006000| is_uni_idfirst||5.006000| is_uni_lower_lc||5.006000| is_uni_lower||5.006000| is_uni_print_lc||5.006000| is_uni_print||5.006000| is_uni_punct_lc||5.006000| is_uni_punct||5.006000| is_uni_space_lc||5.006000| is_uni_space||5.006000| is_uni_upper_lc||5.006000| is_uni_upper||5.006000| is_uni_xdigit_lc||5.006000| is_uni_xdigit||5.006000| is_utf8_X_LVT||| is_utf8_X_LV_LVT_V||| is_utf8_X_LV||| is_utf8_X_L||| is_utf8_X_T||| is_utf8_X_V||| is_utf8_X_begin||| is_utf8_X_extend||| is_utf8_X_non_hangul||| is_utf8_X_prepend||| is_utf8_alnum||5.006000| is_utf8_alpha||5.006000| is_utf8_ascii||5.006000| is_utf8_blank||5.017002| is_utf8_char_buf||5.015008|n is_utf8_char_slow|||n is_utf8_char||5.006000|n is_utf8_cntrl||5.006000| is_utf8_common||| is_utf8_digit||5.006000| is_utf8_graph||5.006000| is_utf8_idcont||5.008000| is_utf8_idfirst||5.006000| is_utf8_lower||5.006000| is_utf8_mark||5.006000| is_utf8_perl_space||5.011001| is_utf8_perl_word||5.011001| is_utf8_posix_digit||5.011001| is_utf8_print||5.006000| is_utf8_punct||5.006000| is_utf8_space||5.006000| is_utf8_string_loclen||5.009003|n is_utf8_string_loc||5.008001|n is_utf8_string||5.006001|n is_utf8_upper||5.006000| is_utf8_xdigit||5.006000| is_utf8_xidcont||5.013010| is_utf8_xidfirst||5.013010| isa_lookup||| items|||n ix|||n jmaybe||| join_exact||| keyword_plugin_standard||| keyword||| leave_scope||| lex_bufutf8||5.011002| lex_discard_to||5.011002| lex_grow_linestr||5.011002| lex_next_chunk||5.011002| lex_peek_unichar||5.011002| lex_read_space||5.011002| lex_read_to||5.011002| lex_read_unichar||5.011002| lex_start||5.009005| lex_stuff_pvn||5.011002| lex_stuff_pvs||5.013005| lex_stuff_pv||5.013006| lex_stuff_sv||5.011002| lex_unstuff||5.011002| listkids||| list||| load_module_nocontext|||vn load_module|5.006000||pv localize||| looks_like_bool||| looks_like_number||| lop||| mPUSHi|5.009002||p mPUSHn|5.009002||p mPUSHp|5.009002||p mPUSHs|5.010001||p mPUSHu|5.009002||p mXPUSHi|5.009002||p mXPUSHn|5.009002||p mXPUSHp|5.009002||p mXPUSHs|5.010001||p mXPUSHu|5.009002||p mad_free||| madlex||| madparse||| magic_clear_all_env||| magic_cleararylen_p||| magic_clearenv||| magic_clearhints||| magic_clearhint||| magic_clearisa||| magic_clearpack||| magic_clearsig||| magic_copycallchecker||| magic_dump||5.006000| magic_existspack||| magic_freearylen_p||| magic_freeovrld||| magic_getarylen||| magic_getdefelem||| magic_getnkeys||| magic_getpack||| magic_getpos||| magic_getsig||| magic_getsubstr||| magic_gettaint||| magic_getuvar||| magic_getvec||| magic_get||| magic_killbackrefs||| magic_len||| magic_methcall1||| magic_methcall|||v magic_methpack||| magic_nextpack||| magic_regdata_cnt||| magic_regdatum_get||| magic_regdatum_set||| magic_scalarpack||| magic_set_all_env||| magic_setarylen||| magic_setcollxfrm||| magic_setdbline||| magic_setdefelem||| magic_setenv||| magic_sethint||| magic_setisa||| magic_setmglob||| magic_setnkeys||| magic_setpack||| magic_setpos||| magic_setregexp||| magic_setsig||| magic_setsubstr||| magic_settaint||| magic_setutf8||| magic_setuvar||| magic_setvec||| magic_set||| magic_sizepack||| magic_wipepack||| make_matcher||| make_trie_failtable||| make_trie||| malloc_good_size|||n malloced_size|||n malloc||5.007002|n markstack_grow||| matcher_matches_sv||| mayberelocate||| measure_struct||| memEQs|5.009005||p memEQ|5.004000||p memNEs|5.009005||p memNE|5.004000||p mem_collxfrm||| mem_log_common|||n mess_alloc||| mess_nocontext|||vn mess_sv||5.013001| mess||5.006000|v method_common||| mfree||5.007002|n mg_clear||| mg_copy||| mg_dup||| mg_findext||5.013008| mg_find||| mg_free_type||5.013006| mg_free||| mg_get||| mg_length||5.005000| mg_localize||| mg_magical||| mg_set||| mg_size||5.005000| mini_mktime||5.007002| minus_v||| missingterm||| mode_from_discipline||| modkids||| more_bodies||| more_sv||| moreswitches||| mro_clean_isarev||| mro_gather_and_rename||| mro_get_from_name||5.010001| mro_get_linear_isa_dfs||| mro_get_linear_isa||5.009005| mro_get_private_data||5.010001| mro_isa_changed_in||| mro_meta_dup||| mro_meta_init||| mro_method_changed_in||5.009005| mro_package_moved||| mro_register||5.010001| mro_set_mro||5.010001| mro_set_private_data||5.010001| mul128||| mulexp10|||n my_atof2||5.007002| my_atof||5.006000| my_attrs||| my_bcopy|||n my_betoh16|||n my_betoh32|||n my_betoh64|||n my_betohi|||n my_betohl|||n my_betohs|||n my_bzero|||n my_chsize||| my_clearenv||| my_cxt_index||| my_cxt_init||| my_dirfd||5.009005| my_exit_jump||| my_exit||| my_failure_exit||5.004000| my_fflush_all||5.006000| my_fork||5.007003|n my_htobe16|||n my_htobe32|||n my_htobe64|||n my_htobei|||n my_htobel|||n my_htobes|||n my_htole16|||n my_htole32|||n my_htole64|||n my_htolei|||n my_htolel|||n my_htoles|||n my_htonl||| my_kid||| my_letoh16|||n my_letoh32|||n my_letoh64|||n my_letohi|||n my_letohl|||n my_letohs|||n my_lstat_flags||| my_lstat||5.017004| my_memcmp|||n my_memset||5.004000|n my_ntohl||| my_pclose||5.004000| my_popen_list||5.007001| my_popen||5.004000| my_setenv||| my_snprintf|5.009004||pvn my_socketpair||5.007003|n my_sprintf|5.009003||pvn my_stat_flags||| my_stat||5.017004| my_strftime||5.007002| my_strlcat|5.009004||pn my_strlcpy|5.009004||pn my_swabn|||n my_swap||| my_unexec||| my_vsnprintf||5.009004|n need_utf8|||n newANONATTRSUB||5.006000| newANONHASH||| newANONLIST||| newANONSUB||| newASSIGNOP||| newATTRSUB_flags||| newATTRSUB||5.006000| newAVREF||| newAV||| newBINOP||| newCONDOP||| newCONSTSUB_flags||5.015006| newCONSTSUB|5.004050||p newCVREF||| newDEFSVOP||| newFORM||| newFOROP||5.013007| newGIVENOP||5.009003| newGIVWHENOP||| newGP||| newGVOP||| newGVREF||| newGVgen_flags||5.015004| newGVgen||| newHVREF||| newHVhv||5.005000| newHV||| newIO||| newLISTOP||| newLOGOP||| newLOOPEX||| newLOOPOP||| newMADPROP||| newMADsv||| newMYSUB||| newNULLLIST||| newOP||| newPADOP||| newPMOP||| newPROG||| newPVOP||| newRANGE||| newRV_inc|5.004000||p newRV_noinc|5.004000||p newRV||| newSLICEOP||| newSTATEOP||| newSTUB||| newSUB||| newSVOP||| newSVREF||| newSV_type|5.009005||p newSVhek||5.009003| newSViv||| newSVnv||| newSVpadname||5.017004| newSVpv_share||5.013006| newSVpvf_nocontext|||vn newSVpvf||5.004000|v newSVpvn_flags|5.010001||p newSVpvn_share|5.007001||p newSVpvn_utf8|5.010001||p newSVpvn|5.004050||p newSVpvs_flags|5.010001||p newSVpvs_share|5.009003||p newSVpvs|5.009003||p newSVpv||| newSVrv||| newSVsv||| newSVuv|5.006000||p newSV||| newTOKEN||| newUNOP||| newWHENOP||5.009003| newWHILEOP||5.013007| newXS_flags||5.009004| newXS_len_flags||| newXSproto||5.006000| newXS||5.006000| new_collate||5.006000| new_constant||| new_ctype||5.006000| new_he||| new_logop||| new_numeric||5.006000| new_stackinfo||5.005000| new_version||5.009000| new_warnings_bitfield||| next_symbol||| nextargv||| nextchar||| ninstr|||n no_bareword_allowed||| no_fh_allowed||| no_op||| not_a_number||| nothreadhook||5.008000| nuke_stacks||| num_overflow|||n oopsAV||| oopsHV||| op_append_elem||5.013006| op_append_list||5.013006| op_clear||| op_const_sv||| op_contextualize||5.013006| op_dump||5.006000| op_free||| op_getmad_weak||| op_getmad||| op_integerize||| op_linklist||5.013006| op_lvalue_flags||| op_lvalue||5.013007| op_null||5.007002| op_prepend_elem||5.013006| op_refcnt_dec||| op_refcnt_inc||| op_refcnt_lock||5.009002| op_refcnt_unlock||5.009002| op_scope||5.013007| op_std_init||| op_unscope||| op_xmldump||| open_script||| opslab_force_free||| opslab_free_nopad||| opslab_free||| opt_scalarhv||| pMY_CXT_|5.007003||p pMY_CXT|5.007003||p pTHX_|5.006000||p pTHX|5.006000||p packWARN|5.007003||p pack_cat||5.007003| pack_rec||| package_version||| package||| packlist||5.008001| pad_add_anon||5.008001| pad_add_name_pvn||5.015001| pad_add_name_pvs||5.015001| pad_add_name_pv||5.015001| pad_add_name_sv||5.015001| pad_alloc_name||| pad_alloc||| pad_block_start||| pad_check_dup||| pad_compname_type||5.009003| pad_findlex||| pad_findmy_pvn||5.015001| pad_findmy_pvs||5.015001| pad_findmy_pv||5.015001| pad_findmy_sv||5.015001| pad_fixup_inner_anons||| pad_free||| pad_leavemy||| pad_new||5.008001| pad_peg|||n pad_push||| pad_reset||| pad_setsv||| pad_sv||| pad_swipe||| pad_tidy||5.008001| padlist_dup||| padlist_store||| parse_arithexpr||5.013008| parse_barestmt||5.013007| parse_block||5.013007| parse_body||| parse_fullexpr||5.013008| parse_fullstmt||5.013005| parse_label||5.013007| parse_listexpr||5.013008| parse_stmtseq||5.013006| parse_termexpr||5.013008| parse_unicode_opts||| parser_dup||| parser_free||| path_is_absolute|||n peep||| perl_alloc_using|||n perl_alloc|||n perl_clone_using|||n perl_clone|||n perl_construct|||n perl_destruct||5.007003|n perl_free|||n perl_parse||5.006000|n perl_run|||n pidgone||| pm_description||| pmop_dump||5.006000| pmop_xmldump||| pmruntime||| pmtrans||| pop_scope||| populate_isa|||v pregcomp||5.009005| pregexec||| pregfree2||5.011000| pregfree||| prepend_madprops||| prescan_version||5.011004| printbuf||| printf_nocontext|||vn process_special_blocks||| ptr_table_clear||5.009005| ptr_table_fetch||5.009005| ptr_table_find|||n ptr_table_free||5.009005| ptr_table_new||5.009005| ptr_table_split||5.009005| ptr_table_store||5.009005| push_scope||| put_byte||| pv_display|5.006000||p pv_escape|5.009004||p pv_pretty|5.009004||p pv_uni_display||5.007003| qerror||| qsortsvu||| re_compile||5.009005| re_croak2||| re_dup_guts||| re_intuit_start||5.009005| re_intuit_string||5.006000| re_op_compile||| readpipe_override||| realloc||5.007002|n reentrant_free||5.017004| reentrant_init||5.017004| reentrant_retry||5.017004|vn reentrant_size||5.017004| ref_array_or_hash||| refcounted_he_chain_2hv||| refcounted_he_fetch_pvn||| refcounted_he_fetch_pvs||| refcounted_he_fetch_pv||| refcounted_he_fetch_sv||| refcounted_he_free||| refcounted_he_inc||| refcounted_he_new_pvn||| refcounted_he_new_pvs||| refcounted_he_new_pv||| refcounted_he_new_sv||| refcounted_he_value||| refkids||| refto||| ref||5.017004| reg_check_named_buff_matched||| reg_named_buff_all||5.009005| reg_named_buff_exists||5.009005| reg_named_buff_fetch||5.009005| reg_named_buff_firstkey||5.009005| reg_named_buff_iter||| reg_named_buff_nextkey||5.009005| reg_named_buff_scalar||5.009005| reg_named_buff||| reg_node||| reg_numbered_buff_fetch||| reg_numbered_buff_length||| reg_numbered_buff_store||| reg_qr_package||| reg_recode||| reg_scan_name||| reg_skipcomment||| reg_temp_copy||| reganode||| regatom||| regbranch||| regclass_swash||5.009004| regclass||| regcppop||| regcppush||| regcurly||| regdump_extflags||| regdump||5.005000| regdupe_internal||| regexec_flags||5.005000| regfree_internal||5.009005| reghop3|||n reghop4|||n reghopmaybe3|||n reginclass||| reginitcolors||5.006000| reginsert||| regmatch||| regnext||5.005000| regpiece||| regpposixcc||| regprop||| regrepeat||| regtail_study||| regtail||| regtry||| reguni||| regwhite|||n reg||| repeatcpy|||n report_evil_fh||| report_redefined_cv||| report_uninit||| report_wrongway_fh||| require_pv||5.006000| require_tie_mod||| restore_magic||| rninstr|||n rpeep||| rsignal_restore||| rsignal_save||| rsignal_state||5.004000| rsignal||5.004000| run_body||| run_user_filter||| runops_debug||5.005000| runops_standard||5.005000| rv2cv_op_cv||5.013006| rvpv_dup||| rxres_free||| rxres_restore||| rxres_save||| safesyscalloc||5.006000|n safesysfree||5.006000|n safesysmalloc||5.006000|n safesysrealloc||5.006000|n same_dirent||| save_I16||5.004000| save_I32||| save_I8||5.006000| save_adelete||5.011000| save_aelem_flags||5.011000| save_aelem||5.004050| save_alloc||5.006000| save_aptr||| save_ary||| save_bool||5.008001| save_clearsv||| save_delete||| save_destructor_x||5.006000| save_destructor||5.006000| save_freeop||| save_freepv||| save_freesv||| save_generic_pvref||5.006001| save_generic_svref||5.005030| save_gp||5.004000| save_hash||| save_hdelete||5.011000| save_hek_flags|||n save_helem_flags||5.011000| save_helem||5.004050| save_hints||5.010001| save_hptr||| save_int||| save_item||| save_iv||5.005000| save_lines||| save_list||| save_long||| save_magic||| save_mortalizesv||5.007001| save_nogv||| save_op||5.005000| save_padsv_and_mortalize||5.010001| save_pptr||| save_pushi32ptr||5.010001| save_pushptri32ptr||| save_pushptrptr||5.010001| save_pushptr||5.010001| save_re_context||5.006000| save_scalar_at||| save_scalar||| save_set_svflags||5.009000| save_shared_pvref||5.007003| save_sptr||| save_svref||| save_vptr||5.006000| savepvn||| savepvs||5.009003| savepv||| savesharedpvn||5.009005| savesharedpvs||5.013006| savesharedpv||5.007003| savesharedsvpv||5.013006| savestack_grow_cnt||5.008001| savestack_grow||| savesvpv||5.009002| sawparens||| scalar_mod_type|||n scalarboolean||| scalarkids||| scalarseq||| scalarvoid||| scalar||| scan_bin||5.006000| scan_commit||| scan_const||| scan_formline||| scan_heredoc||| scan_hex||| scan_ident||| scan_inputsymbol||| scan_num||5.007001| scan_oct||| scan_pat||| scan_str||| scan_subst||| scan_trans||| scan_version||5.009001| scan_vstring||5.009005| scan_word||| screaminstr||5.005000| search_const||| seed||5.008001| sequence_num||| set_context||5.006000|n set_numeric_local||5.006000| set_numeric_radix||5.006000| set_numeric_standard||5.006000| setdefout||| share_hek_flags||| share_hek||5.004000| si_dup||| sighandler|||n simplify_sort||| skipspace0||| skipspace1||| skipspace2||| skipspace||| softref2xv||| sortcv_stacked||| sortcv_xsub||| sortcv||| sortsv_flags||5.009003| sortsv||5.007003| space_join_names_mortal||| ss_dup||| stack_grow||| start_force||| start_glob||| start_subparse||5.004000| stdize_locale||| strEQ||| strGE||| strGT||| strLE||| strLT||| strNE||| str_to_version||5.006000| strip_return||| strnEQ||| strnNE||| study_chunk||| sub_crush_depth||| sublex_done||| sublex_push||| sublex_start||| sv_2bool_flags||5.013006| sv_2bool||| sv_2cv||| sv_2io||| sv_2iuv_common||| sv_2iuv_non_preserve||| sv_2iv_flags||5.009001| sv_2iv||| sv_2mortal||| sv_2num||| sv_2nv_flags||5.013001| sv_2pv_flags|5.007002||p sv_2pv_nolen|5.006000||p sv_2pvbyte_nolen|5.006000||p sv_2pvbyte|5.006000||p sv_2pvutf8_nolen||5.006000| sv_2pvutf8||5.006000| sv_2pv||| sv_2uv_flags||5.009001| sv_2uv|5.004000||p sv_add_arena||| sv_add_backref||| sv_backoff||| sv_bless||| sv_cat_decode||5.008001| sv_catpv_flags||5.013006| sv_catpv_mg|5.004050||p sv_catpv_nomg||5.013006| sv_catpvf_mg_nocontext|||pvn sv_catpvf_mg|5.006000|5.004000|pv sv_catpvf_nocontext|||vn sv_catpvf||5.004000|v sv_catpvn_flags||5.007002| sv_catpvn_mg|5.004050||p sv_catpvn_nomg|5.007002||p sv_catpvn||| sv_catpvs_flags||5.013006| sv_catpvs_mg||5.013006| sv_catpvs_nomg||5.013006| sv_catpvs|5.009003||p sv_catpv||| sv_catsv_flags||5.007002| sv_catsv_mg|5.004050||p sv_catsv_nomg|5.007002||p sv_catsv||| sv_catxmlpvn||| sv_catxmlpv||| sv_catxmlsv||| sv_chop||| sv_clean_all||| sv_clean_objs||| sv_clear||| sv_cmp_flags||5.013006| sv_cmp_locale_flags||5.013006| sv_cmp_locale||5.004000| sv_cmp||| sv_collxfrm_flags||5.013006| sv_collxfrm||| sv_copypv_flags||5.017002| sv_copypv_nomg||5.017002| sv_copypv||| sv_dec_nomg||5.013002| sv_dec||| sv_del_backref||| sv_derived_from_pvn||5.015004| sv_derived_from_pv||5.015004| sv_derived_from_sv||5.015004| sv_derived_from||5.004000| sv_destroyable||5.010000| sv_does_pvn||5.015004| sv_does_pv||5.015004| sv_does_sv||5.015004| sv_does||5.009004| sv_dump||| sv_dup_common||| sv_dup_inc_multiple||| sv_dup_inc||| sv_dup||| sv_eq_flags||5.013006| sv_eq||| sv_exp_grow||| sv_force_normal_flags||5.007001| sv_force_normal||5.006000| sv_free2||| sv_free_arenas||| sv_free||| sv_gets||5.004000| sv_grow||| sv_i_ncmp||| sv_inc_nomg||5.013002| sv_inc||| sv_insert_flags||5.010001| sv_insert||| sv_isa||| sv_isobject||| sv_iv||5.005000| sv_kill_backrefs||| sv_len_utf8||5.006000| sv_len||| sv_magic_portable|5.017004|5.004000|p sv_magicext||5.007003| sv_magic||| sv_mortalcopy||| sv_ncmp||| sv_newmortal||| sv_newref||| sv_nolocking||5.007003| sv_nosharing||5.007003| sv_nounlocking||| sv_nv||5.005000| sv_peek||5.005000| sv_pos_b2u_midway||| sv_pos_b2u||5.006000| sv_pos_u2b_cached||| sv_pos_u2b_flags||5.011005| sv_pos_u2b_forwards|||n sv_pos_u2b_midway|||n sv_pos_u2b||5.006000| sv_pvbyten_force||5.006000| sv_pvbyten||5.006000| sv_pvbyte||5.006000| sv_pvn_force_flags|5.007002||p sv_pvn_force||| sv_pvn_nomg|5.007003|5.005000|p sv_pvn||5.005000| sv_pvutf8n_force||5.006000| sv_pvutf8n||5.006000| sv_pvutf8||5.006000| sv_pv||5.006000| sv_recode_to_utf8||5.007003| sv_reftype||| sv_ref||| sv_release_COW||| sv_replace||| sv_report_used||| sv_reset||| sv_rvweaken||5.006000| sv_sethek||| sv_setiv_mg|5.004050||p sv_setiv||| sv_setnv_mg|5.006000||p sv_setnv||| sv_setpv_mg|5.004050||p sv_setpvf_mg_nocontext|||pvn sv_setpvf_mg|5.006000|5.004000|pv sv_setpvf_nocontext|||vn sv_setpvf||5.004000|v sv_setpviv_mg||5.008001| sv_setpviv||5.008001| sv_setpvn_mg|5.004050||p sv_setpvn||| sv_setpvs_mg||5.013006| sv_setpvs|5.009004||p sv_setpv||| sv_setref_iv||| sv_setref_nv||| sv_setref_pvn||| sv_setref_pvs||5.017004| sv_setref_pv||| sv_setref_uv||5.007001| sv_setsv_cow||| sv_setsv_flags||5.007002| sv_setsv_mg|5.004050||p sv_setsv_nomg|5.007002||p sv_setsv||| sv_setuv_mg|5.004050||p sv_setuv|5.004000||p sv_tainted||5.004000| sv_taint||5.004000| sv_true||5.005000| sv_unglob||| sv_uni_display||5.007003| sv_unmagicext||5.013008| sv_unmagic||| sv_unref_flags||5.007001| sv_unref||| sv_untaint||5.004000| sv_upgrade||| sv_usepvn_flags||5.009004| sv_usepvn_mg|5.004050||p sv_usepvn||| sv_utf8_decode||5.006000| sv_utf8_downgrade||5.006000| sv_utf8_encode||5.006000| sv_utf8_upgrade_flags_grow||5.011000| sv_utf8_upgrade_flags||5.007002| sv_utf8_upgrade_nomg||5.007002| sv_utf8_upgrade||5.007001| sv_uv|5.005000||p sv_vcatpvf_mg|5.006000|5.004000|p sv_vcatpvfn_flags||5.017002| sv_vcatpvfn||5.004000| sv_vcatpvf|5.006000|5.004000|p sv_vsetpvf_mg|5.006000|5.004000|p sv_vsetpvfn||5.004000| sv_vsetpvf|5.006000|5.004000|p sv_xmlpeek||| svtype||| swallow_bom||| swash_fetch||5.007002| swash_init||5.006000| swatch_get||| sys_init3||5.010000|n sys_init||5.010000|n sys_intern_clear||| sys_intern_dup||| sys_intern_init||| sys_term||5.010000|n taint_env||| taint_proper||| tied_method|||v tmps_grow||5.006000| toLOWER||| toUPPER||| to_byte_substr||| to_lower_latin1||| to_uni_fold||5.007003| to_uni_lower_lc||5.006000| to_uni_lower||5.007003| to_uni_title_lc||5.006000| to_uni_title||5.007003| to_uni_upper_lc||5.006000| to_uni_upper||5.007003| to_utf8_case||5.007003| to_utf8_fold||5.015007| to_utf8_lower||5.015007| to_utf8_substr||| to_utf8_title||5.015007| to_utf8_upper||5.015007| token_free||| token_getmad||| tokenize_use||| tokeq||| tokereport||| too_few_arguments_pv||| too_few_arguments_sv||| too_many_arguments_pv||| too_many_arguments_sv||| translate_substr_offsets||| try_amagic_bin||| try_amagic_un||| uiv_2buf|||n unlnk||| unpack_rec||| unpack_str||5.007003| unpackstring||5.008001| unreferenced_to_tmp_stack||| unshare_hek_or_pvn||| unshare_hek||| unsharepvn||5.004000| unwind_handler_stack||| update_debugger_info||| upg_version||5.009005| usage||| utf16_textfilter||| utf16_to_utf8_reversed||5.006001| utf16_to_utf8||5.006001| utf8_distance||5.006000| utf8_hop||5.006000| utf8_length||5.007001| utf8_mg_len_cache_update||| utf8_mg_pos_cache_update||| utf8_to_bytes||5.006001| utf8_to_uvchr_buf||5.015009| utf8_to_uvchr||5.007001| utf8_to_uvuni_buf||5.015009| utf8_to_uvuni||5.007001| utf8n_to_uvchr||| utf8n_to_uvuni||5.007001| utilize||| uvchr_to_utf8_flags||5.007003| uvchr_to_utf8||| uvuni_to_utf8_flags||5.007003| uvuni_to_utf8||5.007001| valid_utf8_to_uvchr||5.015009| valid_utf8_to_uvuni||5.015009| validate_suid||| varname||| vcmp||5.009000| vcroak||5.006000| vdeb||5.007003| vform||5.006000| visit||| vivify_defelem||| vivify_ref||| vload_module|5.006000||p vmess||5.006000| vnewSVpvf|5.006000|5.004000|p vnormal||5.009002| vnumify||5.009000| vstringify||5.009000| vverify||5.009003| vwarner||5.006000| vwarn||5.006000| wait4pid||| warn_nocontext|||vn warn_sv||5.013001| warner_nocontext|||vn warner|5.006000|5.004000|pv warn|||v was_lvalue_sub||| watch||| whichsig_pvn||5.015004| whichsig_pv||5.015004| whichsig_sv||5.015004| whichsig||| with_queued_errors||| wrap_op_checker||5.015008| write_no_mem||| write_to_stderr||| xmldump_all_perl||| xmldump_all||| xmldump_attr||| xmldump_eval||| xmldump_form||| xmldump_indent|||v xmldump_packsubs_perl||| xmldump_packsubs||| xmldump_sub_perl||| xmldump_sub||| xmldump_vindent||| xs_apiversion_bootcheck||| xs_version_bootcheck||| yyerror_pvn||| yyerror_pv||| yyerror||| yylex||| yyparse||| yyunlex||| yywarn||| ); if (exists $opt{'list-unsupported'}) { my $f; for $f (sort { lc $a cmp lc $b } keys %API) { next unless $API{$f}{todo}; print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; } exit 0; } # Scan for possible replacement candidates my(%replace, %need, %hints, %warnings, %depends); my $replace = 0; my($hint, $define, $function); sub find_api { my $code = shift; $code =~ s{ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) | "[^"\\]*(?:\\.[^"\\]*)*" | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; grep { exists $API{$_} } $code =~ /(\w+)/mg; } while () { if ($hint) { my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; if (m{^\s*\*\s(.*?)\s*$}) { for (@{$hint->[1]}) { $h->{$_} ||= ''; # suppress warning with older perls $h->{$_} .= "$1\n"; } } else { undef $hint } } $hint = [$1, [split /,?\s+/, $2]] if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; if ($define) { if ($define->[1] =~ /\\$/) { $define->[1] .= $_; } else { if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { my @n = find_api($define->[1]); push @{$depends{$define->[0]}}, @n if @n } undef $define; } } $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; if ($function) { if (/^}/) { if (exists $API{$function->[0]}) { my @n = find_api($function->[1]); push @{$depends{$function->[0]}}, @n if @n } undef $function; } else { $function->[1] .= $_; } } $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { my @deps = map { s/\s+//g; $_ } split /,/, $3; my $d; for $d (map { s/\s+//g; $_ } split /,/, $1) { push @{$depends{$d}}, @deps; } } $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; } for (values %depends) { my %s; $_ = [sort grep !$s{$_}++, @$_]; } if (exists $opt{'api-info'}) { my $f; my $count = 0; my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; for $f (sort { lc $a cmp lc $b } keys %API) { next unless $f =~ /$match/; print "\n=== $f ===\n\n"; my $info = 0; if ($API{$f}{base} || $API{$f}{todo}) { my $base = format_version($API{$f}{base} || $API{$f}{todo}); print "Supported at least starting from perl-$base.\n"; $info++; } if ($API{$f}{provided}) { my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; print "Support by $ppport provided back to perl-$todo.\n"; print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; print "\n$hints{$f}" if exists $hints{$f}; print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; $info++; } print "No portability information available.\n" unless $info; $count++; } $count or print "Found no API matching '$opt{'api-info'}'."; print "\n"; exit 0; } if (exists $opt{'list-provided'}) { my $f; for $f (sort { lc $a cmp lc $b } keys %API) { next unless $API{$f}{provided}; my @flags; push @flags, 'explicit' if exists $need{$f}; push @flags, 'depend' if exists $depends{$f}; push @flags, 'hint' if exists $hints{$f}; push @flags, 'warning' if exists $warnings{$f}; my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; print "$f$flags\n"; } exit 0; } my @files; my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); my $srcext = join '|', map { quotemeta $_ } @srcext; if (@ARGV) { my %seen; for (@ARGV) { if (-e) { if (-f) { push @files, $_ unless $seen{$_}++; } else { warn "'$_' is not a file.\n" } } else { my @new = grep { -f } glob $_ or warn "'$_' does not exist.\n"; push @files, grep { !$seen{$_}++ } @new; } } } else { eval { require File::Find; File::Find::find(sub { $File::Find::name =~ /($srcext)$/i and push @files, $File::Find::name; }, '.'); }; if ($@) { @files = map { glob "*$_" } @srcext; } } if (!@ARGV || $opt{filter}) { my(@in, @out); my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; for (@files) { my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; push @{ $out ? \@out : \@in }, $_; } if (@ARGV && @out) { warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); } @files = @in; } die "No input files given!\n" unless @files; my(%files, %global, %revreplace); %revreplace = reverse %replace; my $filename; my $patch_opened = 0; for $filename (@files) { unless (open IN, "<$filename") { warn "Unable to read from $filename: $!\n"; next; } info("Scanning $filename ..."); my $c = do { local $/; }; close IN; my %file = (orig => $c, changes => 0); # Temporarily remove C/XS comments and strings from the code my @ccom; $c =~ s{ ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) | ( ^$HS*\#[^\r\n]* | "[^"\\]*(?:\\.[^"\\]*)*" | '[^'\\]*(?:\\.[^'\\]*)*' | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) }{ defined $2 and push @ccom, $2; defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; $file{ccom} = \@ccom; $file{code} = $c; $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; my $func; for $func (keys %API) { my $match = $func; $match .= "|$revreplace{$func}" if exists $revreplace{$func}; if ($c =~ /\b(?:Perl_)?($match)\b/) { $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; if (exists $API{$func}{provided}) { $file{uses_provided}{$func}++; if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { $file{uses}{$func}++; my @deps = rec_depend($func); if (@deps) { $file{uses_deps}{$func} = \@deps; for (@deps) { $file{uses}{$_} = 0 unless exists $file{uses}{$_}; } } for ($func, @deps) { $file{needs}{$_} = 'static' if exists $need{$_}; } } } if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { if ($c =~ /\b$func\b/) { $file{uses_todo}{$func}++; } } } } while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { if (exists $need{$2}) { $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; } else { warning("Possibly wrong #define $1 in $filename") } } for (qw(uses needs uses_todo needed_global needed_static)) { for $func (keys %{$file{$_}}) { push @{$global{$_}{$func}}, $filename; } } $files{$filename} = \%file; } # Globally resolve NEED_'s my $need; for $need (keys %{$global{needs}}) { if (@{$global{needs}{$need}} > 1) { my @targets = @{$global{needs}{$need}}; my @t = grep $files{$_}{needed_global}{$need}, @targets; @targets = @t if @t; @t = grep /\.xs$/i, @targets; @targets = @t if @t; my $target = shift @targets; $files{$target}{needs}{$need} = 'global'; for (@{$global{needs}{$need}}) { $files{$_}{needs}{$need} = 'extern' if $_ ne $target; } } } for $filename (@files) { exists $files{$filename} or next; info("=== Analyzing $filename ==="); my %file = %{$files{$filename}}; my $func; my $c = $file{code}; my $warnings = 0; for $func (sort keys %{$file{uses_Perl}}) { if ($API{$func}{varargs}) { unless ($API{$func}{nothxarg}) { my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); if ($changes) { warning("Doesn't pass interpreter argument aTHX to Perl_$func"); $file{changes} += $changes; } } } else { warning("Uses Perl_$func instead of $func"); $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} {$func$1(}g); } } for $func (sort keys %{$file{uses_replace}}) { warning("Uses $func instead of $replace{$func}"); $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); } for $func (sort keys %{$file{uses_provided}}) { if ($file{uses}{$func}) { if (exists $file{uses_deps}{$func}) { diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); } else { diag("Uses $func"); } } $warnings += hint($func); } unless ($opt{quiet}) { for $func (sort keys %{$file{uses_todo}}) { print "*** WARNING: Uses $func, which may not be portable below perl ", format_version($API{$func}{todo}), ", even with '$ppport'\n"; $warnings++; } } for $func (sort keys %{$file{needed_static}}) { my $message = ''; if (not exists $file{uses}{$func}) { $message = "No need to define NEED_$func if $func is never used"; } elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { $message = "No need to define NEED_$func when already needed globally"; } if ($message) { diag($message); $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); } } for $func (sort keys %{$file{needed_global}}) { my $message = ''; if (not exists $global{uses}{$func}) { $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; } elsif (exists $file{needs}{$func}) { if ($file{needs}{$func} eq 'extern') { $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; } elsif ($file{needs}{$func} eq 'static') { $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; } } if ($message) { diag($message); $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); } } $file{needs_inc_ppport} = keys %{$file{uses}}; if ($file{needs_inc_ppport}) { my $pp = ''; for $func (sort keys %{$file{needs}}) { my $type = $file{needs}{$func}; next if $type eq 'extern'; my $suffix = $type eq 'global' ? '_GLOBAL' : ''; unless (exists $file{"needed_$type"}{$func}) { if ($type eq 'global') { diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); } else { diag("File needs $func, adding static request"); } $pp .= "#define NEED_$func$suffix\n"; } } if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { $pp = ''; $file{changes}++; } unless ($file{has_inc_ppport}) { diag("Needs to include '$ppport'"); $pp .= qq(#include "$ppport"\n) } if ($pp) { $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) || ($c =~ s/^/$pp/); } } else { if ($file{has_inc_ppport}) { diag("No need to include '$ppport'"); $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); } } # put back in our C comments my $ix; my $cppc = 0; my @ccom = @{$file{ccom}}; for $ix (0 .. $#ccom) { if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { $cppc++; $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; } else { $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; } } if ($cppc) { my $s = $cppc != 1 ? 's' : ''; warning("Uses $cppc C++ style comment$s, which is not portable"); } my $s = $warnings != 1 ? 's' : ''; my $warn = $warnings ? " ($warnings warning$s)" : ''; info("Analysis completed$warn"); if ($file{changes}) { if (exists $opt{copy}) { my $newfile = "$filename$opt{copy}"; if (-e $newfile) { error("'$newfile' already exists, refusing to write copy of '$filename'"); } else { local *F; if (open F, ">$newfile") { info("Writing copy of '$filename' with changes to '$newfile'"); print F $c; close F; } else { error("Cannot open '$newfile' for writing: $!"); } } } elsif (exists $opt{patch} || $opt{changes}) { if (exists $opt{patch}) { unless ($patch_opened) { if (open PATCH, ">$opt{patch}") { $patch_opened = 1; } else { error("Cannot open '$opt{patch}' for writing: $!"); delete $opt{patch}; $opt{changes} = 1; goto fallback; } } mydiff(\*PATCH, $filename, $c); } else { fallback: info("Suggested changes:"); mydiff(\*STDOUT, $filename, $c); } } else { my $s = $file{changes} == 1 ? '' : 's'; info("$file{changes} potentially required change$s detected"); } } else { info("Looks good"); } } close PATCH if $patch_opened; exit 0; sub try_use { eval "use @_;"; return $@ eq '' } sub mydiff { local *F = shift; my($file, $str) = @_; my $diff; if (exists $opt{diff}) { $diff = run_diff($opt{diff}, $file, $str); } if (!defined $diff and try_use('Text::Diff')) { $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); $diff = <
$tmp") { print F $str; close F; if (open F, "$prog $file $tmp |") { while () { s/\Q$tmp\E/$file.patched/; $diff .= $_; } close F; unlink $tmp; return $diff; } unlink $tmp; } else { error("Cannot open '$tmp' for writing: $!"); } return undef; } sub rec_depend { my($func, $seen) = @_; return () unless exists $depends{$func}; $seen = {%{$seen||{}}}; return () if $seen->{$func}++; my %s; grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; } sub parse_version { my $ver = shift; if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { return ($1, $2, $3); } elsif ($ver !~ /^\d+\.[\d_]+$/) { die "cannot parse version '$ver'\n"; } $ver =~ s/_//g; $ver =~ s/$/000000/; my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; $v = int $v; $s = int $s; if ($r < 5 || ($r == 5 && $v < 6)) { if ($s % 10) { die "cannot parse version '$ver'\n"; } } return ($r, $v, $s); } sub format_version { my $ver = shift; $ver =~ s/$/000000/; my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; $v = int $v; $s = int $s; if ($r < 5 || ($r == 5 && $v < 6)) { if ($s % 10) { die "invalid version '$ver'\n"; } $s /= 10; $ver = sprintf "%d.%03d", $r, $v; $s > 0 and $ver .= sprintf "_%02d", $s; return $ver; } return sprintf "%d.%d.%d", $r, $v, $s; } sub info { $opt{quiet} and return; print @_, "\n"; } sub diag { $opt{quiet} and return; $opt{diag} and print @_, "\n"; } sub warning { $opt{quiet} and return; print "*** ", @_, "\n"; } sub error { print "*** ERROR: ", @_, "\n"; } my %given_hints; my %given_warnings; sub hint { $opt{quiet} and return; my $func = shift; my $rv = 0; if (exists $warnings{$func} && !$given_warnings{$func}++) { my $warn = $warnings{$func}; $warn =~ s!^!*** !mg; print "*** WARNING: $func\n", $warn; $rv++; } if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { my $hint = $hints{$func}; $hint =~ s/^/ /mg; print " --- hint for $func ---\n", $hint; } $rv; } sub usage { my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; my %M = ( 'I' => '*' ); $usage =~ s/^\s*perl\s+\S+/$^X $0/; $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; print < }; my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; $copy =~ s/^(?=\S+)/ /gms; $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; $self =~ s/^SKIP.*(?=^__DATA__)/SKIP if (\@ARGV && \$ARGV[0] eq '--unstrip') { eval { require Devel::PPPort }; \$@ and die "Cannot require Devel::PPPort, please install.\\n"; if (eval \$Devel::PPPort::VERSION < $VERSION) { die "$0 was originally generated with Devel::PPPort $VERSION.\\n" . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" . "Please install a newer version, or --unstrip will not work.\\n"; } Devel::PPPort::WriteFile(\$0); exit 0; } print <$0" or die "cannot strip $0: $!\n"; print OUT "$pl$c\n"; exit 0; } __DATA__ */ #ifndef _P_P_PORTABILITY_H_ #define _P_P_PORTABILITY_H_ #ifndef DPPP_NAMESPACE # define DPPP_NAMESPACE DPPP_ #endif #define DPPP_CAT2(x,y) CAT2(x,y) #define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) #ifndef PERL_REVISION # if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) # define PERL_PATCHLEVEL_H_IMPLICIT # include # endif # if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) # include # endif # ifndef PERL_REVISION # define PERL_REVISION (5) /* Replace: 1 */ # define PERL_VERSION PATCHLEVEL # define PERL_SUBVERSION SUBVERSION /* Replace PERL_PATCHLEVEL with PERL_VERSION */ /* Replace: 0 */ # endif #endif #define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) #define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) /* It is very unlikely that anyone will try to use this with Perl 6 (or greater), but who knows. */ #if PERL_REVISION != 5 # error ppport.h only works with Perl version 5 #endif /* PERL_REVISION != 5 */ #ifndef dTHR # define dTHR dNOOP #endif #ifndef dTHX # define dTHX dNOOP #endif #ifndef dTHXa # define dTHXa(x) dNOOP #endif #ifndef pTHX # define pTHX void #endif #ifndef pTHX_ # define pTHX_ #endif #ifndef aTHX # define aTHX #endif #ifndef aTHX_ # define aTHX_ #endif #if (PERL_BCDVERSION < 0x5006000) # ifdef USE_THREADS # define aTHXR thr # define aTHXR_ thr, # else # define aTHXR # define aTHXR_ # endif # define dTHXR dTHR #else # define aTHXR aTHX # define aTHXR_ aTHX_ # define dTHXR dTHX #endif #ifndef dTHXoa # define dTHXoa(x) dTHXa(x) #endif #ifdef I_LIMITS # include #endif #ifndef PERL_UCHAR_MIN # define PERL_UCHAR_MIN ((unsigned char)0) #endif #ifndef PERL_UCHAR_MAX # ifdef UCHAR_MAX # define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) # else # ifdef MAXUCHAR # define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) # else # define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) # endif # endif #endif #ifndef PERL_USHORT_MIN # define PERL_USHORT_MIN ((unsigned short)0) #endif #ifndef PERL_USHORT_MAX # ifdef USHORT_MAX # define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) # else # ifdef MAXUSHORT # define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) # else # ifdef USHRT_MAX # define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) # else # define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) # endif # endif # endif #endif #ifndef PERL_SHORT_MAX # ifdef SHORT_MAX # define PERL_SHORT_MAX ((short)SHORT_MAX) # else # ifdef MAXSHORT /* Often used in */ # define PERL_SHORT_MAX ((short)MAXSHORT) # else # ifdef SHRT_MAX # define PERL_SHORT_MAX ((short)SHRT_MAX) # else # define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) # endif # endif # endif #endif #ifndef PERL_SHORT_MIN # ifdef SHORT_MIN # define PERL_SHORT_MIN ((short)SHORT_MIN) # else # ifdef MINSHORT # define PERL_SHORT_MIN ((short)MINSHORT) # else # ifdef SHRT_MIN # define PERL_SHORT_MIN ((short)SHRT_MIN) # else # define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) # endif # endif # endif #endif #ifndef PERL_UINT_MAX # ifdef UINT_MAX # define PERL_UINT_MAX ((unsigned int)UINT_MAX) # else # ifdef MAXUINT # define PERL_UINT_MAX ((unsigned int)MAXUINT) # else # define PERL_UINT_MAX (~(unsigned int)0) # endif # endif #endif #ifndef PERL_UINT_MIN # define PERL_UINT_MIN ((unsigned int)0) #endif #ifndef PERL_INT_MAX # ifdef INT_MAX # define PERL_INT_MAX ((int)INT_MAX) # else # ifdef MAXINT /* Often used in */ # define PERL_INT_MAX ((int)MAXINT) # else # define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) # endif # endif #endif #ifndef PERL_INT_MIN # ifdef INT_MIN # define PERL_INT_MIN ((int)INT_MIN) # else # ifdef MININT # define PERL_INT_MIN ((int)MININT) # else # define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) # endif # endif #endif #ifndef PERL_ULONG_MAX # ifdef ULONG_MAX # define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) # else # ifdef MAXULONG # define PERL_ULONG_MAX ((unsigned long)MAXULONG) # else # define PERL_ULONG_MAX (~(unsigned long)0) # endif # endif #endif #ifndef PERL_ULONG_MIN # define PERL_ULONG_MIN ((unsigned long)0L) #endif #ifndef PERL_LONG_MAX # ifdef LONG_MAX # define PERL_LONG_MAX ((long)LONG_MAX) # else # ifdef MAXLONG # define PERL_LONG_MAX ((long)MAXLONG) # else # define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) # endif # endif #endif #ifndef PERL_LONG_MIN # ifdef LONG_MIN # define PERL_LONG_MIN ((long)LONG_MIN) # else # ifdef MINLONG # define PERL_LONG_MIN ((long)MINLONG) # else # define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) # endif # endif #endif #if defined(HAS_QUAD) && (defined(convex) || defined(uts)) # ifndef PERL_UQUAD_MAX # ifdef ULONGLONG_MAX # define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) # else # ifdef MAXULONGLONG # define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) # else # define PERL_UQUAD_MAX (~(unsigned long long)0) # endif # endif # endif # ifndef PERL_UQUAD_MIN # define PERL_UQUAD_MIN ((unsigned long long)0L) # endif # ifndef PERL_QUAD_MAX # ifdef LONGLONG_MAX # define PERL_QUAD_MAX ((long long)LONGLONG_MAX) # else # ifdef MAXLONGLONG # define PERL_QUAD_MAX ((long long)MAXLONGLONG) # else # define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) # endif # endif # endif # ifndef PERL_QUAD_MIN # ifdef LONGLONG_MIN # define PERL_QUAD_MIN ((long long)LONGLONG_MIN) # else # ifdef MINLONGLONG # define PERL_QUAD_MIN ((long long)MINLONGLONG) # else # define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) # endif # endif # endif #endif /* This is based on code from 5.003 perl.h */ #ifdef HAS_QUAD # ifdef cray #ifndef IVTYPE # define IVTYPE int #endif #ifndef IV_MIN # define IV_MIN PERL_INT_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_INT_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_UINT_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_UINT_MAX #endif # ifdef INTSIZE #ifndef IVSIZE # define IVSIZE INTSIZE #endif # endif # else # if defined(convex) || defined(uts) #ifndef IVTYPE # define IVTYPE long long #endif #ifndef IV_MIN # define IV_MIN PERL_QUAD_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_QUAD_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_UQUAD_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_UQUAD_MAX #endif # ifdef LONGLONGSIZE #ifndef IVSIZE # define IVSIZE LONGLONGSIZE #endif # endif # else #ifndef IVTYPE # define IVTYPE long #endif #ifndef IV_MIN # define IV_MIN PERL_LONG_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_LONG_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_ULONG_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_ULONG_MAX #endif # ifdef LONGSIZE #ifndef IVSIZE # define IVSIZE LONGSIZE #endif # endif # endif # endif #ifndef IVSIZE # define IVSIZE 8 #endif #ifndef LONGSIZE # define LONGSIZE 8 #endif #ifndef PERL_QUAD_MIN # define PERL_QUAD_MIN IV_MIN #endif #ifndef PERL_QUAD_MAX # define PERL_QUAD_MAX IV_MAX #endif #ifndef PERL_UQUAD_MIN # define PERL_UQUAD_MIN UV_MIN #endif #ifndef PERL_UQUAD_MAX # define PERL_UQUAD_MAX UV_MAX #endif #else #ifndef IVTYPE # define IVTYPE long #endif #ifndef LONGSIZE # define LONGSIZE 4 #endif #ifndef IV_MIN # define IV_MIN PERL_LONG_MIN #endif #ifndef IV_MAX # define IV_MAX PERL_LONG_MAX #endif #ifndef UV_MIN # define UV_MIN PERL_ULONG_MIN #endif #ifndef UV_MAX # define UV_MAX PERL_ULONG_MAX #endif #endif #ifndef IVSIZE # ifdef LONGSIZE # define IVSIZE LONGSIZE # else # define IVSIZE 4 /* A bold guess, but the best we can make. */ # endif #endif #ifndef UVTYPE # define UVTYPE unsigned IVTYPE #endif #ifndef UVSIZE # define UVSIZE IVSIZE #endif #ifndef sv_setuv # define sv_setuv(sv, uv) \ STMT_START { \ UV TeMpUv = uv; \ if (TeMpUv <= IV_MAX) \ sv_setiv(sv, TeMpUv); \ else \ sv_setnv(sv, (double)TeMpUv); \ } STMT_END #endif #ifndef newSVuv # define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) #endif #ifndef sv_2uv # define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) #endif #ifndef SvUVX # define SvUVX(sv) ((UV)SvIVX(sv)) #endif #ifndef SvUVXx # define SvUVXx(sv) SvUVX(sv) #endif #ifndef SvUV # define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) #endif #ifndef SvUVx # define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) #endif /* Hint: sv_uv * Always use the SvUVx() macro instead of sv_uv(). */ #ifndef sv_uv # define sv_uv(sv) SvUVx(sv) #endif #if !defined(SvUOK) && defined(SvIOK_UV) # define SvUOK(sv) SvIOK_UV(sv) #endif #ifndef XST_mUV # define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) #endif #ifndef XSRETURN_UV # define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END #endif #ifndef PUSHu # define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END #endif #ifndef XPUSHu # define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END #endif #ifdef HAS_MEMCMP #ifndef memNE # define memNE(s1,s2,l) (memcmp(s1,s2,l)) #endif #ifndef memEQ # define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) #endif #else #ifndef memNE # define memNE(s1,s2,l) (bcmp(s1,s2,l)) #endif #ifndef memEQ # define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) #endif #endif #ifndef memEQs # define memEQs(s1, l, s2) \ (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) #endif #ifndef memNEs # define memNEs(s1, l, s2) !memEQs(s1, l, s2) #endif #ifndef MoveD # define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) #endif #ifndef CopyD # define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) #endif #ifdef HAS_MEMSET #ifndef ZeroD # define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) #endif #else #ifndef ZeroD # define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) #endif #endif #ifndef PoisonWith # define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) #endif #ifndef PoisonNew # define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) #endif #ifndef PoisonFree # define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) #endif #ifndef Poison # define Poison(d,n,t) PoisonFree(d,n,t) #endif #ifndef Newx # define Newx(v,n,t) New(0,v,n,t) #endif #ifndef Newxc # define Newxc(v,n,t,c) Newc(0,v,n,t,c) #endif #ifndef Newxz # define Newxz(v,n,t) Newz(0,v,n,t) #endif #ifndef PERL_UNUSED_DECL # ifdef HASATTRIBUTE # if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) # define PERL_UNUSED_DECL # else # define PERL_UNUSED_DECL __attribute__((unused)) # endif # else # define PERL_UNUSED_DECL # endif #endif #ifndef PERL_UNUSED_ARG # if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ # include # define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) # else # define PERL_UNUSED_ARG(x) ((void)x) # endif #endif #ifndef PERL_UNUSED_VAR # define PERL_UNUSED_VAR(x) ((void)x) #endif #ifndef PERL_UNUSED_CONTEXT # ifdef USE_ITHREADS # define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) # else # define PERL_UNUSED_CONTEXT # endif #endif #ifndef NOOP # define NOOP /*EMPTY*/(void)0 #endif #ifndef dNOOP # define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL #endif #ifndef NVTYPE # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) # define NVTYPE long double # else # define NVTYPE double # endif typedef NVTYPE NV; #endif #ifndef INT2PTR # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) # define PTRV UV # define INT2PTR(any,d) (any)(d) # else # if PTRSIZE == LONGSIZE # define PTRV unsigned long # else # define PTRV unsigned # endif # define INT2PTR(any,d) (any)(PTRV)(d) # endif #endif #ifndef PTR2ul # if PTRSIZE == LONGSIZE # define PTR2ul(p) (unsigned long)(p) # else # define PTR2ul(p) INT2PTR(unsigned long,p) # endif #endif #ifndef PTR2nat # define PTR2nat(p) (PTRV)(p) #endif #ifndef NUM2PTR # define NUM2PTR(any,d) (any)PTR2nat(d) #endif #ifndef PTR2IV # define PTR2IV(p) INT2PTR(IV,p) #endif #ifndef PTR2UV # define PTR2UV(p) INT2PTR(UV,p) #endif #ifndef PTR2NV # define PTR2NV(p) NUM2PTR(NV,p) #endif #undef START_EXTERN_C #undef END_EXTERN_C #undef EXTERN_C #ifdef __cplusplus # define START_EXTERN_C extern "C" { # define END_EXTERN_C } # define EXTERN_C extern "C" #else # define START_EXTERN_C # define END_EXTERN_C # define EXTERN_C extern #endif #if defined(PERL_GCC_PEDANTIC) # ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN # define PERL_GCC_BRACE_GROUPS_FORBIDDEN # endif #endif #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) # ifndef PERL_USE_GCC_BRACE_GROUPS # define PERL_USE_GCC_BRACE_GROUPS # endif #endif #undef STMT_START #undef STMT_END #ifdef PERL_USE_GCC_BRACE_GROUPS # define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ # define STMT_END ) #else # if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) # define STMT_START if (1) # define STMT_END else (void)0 # else # define STMT_START do # define STMT_END while (0) # endif #endif #ifndef boolSV # define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) #endif /* DEFSV appears first in 5.004_56 */ #ifndef DEFSV # define DEFSV GvSV(PL_defgv) #endif #ifndef SAVE_DEFSV # define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) #endif #ifndef DEFSV_set # define DEFSV_set(sv) (DEFSV = (sv)) #endif /* Older perls (<=5.003) lack AvFILLp */ #ifndef AvFILLp # define AvFILLp AvFILL #endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif /* Hint: gv_stashpvn * This function's backport doesn't support the length parameter, but * rather ignores it. Portability can only be ensured if the length * parameter is used for speed reasons, but the length can always be * correctly computed from the string argument. */ #ifndef gv_stashpvn # define gv_stashpvn(str,len,create) gv_stashpv(str,create) #endif /* Replace: 1 */ #ifndef get_cv # define get_cv perl_get_cv #endif #ifndef get_sv # define get_sv perl_get_sv #endif #ifndef get_av # define get_av perl_get_av #endif #ifndef get_hv # define get_hv perl_get_hv #endif /* Replace: 0 */ #ifndef dUNDERBAR # define dUNDERBAR dNOOP #endif #ifndef UNDERBAR # define UNDERBAR DEFSV #endif #ifndef dAX # define dAX I32 ax = MARK - PL_stack_base + 1 #endif #ifndef dITEMS # define dITEMS I32 items = SP - MARK #endif #ifndef dXSTARG # define dXSTARG SV * targ = sv_newmortal() #endif #ifndef dAXMARK # define dAXMARK I32 ax = POPMARK; \ register SV ** const mark = PL_stack_base + ax++ #endif #ifndef XSprePUSH # define XSprePUSH (sp = PL_stack_base + ax - 1) #endif #if (PERL_BCDVERSION < 0x5005000) # undef XSRETURN # define XSRETURN(off) \ STMT_START { \ PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ return; \ } STMT_END #endif #ifndef XSPROTO # define XSPROTO(name) void name(pTHX_ CV* cv) #endif #ifndef SVfARG # define SVfARG(p) ((void*)(p)) #endif #ifndef PERL_ABS # define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) #endif #ifndef dVAR # define dVAR dNOOP #endif #ifndef SVf # define SVf "_" #endif #ifndef UTF8_MAXBYTES # define UTF8_MAXBYTES UTF8_MAXLEN #endif #ifndef CPERLscope # define CPERLscope(x) x #endif #ifndef PERL_HASH # define PERL_HASH(hash,str,len) \ STMT_START { \ const char *s_PeRlHaSh = str; \ I32 i_PeRlHaSh = len; \ U32 hash_PeRlHaSh = 0; \ while (i_PeRlHaSh--) \ hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ (hash) = hash_PeRlHaSh; \ } STMT_END #endif #ifndef PERLIO_FUNCS_DECL # ifdef PERLIO_FUNCS_CONST # define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs # define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) # else # define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs # define PERLIO_FUNCS_CAST(funcs) (funcs) # endif #endif /* provide these typedefs for older perls */ #if (PERL_BCDVERSION < 0x5009003) # ifdef ARGSproto typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); # else typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); # endif typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); #endif #ifndef isPSXSPC # define isPSXSPC(c) (isSPACE(c) || (c) == '\v') #endif #ifndef isBLANK # define isBLANK(c) ((c) == ' ' || (c) == '\t') #endif #ifdef EBCDIC #ifndef isALNUMC # define isALNUMC(c) isalnum(c) #endif #ifndef isASCII # define isASCII(c) isascii(c) #endif #ifndef isCNTRL # define isCNTRL(c) iscntrl(c) #endif #ifndef isGRAPH # define isGRAPH(c) isgraph(c) #endif #ifndef isPRINT # define isPRINT(c) isprint(c) #endif #ifndef isPUNCT # define isPUNCT(c) ispunct(c) #endif #ifndef isXDIGIT # define isXDIGIT(c) isxdigit(c) #endif #else # if (PERL_BCDVERSION < 0x5010000) /* Hint: isPRINT * The implementation in older perl versions includes all of the * isSPACE() characters, which is wrong. The version provided by * Devel::PPPort always overrides a present buggy version. */ # undef isPRINT # endif #ifndef isALNUMC # define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) #endif #ifndef isASCII # define isASCII(c) ((U8) (c) <= 127) #endif #ifndef isCNTRL # define isCNTRL(c) ((U8) (c) < ' ' || (c) == 127) #endif #ifndef isGRAPH # define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) #endif #ifndef isPRINT # define isPRINT(c) (((c) >= 32 && (c) < 127)) #endif #ifndef isPUNCT # define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) #endif #ifndef isXDIGIT # define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) #endif #endif #ifndef PERL_SIGNALS_UNSAFE_FLAG #define PERL_SIGNALS_UNSAFE_FLAG 0x0001 #if (PERL_BCDVERSION < 0x5008000) # define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG #else # define D_PPP_PERL_SIGNALS_INIT 0 #endif #if defined(NEED_PL_signals) static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; #elif defined(NEED_PL_signals_GLOBAL) U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; #else extern U32 DPPP_(my_PL_signals); #endif #define PL_signals DPPP_(my_PL_signals) #endif /* Hint: PL_ppaddr * Calling an op via PL_ppaddr requires passing a context argument * for threaded builds. Since the context argument is different for * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will * automatically be defined as the correct argument. */ #if (PERL_BCDVERSION <= 0x5005005) /* Replace: 1 */ # define PL_ppaddr ppaddr # define PL_no_modify no_modify /* Replace: 0 */ #endif #if (PERL_BCDVERSION <= 0x5004005) /* Replace: 1 */ # define PL_DBsignal DBsignal # define PL_DBsingle DBsingle # define PL_DBsub DBsub # define PL_DBtrace DBtrace # define PL_Sv Sv # define PL_bufend bufend # define PL_bufptr bufptr # define PL_compiling compiling # define PL_copline copline # define PL_curcop curcop # define PL_curstash curstash # define PL_debstash debstash # define PL_defgv defgv # define PL_diehook diehook # define PL_dirty dirty # define PL_dowarn dowarn # define PL_errgv errgv # define PL_error_count error_count # define PL_expect expect # define PL_hexdigit hexdigit # define PL_hints hints # define PL_in_my in_my # define PL_laststatval laststatval # define PL_lex_state lex_state # define PL_lex_stuff lex_stuff # define PL_linestr linestr # define PL_na na # define PL_perl_destruct_level perl_destruct_level # define PL_perldb perldb # define PL_rsfp_filters rsfp_filters # define PL_rsfp rsfp # define PL_stack_base stack_base # define PL_stack_sp stack_sp # define PL_statcache statcache # define PL_stdingv stdingv # define PL_sv_arenaroot sv_arenaroot # define PL_sv_no sv_no # define PL_sv_undef sv_undef # define PL_sv_yes sv_yes # define PL_tainted tainted # define PL_tainting tainting # define PL_tokenbuf tokenbuf /* Replace: 0 */ #endif /* Warning: PL_parser * For perl versions earlier than 5.9.5, this is an always * non-NULL dummy. Also, it cannot be dereferenced. Don't * use it if you can avoid is and unless you absolutely know * what you're doing. * If you always check that PL_parser is non-NULL, you can * define DPPP_PL_parser_NO_DUMMY to avoid the creation of * a dummy parser structure. */ #if (PERL_BCDVERSION >= 0x5009005) # ifdef DPPP_PL_parser_NO_DUMMY # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ (croak("panic: PL_parser == NULL in %s:%d", \ __FILE__, __LINE__), (yy_parser *) NULL))->var) # else # ifdef DPPP_PL_parser_NO_DUMMY_WARNING # define D_PPP_parser_dummy_warning(var) # else # define D_PPP_parser_dummy_warning(var) \ warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), # endif # define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) #if defined(NEED_PL_parser) static yy_parser DPPP_(dummy_PL_parser); #elif defined(NEED_PL_parser_GLOBAL) yy_parser DPPP_(dummy_PL_parser); #else extern yy_parser DPPP_(dummy_PL_parser); #endif # endif /* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ /* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf * Do not use this variable unless you know exactly what you're * doint. It is internal to the perl parser and may change or even * be removed in the future. As of perl 5.9.5, you have to check * for (PL_parser != NULL) for this variable to have any effect. * An always non-NULL PL_parser dummy is provided for earlier * perl versions. * If PL_parser is NULL when you try to access this variable, a * dummy is being accessed instead and a warning is issued unless * you define DPPP_PL_parser_NO_DUMMY_WARNING. * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access * this variable will croak with a panic message. */ # define PL_expect D_PPP_my_PL_parser_var(expect) # define PL_copline D_PPP_my_PL_parser_var(copline) # define PL_rsfp D_PPP_my_PL_parser_var(rsfp) # define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) # define PL_linestr D_PPP_my_PL_parser_var(linestr) # define PL_bufptr D_PPP_my_PL_parser_var(bufptr) # define PL_bufend D_PPP_my_PL_parser_var(bufend) # define PL_lex_state D_PPP_my_PL_parser_var(lex_state) # define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) # define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) # define PL_in_my D_PPP_my_PL_parser_var(in_my) # define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) # define PL_error_count D_PPP_my_PL_parser_var(error_count) #else /* ensure that PL_parser != NULL and cannot be dereferenced */ # define PL_parser ((void *) 1) #endif #ifndef mPUSHs # define mPUSHs(s) PUSHs(sv_2mortal(s)) #endif #ifndef PUSHmortal # define PUSHmortal PUSHs(sv_newmortal()) #endif #ifndef mPUSHp # define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) #endif #ifndef mPUSHn # define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) #endif #ifndef mPUSHi # define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) #endif #ifndef mPUSHu # define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) #endif #ifndef mXPUSHs # define mXPUSHs(s) XPUSHs(sv_2mortal(s)) #endif #ifndef XPUSHmortal # define XPUSHmortal XPUSHs(sv_newmortal()) #endif #ifndef mXPUSHp # define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END #endif #ifndef mXPUSHn # define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END #endif #ifndef mXPUSHi # define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END #endif #ifndef mXPUSHu # define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END #endif /* Replace: 1 */ #ifndef call_sv # define call_sv perl_call_sv #endif #ifndef call_pv # define call_pv perl_call_pv #endif #ifndef call_argv # define call_argv perl_call_argv #endif #ifndef call_method # define call_method perl_call_method #endif #ifndef eval_sv # define eval_sv perl_eval_sv #endif /* Replace: 0 */ #ifndef PERL_LOADMOD_DENY # define PERL_LOADMOD_DENY 0x1 #endif #ifndef PERL_LOADMOD_NOIMPORT # define PERL_LOADMOD_NOIMPORT 0x2 #endif #ifndef PERL_LOADMOD_IMPORT_OPS # define PERL_LOADMOD_IMPORT_OPS 0x4 #endif #ifndef G_METHOD # define G_METHOD 64 # ifdef call_sv # undef call_sv # endif # if (PERL_BCDVERSION < 0x5006000) # define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) # else # define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) # endif #endif /* Replace perl_eval_pv with eval_pv */ #ifndef eval_pv #if defined(NEED_eval_pv) static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); static #else extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); #endif #ifdef eval_pv # undef eval_pv #endif #define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) #define Perl_eval_pv DPPP_(my_eval_pv) #if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error) { dSP; SV* sv = newSVpv(p, 0); PUSHMARK(sp); eval_sv(sv, G_SCALAR); SvREFCNT_dec(sv); SPAGAIN; sv = POPs; PUTBACK; if (croak_on_error && SvTRUE(GvSV(errgv))) croak(SvPVx(GvSV(errgv), na)); return sv; } #endif #endif #ifndef vload_module #if defined(NEED_vload_module) static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); static #else extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); #endif #ifdef vload_module # undef vload_module #endif #define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) #define Perl_vload_module DPPP_(my_vload_module) #if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) { dTHR; dVAR; OP *veop, *imop; OP * const modname = newSVOP(OP_CONST, 0, name); /* 5.005 has a somewhat hacky force_normal that doesn't croak on SvREADONLY() if PL_compling is true. Current perls take care in ck_require() to correctly turn off SvREADONLY before calling force_normal_flags(). This seems a better fix than fudging PL_compling */ SvREADONLY_off(((SVOP*)modname)->op_sv); modname->op_private |= OPpCONST_BARE; if (ver) { veop = newSVOP(OP_CONST, 0, ver); } else veop = NULL; if (flags & PERL_LOADMOD_NOIMPORT) { imop = sawparens(newNULLLIST()); } else if (flags & PERL_LOADMOD_IMPORT_OPS) { imop = va_arg(*args, OP*); } else { SV *sv; imop = NULL; sv = va_arg(*args, SV*); while (sv) { imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); sv = va_arg(*args, SV*); } } { const line_t ocopline = PL_copline; COP * const ocurcop = PL_curcop; const int oexpect = PL_expect; #if (PERL_BCDVERSION >= 0x5004000) utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), veop, modname, imop); #else utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), modname, imop); #endif PL_expect = oexpect; PL_copline = ocopline; PL_curcop = ocurcop; } } #endif #endif #ifndef load_module #if defined(NEED_load_module) static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); static #else extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); #endif #ifdef load_module # undef load_module #endif #define load_module DPPP_(my_load_module) #define Perl_load_module DPPP_(my_load_module) #if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) { va_list args; va_start(args, ver); vload_module(flags, name, ver, &args); va_end(args); } #endif #endif #ifndef newRV_inc # define newRV_inc(sv) newRV(sv) /* Replace */ #endif #ifndef newRV_noinc #if defined(NEED_newRV_noinc) static SV * DPPP_(my_newRV_noinc)(SV *sv); static #else extern SV * DPPP_(my_newRV_noinc)(SV *sv); #endif #ifdef newRV_noinc # undef newRV_noinc #endif #define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) #define Perl_newRV_noinc DPPP_(my_newRV_noinc) #if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) SV * DPPP_(my_newRV_noinc)(SV *sv) { SV *rv = (SV *)newRV(sv); SvREFCNT_dec(sv); return rv; } #endif #endif /* Hint: newCONSTSUB * Returns a CV* as of perl-5.7.1. This return value is not supported * by Devel::PPPort. */ /* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ #if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) #if defined(NEED_newCONSTSUB) static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); static #else extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); #endif #ifdef newCONSTSUB # undef newCONSTSUB #endif #define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) #define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) #if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) /* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ /* (There's no PL_parser in perl < 5.005, so this is completely safe) */ #define D_PPP_PL_copline PL_copline void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) { U32 oldhints = PL_hints; HV *old_cop_stash = PL_curcop->cop_stash; HV *old_curstash = PL_curstash; line_t oldline = PL_curcop->cop_line; PL_curcop->cop_line = D_PPP_PL_copline; PL_hints &= ~HINT_BLOCK_SCOPE; if (stash) PL_curstash = PL_curcop->cop_stash = stash; newSUB( #if (PERL_BCDVERSION < 0x5003022) start_subparse(), #elif (PERL_BCDVERSION == 0x5003022) start_subparse(0), #else /* 5.003_23 onwards */ start_subparse(FALSE, 0), #endif newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) ); PL_hints = oldhints; PL_curcop->cop_stash = old_cop_stash; PL_curstash = old_curstash; PL_curcop->cop_line = oldline; } #endif #endif /* * Boilerplate macros for initializing and accessing interpreter-local * data from C. All statics in extensions should be reworked to use * this, if you want to make the extension thread-safe. See ext/re/re.xs * for an example of the use of these macros. * * Code that uses these macros is responsible for the following: * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" * 2. Declare a typedef named my_cxt_t that is a structure that contains * all the data that needs to be interpreter-local. * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. * 4. Use the MY_CXT_INIT macro such that it is called exactly once * (typically put in the BOOT: section). * 5. Use the members of the my_cxt_t structure everywhere as * MY_CXT.member. * 6. Use the dMY_CXT macro (a declaration) in all the functions that * access MY_CXT. */ #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) #ifndef START_MY_CXT /* This must appear in all extensions that define a my_cxt_t structure, * right after the definition (i.e. at file scope). The non-threads * case below uses it to declare the data as static. */ #define START_MY_CXT #if (PERL_BCDVERSION < 0x5004068) /* Fetches the SV that keeps the per-interpreter data. */ #define dMY_CXT_SV \ SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) #else /* >= perl5.004_68 */ #define dMY_CXT_SV \ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ sizeof(MY_CXT_KEY)-1, TRUE) #endif /* < perl5.004_68 */ /* This declaration should be used within all functions that use the * interpreter-local data. */ #define dMY_CXT \ dMY_CXT_SV; \ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) /* Creates and zeroes the per-interpreter data. * (We allocate my_cxtp in a Perl SV so that it will be released when * the interpreter goes away.) */ #define MY_CXT_INIT \ dMY_CXT_SV; \ /* newSV() allocates one more than needed */ \ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ Zero(my_cxtp, 1, my_cxt_t); \ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) /* This macro must be used to access members of the my_cxt_t structure. * e.g. MYCXT.some_data */ #define MY_CXT (*my_cxtp) /* Judicious use of these macros can reduce the number of times dMY_CXT * is used. Use is similar to pTHX, aTHX etc. */ #define pMY_CXT my_cxt_t *my_cxtp #define pMY_CXT_ pMY_CXT, #define _pMY_CXT ,pMY_CXT #define aMY_CXT my_cxtp #define aMY_CXT_ aMY_CXT, #define _aMY_CXT ,aMY_CXT #endif /* START_MY_CXT */ #ifndef MY_CXT_CLONE /* Clones the per-interpreter data. */ #define MY_CXT_CLONE \ dMY_CXT_SV; \ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) #endif #else /* single interpreter */ #ifndef START_MY_CXT #define START_MY_CXT static my_cxt_t my_cxt; #define dMY_CXT_SV dNOOP #define dMY_CXT dNOOP #define MY_CXT_INIT NOOP #define MY_CXT my_cxt #define pMY_CXT void #define pMY_CXT_ #define _pMY_CXT #define aMY_CXT #define aMY_CXT_ #define _aMY_CXT #endif /* START_MY_CXT */ #ifndef MY_CXT_CLONE #define MY_CXT_CLONE NOOP #endif #endif #ifndef IVdf # if IVSIZE == LONGSIZE # define IVdf "ld" # define UVuf "lu" # define UVof "lo" # define UVxf "lx" # define UVXf "lX" # elif IVSIZE == INTSIZE # define IVdf "d" # define UVuf "u" # define UVof "o" # define UVxf "x" # define UVXf "X" # else # error "cannot define IV/UV formats" # endif #endif #ifndef NVef # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) /* Not very likely, but let's try anyway. */ # define NVef PERL_PRIeldbl # define NVff PERL_PRIfldbl # define NVgf PERL_PRIgldbl # else # define NVef "e" # define NVff "f" # define NVgf "g" # endif #endif #ifndef SvREFCNT_inc # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ if (_sv) \ (SvREFCNT(_sv))++; \ _sv; \ }) # else # define SvREFCNT_inc(sv) \ ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) # endif #endif #ifndef SvREFCNT_inc_simple # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_simple(sv) \ ({ \ if (sv) \ (SvREFCNT(sv))++; \ (SV *)(sv); \ }) # else # define SvREFCNT_inc_simple(sv) \ ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) # endif #endif #ifndef SvREFCNT_inc_NN # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_NN(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ SvREFCNT(_sv)++; \ _sv; \ }) # else # define SvREFCNT_inc_NN(sv) \ (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) # endif #endif #ifndef SvREFCNT_inc_void # ifdef PERL_USE_GCC_BRACE_GROUPS # define SvREFCNT_inc_void(sv) \ ({ \ SV * const _sv = (SV*)(sv); \ if (_sv) \ (void)(SvREFCNT(_sv)++); \ }) # else # define SvREFCNT_inc_void(sv) \ (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) # endif #endif #ifndef SvREFCNT_inc_simple_void # define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END #endif #ifndef SvREFCNT_inc_simple_NN # define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) #endif #ifndef SvREFCNT_inc_void_NN # define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) #endif #ifndef SvREFCNT_inc_simple_void_NN # define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) #endif #ifndef newSV_type #if defined(NEED_newSV_type) static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); static #else extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); #endif #ifdef newSV_type # undef newSV_type #endif #define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) #define Perl_newSV_type DPPP_(my_newSV_type) #if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) SV* DPPP_(my_newSV_type)(pTHX_ svtype const t) { SV* const sv = newSV(0); sv_upgrade(sv, t); return sv; } #endif #endif #if (PERL_BCDVERSION < 0x5006000) # define D_PPP_CONSTPV_ARG(x) ((char *) (x)) #else # define D_PPP_CONSTPV_ARG(x) (x) #endif #ifndef newSVpvn # define newSVpvn(data,len) ((data) \ ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ : newSV(0)) #endif #ifndef newSVpvn_utf8 # define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) #endif #ifndef SVf_UTF8 # define SVf_UTF8 0 #endif #ifndef newSVpvn_flags #if defined(NEED_newSVpvn_flags) static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); static #else extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); #endif #ifdef newSVpvn_flags # undef newSVpvn_flags #endif #define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) #define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) #if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) { SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len); SvFLAGS(sv) |= (flags & SVf_UTF8); return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv; } #endif #endif /* Backwards compatibility stuff... :-( */ #if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) # define NEED_sv_2pv_flags #endif #if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) # define NEED_sv_2pv_flags_GLOBAL #endif /* Hint: sv_2pv_nolen * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). */ #ifndef sv_2pv_nolen # define sv_2pv_nolen(sv) SvPV_nolen(sv) #endif #ifdef SvPVbyte /* Hint: SvPVbyte * Does not work in perl-5.6.1, ppport.h implements a version * borrowed from perl-5.7.3. */ #if (PERL_BCDVERSION < 0x5007000) #if defined(NEED_sv_2pvbyte) static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); static #else extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); #endif #ifdef sv_2pvbyte # undef sv_2pvbyte #endif #define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) #define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) #if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) { sv_utf8_downgrade(sv,0); return SvPV(sv,*lp); } #endif /* Hint: sv_2pvbyte * Use the SvPVbyte() macro instead of sv_2pvbyte(). */ #undef SvPVbyte #define SvPVbyte(sv, lp) \ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) #endif #else # define SvPVbyte SvPV # define sv_2pvbyte sv_2pv #endif #ifndef sv_2pvbyte_nolen # define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) #endif /* Hint: sv_pvn * Always use the SvPV() macro instead of sv_pvn(). */ /* Hint: sv_pvn_force * Always use the SvPV_force() macro instead of sv_pvn_force(). */ /* If these are undefined, they're not handled by the core anyway */ #ifndef SV_IMMEDIATE_UNREF # define SV_IMMEDIATE_UNREF 0 #endif #ifndef SV_GMAGIC # define SV_GMAGIC 0 #endif #ifndef SV_COW_DROP_PV # define SV_COW_DROP_PV 0 #endif #ifndef SV_UTF8_NO_ENCODING # define SV_UTF8_NO_ENCODING 0 #endif #ifndef SV_NOSTEAL # define SV_NOSTEAL 0 #endif #ifndef SV_CONST_RETURN # define SV_CONST_RETURN 0 #endif #ifndef SV_MUTABLE_RETURN # define SV_MUTABLE_RETURN 0 #endif #ifndef SV_SMAGIC # define SV_SMAGIC 0 #endif #ifndef SV_HAS_TRAILING_NUL # define SV_HAS_TRAILING_NUL 0 #endif #ifndef SV_COW_SHARED_HASH_KEYS # define SV_COW_SHARED_HASH_KEYS 0 #endif #if (PERL_BCDVERSION < 0x5007002) #if defined(NEED_sv_2pv_flags) static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); static #else extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); #endif #ifdef sv_2pv_flags # undef sv_2pv_flags #endif #define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) #define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) #if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) { STRLEN n_a = (STRLEN) flags; return sv_2pv(sv, lp ? lp : &n_a); } #endif #if defined(NEED_sv_pvn_force_flags) static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); static #else extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); #endif #ifdef sv_pvn_force_flags # undef sv_pvn_force_flags #endif #define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) #define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) #if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) { STRLEN n_a = (STRLEN) flags; return sv_pvn_force(sv, lp ? lp : &n_a); } #endif #endif #if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) # define DPPP_SVPV_NOLEN_LP_ARG &PL_na #else # define DPPP_SVPV_NOLEN_LP_ARG 0 #endif #ifndef SvPV_const # define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_mutable # define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_flags # define SvPV_flags(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) #endif #ifndef SvPV_flags_const # define SvPV_flags_const(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) #endif #ifndef SvPV_flags_const_nolen # define SvPV_flags_const_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX_const(sv) : \ (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) #endif #ifndef SvPV_flags_mutable # define SvPV_flags_mutable(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) #endif #ifndef SvPV_force # define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_force_nolen # define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) #endif #ifndef SvPV_force_mutable # define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) #endif #ifndef SvPV_force_nomg # define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) #endif #ifndef SvPV_force_nomg_nolen # define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) #endif #ifndef SvPV_force_flags # define SvPV_force_flags(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) #endif #ifndef SvPV_force_flags_nolen # define SvPV_force_flags_nolen(sv, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags)) #endif #ifndef SvPV_force_flags_mutable # define SvPV_force_flags_mutable(sv, lp, flags) \ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) #endif #ifndef SvPV_nolen # define SvPV_nolen(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) #endif #ifndef SvPV_nolen_const # define SvPV_nolen_const(sv) \ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) #endif #ifndef SvPV_nomg # define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) #endif #ifndef SvPV_nomg_const # define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) #endif #ifndef SvPV_nomg_const_nolen # define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) #endif #ifndef SvPV_nomg_nolen # define SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, 0)) #endif #ifndef SvPV_renew # define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ SvPV_set((sv), (char *) saferealloc( \ (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ } STMT_END #endif #ifndef SvMAGIC_set # define SvMAGIC_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END #endif #if (PERL_BCDVERSION < 0x5009003) #ifndef SvPVX_const # define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) #endif #ifndef SvPVX_mutable # define SvPVX_mutable(sv) (0 + SvPVX(sv)) #endif #ifndef SvRV_set # define SvRV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END #endif #else #ifndef SvPVX_const # define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) #endif #ifndef SvPVX_mutable # define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) #endif #ifndef SvRV_set # define SvRV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ ((sv)->sv_u.svu_rv = (val)); } STMT_END #endif #endif #ifndef SvSTASH_set # define SvSTASH_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END #endif #if (PERL_BCDVERSION < 0x5004000) #ifndef SvUV_set # define SvUV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END #endif #else #ifndef SvUV_set # define SvUV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END #endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) #if defined(NEED_vnewSVpvf) static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); static #else extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); #endif #ifdef vnewSVpvf # undef vnewSVpvf #endif #define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) #define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) #if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) { register SV *sv = newSV(0); sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); return sv; } #endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) # define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) # define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) #if defined(NEED_sv_catpvf_mg) static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); #endif #define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) #if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) { va_list args; va_start(args, pat); sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #ifdef PERL_IMPLICIT_CONTEXT #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) #if defined(NEED_sv_catpvf_mg_nocontext) static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); #endif #define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) #define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) #if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) { dTHX; va_list args; va_start(args, pat); sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #endif /* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ #ifndef sv_catpvf_mg # ifdef PERL_IMPLICIT_CONTEXT # define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext # else # define sv_catpvf_mg Perl_sv_catpvf_mg # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) # define sv_vcatpvf_mg(sv, pat, args) \ STMT_START { \ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ SvSETMAGIC(sv); \ } STMT_END #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) #if defined(NEED_sv_setpvf_mg) static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); #endif #define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) #if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) { va_list args; va_start(args, pat); sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #ifdef PERL_IMPLICIT_CONTEXT #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) #if defined(NEED_sv_setpvf_mg_nocontext) static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); static #else extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); #endif #define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) #define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) #if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) { dTHX; va_list args; va_start(args, pat); sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); SvSETMAGIC(sv); va_end(args); } #endif #endif #endif /* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ #ifndef sv_setpvf_mg # ifdef PERL_IMPLICIT_CONTEXT # define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext # else # define sv_setpvf_mg Perl_sv_setpvf_mg # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) # define sv_vsetpvf_mg(sv, pat, args) \ STMT_START { \ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ SvSETMAGIC(sv); \ } STMT_END #endif /* Hint: newSVpvn_share * The SVs created by this function only mimic the behaviour of * shared PVs without really being shared. Only use if you know * what you're doing. */ #ifndef newSVpvn_share #if defined(NEED_newSVpvn_share) static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); static #else extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); #endif #ifdef newSVpvn_share # undef newSVpvn_share #endif #define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) #define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) #if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) { SV *sv; if (len < 0) len = -len; if (!hash) PERL_HASH(hash, (char*) src, len); sv = newSVpvn((char *) src, len); sv_upgrade(sv, SVt_PVIV); SvIVX(sv) = hash; SvREADONLY_on(sv); SvPOK_on(sv); return sv; } #endif #endif #ifndef SvSHARED_HASH # define SvSHARED_HASH(sv) (0 + SvUVX(sv)) #endif #ifndef HvNAME_get # define HvNAME_get(hv) HvNAME(hv) #endif #ifndef HvNAMELEN_get # define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) #endif #ifndef GvSVn # define GvSVn(gv) GvSV(gv) #endif #ifndef isGV_with_GP # define isGV_with_GP(gv) isGV(gv) #endif #ifndef gv_fetchpvn_flags # define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt) #endif #ifndef gv_fetchsv # define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) #endif #ifndef get_cvn_flags # define get_cvn_flags(name, namelen, flags) get_cv(name, flags) #endif #ifndef WARN_ALL # define WARN_ALL 0 #endif #ifndef WARN_CLOSURE # define WARN_CLOSURE 1 #endif #ifndef WARN_DEPRECATED # define WARN_DEPRECATED 2 #endif #ifndef WARN_EXITING # define WARN_EXITING 3 #endif #ifndef WARN_GLOB # define WARN_GLOB 4 #endif #ifndef WARN_IO # define WARN_IO 5 #endif #ifndef WARN_CLOSED # define WARN_CLOSED 6 #endif #ifndef WARN_EXEC # define WARN_EXEC 7 #endif #ifndef WARN_LAYER # define WARN_LAYER 8 #endif #ifndef WARN_NEWLINE # define WARN_NEWLINE 9 #endif #ifndef WARN_PIPE # define WARN_PIPE 10 #endif #ifndef WARN_UNOPENED # define WARN_UNOPENED 11 #endif #ifndef WARN_MISC # define WARN_MISC 12 #endif #ifndef WARN_NUMERIC # define WARN_NUMERIC 13 #endif #ifndef WARN_ONCE # define WARN_ONCE 14 #endif #ifndef WARN_OVERFLOW # define WARN_OVERFLOW 15 #endif #ifndef WARN_PACK # define WARN_PACK 16 #endif #ifndef WARN_PORTABLE # define WARN_PORTABLE 17 #endif #ifndef WARN_RECURSION # define WARN_RECURSION 18 #endif #ifndef WARN_REDEFINE # define WARN_REDEFINE 19 #endif #ifndef WARN_REGEXP # define WARN_REGEXP 20 #endif #ifndef WARN_SEVERE # define WARN_SEVERE 21 #endif #ifndef WARN_DEBUGGING # define WARN_DEBUGGING 22 #endif #ifndef WARN_INPLACE # define WARN_INPLACE 23 #endif #ifndef WARN_INTERNAL # define WARN_INTERNAL 24 #endif #ifndef WARN_MALLOC # define WARN_MALLOC 25 #endif #ifndef WARN_SIGNAL # define WARN_SIGNAL 26 #endif #ifndef WARN_SUBSTR # define WARN_SUBSTR 27 #endif #ifndef WARN_SYNTAX # define WARN_SYNTAX 28 #endif #ifndef WARN_AMBIGUOUS # define WARN_AMBIGUOUS 29 #endif #ifndef WARN_BAREWORD # define WARN_BAREWORD 30 #endif #ifndef WARN_DIGIT # define WARN_DIGIT 31 #endif #ifndef WARN_PARENTHESIS # define WARN_PARENTHESIS 32 #endif #ifndef WARN_PRECEDENCE # define WARN_PRECEDENCE 33 #endif #ifndef WARN_PRINTF # define WARN_PRINTF 34 #endif #ifndef WARN_PROTOTYPE # define WARN_PROTOTYPE 35 #endif #ifndef WARN_QW # define WARN_QW 36 #endif #ifndef WARN_RESERVED # define WARN_RESERVED 37 #endif #ifndef WARN_SEMICOLON # define WARN_SEMICOLON 38 #endif #ifndef WARN_TAINT # define WARN_TAINT 39 #endif #ifndef WARN_THREADS # define WARN_THREADS 40 #endif #ifndef WARN_UNINITIALIZED # define WARN_UNINITIALIZED 41 #endif #ifndef WARN_UNPACK # define WARN_UNPACK 42 #endif #ifndef WARN_UNTIE # define WARN_UNTIE 43 #endif #ifndef WARN_UTF8 # define WARN_UTF8 44 #endif #ifndef WARN_VOID # define WARN_VOID 45 #endif #ifndef WARN_ASSERTIONS # define WARN_ASSERTIONS 46 #endif #ifndef packWARN # define packWARN(a) (a) #endif #ifndef ckWARN # ifdef G_WARN_ON # define ckWARN(a) (PL_dowarn & G_WARN_ON) # else # define ckWARN(a) PL_dowarn # endif #endif #if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) #if defined(NEED_warner) static void DPPP_(my_warner)(U32 err, const char *pat, ...); static #else extern void DPPP_(my_warner)(U32 err, const char *pat, ...); #endif #define Perl_warner DPPP_(my_warner) #if defined(NEED_warner) || defined(NEED_warner_GLOBAL) void DPPP_(my_warner)(U32 err, const char *pat, ...) { SV *sv; va_list args; PERL_UNUSED_ARG(err); va_start(args, pat); sv = vnewSVpvf(pat, &args); va_end(args); sv_2mortal(sv); warn("%s", SvPV_nolen(sv)); } #define warner Perl_warner #define Perl_warner_nocontext Perl_warner #endif #endif /* concatenating with "" ensures that only literal strings are accepted as argument * note that STR_WITH_LEN() can't be used as argument to macros or functions that * under some configurations might be macros */ #ifndef STR_WITH_LEN # define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) #endif #ifndef newSVpvs # define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) #endif #ifndef newSVpvs_flags # define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) #endif #ifndef newSVpvs_share # define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0) #endif #ifndef sv_catpvs # define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) #endif #ifndef sv_setpvs # define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) #endif #ifndef hv_fetchs # define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) #endif #ifndef hv_stores # define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) #endif #ifndef gv_fetchpvs # define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) #endif #ifndef gv_stashpvs # define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) #endif #ifndef get_cvs # define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags) #endif #ifndef SvGETMAGIC # define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END #endif #ifndef PERL_MAGIC_sv # define PERL_MAGIC_sv '\0' #endif #ifndef PERL_MAGIC_overload # define PERL_MAGIC_overload 'A' #endif #ifndef PERL_MAGIC_overload_elem # define PERL_MAGIC_overload_elem 'a' #endif #ifndef PERL_MAGIC_overload_table # define PERL_MAGIC_overload_table 'c' #endif #ifndef PERL_MAGIC_bm # define PERL_MAGIC_bm 'B' #endif #ifndef PERL_MAGIC_regdata # define PERL_MAGIC_regdata 'D' #endif #ifndef PERL_MAGIC_regdatum # define PERL_MAGIC_regdatum 'd' #endif #ifndef PERL_MAGIC_env # define PERL_MAGIC_env 'E' #endif #ifndef PERL_MAGIC_envelem # define PERL_MAGIC_envelem 'e' #endif #ifndef PERL_MAGIC_fm # define PERL_MAGIC_fm 'f' #endif #ifndef PERL_MAGIC_regex_global # define PERL_MAGIC_regex_global 'g' #endif #ifndef PERL_MAGIC_isa # define PERL_MAGIC_isa 'I' #endif #ifndef PERL_MAGIC_isaelem # define PERL_MAGIC_isaelem 'i' #endif #ifndef PERL_MAGIC_nkeys # define PERL_MAGIC_nkeys 'k' #endif #ifndef PERL_MAGIC_dbfile # define PERL_MAGIC_dbfile 'L' #endif #ifndef PERL_MAGIC_dbline # define PERL_MAGIC_dbline 'l' #endif #ifndef PERL_MAGIC_mutex # define PERL_MAGIC_mutex 'm' #endif #ifndef PERL_MAGIC_shared # define PERL_MAGIC_shared 'N' #endif #ifndef PERL_MAGIC_shared_scalar # define PERL_MAGIC_shared_scalar 'n' #endif #ifndef PERL_MAGIC_collxfrm # define PERL_MAGIC_collxfrm 'o' #endif #ifndef PERL_MAGIC_tied # define PERL_MAGIC_tied 'P' #endif #ifndef PERL_MAGIC_tiedelem # define PERL_MAGIC_tiedelem 'p' #endif #ifndef PERL_MAGIC_tiedscalar # define PERL_MAGIC_tiedscalar 'q' #endif #ifndef PERL_MAGIC_qr # define PERL_MAGIC_qr 'r' #endif #ifndef PERL_MAGIC_sig # define PERL_MAGIC_sig 'S' #endif #ifndef PERL_MAGIC_sigelem # define PERL_MAGIC_sigelem 's' #endif #ifndef PERL_MAGIC_taint # define PERL_MAGIC_taint 't' #endif #ifndef PERL_MAGIC_uvar # define PERL_MAGIC_uvar 'U' #endif #ifndef PERL_MAGIC_uvar_elem # define PERL_MAGIC_uvar_elem 'u' #endif #ifndef PERL_MAGIC_vstring # define PERL_MAGIC_vstring 'V' #endif #ifndef PERL_MAGIC_vec # define PERL_MAGIC_vec 'v' #endif #ifndef PERL_MAGIC_utf8 # define PERL_MAGIC_utf8 'w' #endif #ifndef PERL_MAGIC_substr # define PERL_MAGIC_substr 'x' #endif #ifndef PERL_MAGIC_defelem # define PERL_MAGIC_defelem 'y' #endif #ifndef PERL_MAGIC_glob # define PERL_MAGIC_glob '*' #endif #ifndef PERL_MAGIC_arylen # define PERL_MAGIC_arylen '#' #endif #ifndef PERL_MAGIC_pos # define PERL_MAGIC_pos '.' #endif #ifndef PERL_MAGIC_backref # define PERL_MAGIC_backref '<' #endif #ifndef PERL_MAGIC_ext # define PERL_MAGIC_ext '~' #endif /* That's the best we can do... */ #ifndef sv_catpvn_nomg # define sv_catpvn_nomg sv_catpvn #endif #ifndef sv_catsv_nomg # define sv_catsv_nomg sv_catsv #endif #ifndef sv_setsv_nomg # define sv_setsv_nomg sv_setsv #endif #ifndef sv_pvn_nomg # define sv_pvn_nomg sv_pvn #endif #ifndef SvIV_nomg # define SvIV_nomg SvIV #endif #ifndef SvUV_nomg # define SvUV_nomg SvUV #endif #ifndef sv_catpv_mg # define sv_catpv_mg(sv, ptr) \ STMT_START { \ SV *TeMpSv = sv; \ sv_catpv(TeMpSv,ptr); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_catpvn_mg # define sv_catpvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_catpvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_catsv_mg # define sv_catsv_mg(dsv, ssv) \ STMT_START { \ SV *TeMpSv = dsv; \ sv_catsv(TeMpSv,ssv); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setiv_mg # define sv_setiv_mg(sv, i) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setiv(TeMpSv,i); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setnv_mg # define sv_setnv_mg(sv, num) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setnv(TeMpSv,num); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setpv_mg # define sv_setpv_mg(sv, ptr) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setpv(TeMpSv,ptr); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setpvn_mg # define sv_setpvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setpvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setsv_mg # define sv_setsv_mg(dsv, ssv) \ STMT_START { \ SV *TeMpSv = dsv; \ sv_setsv(TeMpSv,ssv); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_setuv_mg # define sv_setuv_mg(sv, i) \ STMT_START { \ SV *TeMpSv = sv; \ sv_setuv(TeMpSv,i); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef sv_usepvn_mg # define sv_usepvn_mg(sv, ptr, len) \ STMT_START { \ SV *TeMpSv = sv; \ sv_usepvn(TeMpSv,ptr,len); \ SvSETMAGIC(TeMpSv); \ } STMT_END #endif #ifndef SvVSTRING_mg # define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) #endif /* Hint: sv_magic_portable * This is a compatibility function that is only available with * Devel::PPPort. It is NOT in the perl core. * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when * it is being passed a name pointer with namlen == 0. In that * case, perl 5.8.0 and later store the pointer, not a copy of it. * The compatibility can be provided back to perl 5.004. With * earlier versions, the code will not compile. */ #if (PERL_BCDVERSION < 0x5004000) /* code that uses sv_magic_portable will not compile */ #elif (PERL_BCDVERSION < 0x5008000) # define sv_magic_portable(sv, obj, how, name, namlen) \ STMT_START { \ SV *SvMp_sv = (sv); \ char *SvMp_name = (char *) (name); \ I32 SvMp_namlen = (namlen); \ if (SvMp_name && SvMp_namlen == 0) \ { \ MAGIC *mg; \ sv_magic(SvMp_sv, obj, how, 0, 0); \ mg = SvMAGIC(SvMp_sv); \ mg->mg_len = -42; /* XXX: this is the tricky part */ \ mg->mg_ptr = SvMp_name; \ } \ else \ { \ sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ } \ } STMT_END #else # define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) #endif #ifdef USE_ITHREADS #ifndef CopFILE # define CopFILE(c) ((c)->cop_file) #endif #ifndef CopFILEGV # define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) #endif #ifndef CopFILE_set # define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) #endif #ifndef CopFILESV # define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) #endif #ifndef CopFILEAV # define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) #endif #ifndef CopSTASHPV # define CopSTASHPV(c) ((c)->cop_stashpv) #endif #ifndef CopSTASHPV_set # define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) #endif #ifndef CopSTASH # define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) #endif #ifndef CopSTASH_set # define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) #endif #ifndef CopSTASH_eq # define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ || (CopSTASHPV(c) && HvNAME(hv) \ && strEQ(CopSTASHPV(c), HvNAME(hv))))) #endif #else #ifndef CopFILEGV # define CopFILEGV(c) ((c)->cop_filegv) #endif #ifndef CopFILEGV_set # define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) #endif #ifndef CopFILE_set # define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) #endif #ifndef CopFILESV # define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) #endif #ifndef CopFILEAV # define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) #endif #ifndef CopFILE # define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) #endif #ifndef CopSTASH # define CopSTASH(c) ((c)->cop_stash) #endif #ifndef CopSTASH_set # define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) #endif #ifndef CopSTASHPV # define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) #endif #ifndef CopSTASHPV_set # define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) #endif #ifndef CopSTASH_eq # define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) #endif #endif /* USE_ITHREADS */ #ifndef IN_PERL_COMPILETIME # define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) #endif #ifndef IN_LOCALE_RUNTIME # define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) #endif #ifndef IN_LOCALE_COMPILETIME # define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) #endif #ifndef IN_LOCALE # define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) #endif #ifndef IS_NUMBER_IN_UV # define IS_NUMBER_IN_UV 0x01 #endif #ifndef IS_NUMBER_GREATER_THAN_UV_MAX # define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 #endif #ifndef IS_NUMBER_NOT_INT # define IS_NUMBER_NOT_INT 0x04 #endif #ifndef IS_NUMBER_NEG # define IS_NUMBER_NEG 0x08 #endif #ifndef IS_NUMBER_INFINITY # define IS_NUMBER_INFINITY 0x10 #endif #ifndef IS_NUMBER_NAN # define IS_NUMBER_NAN 0x20 #endif #ifndef GROK_NUMERIC_RADIX # define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) #endif #ifndef PERL_SCAN_GREATER_THAN_UV_MAX # define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 #endif #ifndef PERL_SCAN_SILENT_ILLDIGIT # define PERL_SCAN_SILENT_ILLDIGIT 0x04 #endif #ifndef PERL_SCAN_ALLOW_UNDERSCORES # define PERL_SCAN_ALLOW_UNDERSCORES 0x01 #endif #ifndef PERL_SCAN_DISALLOW_PREFIX # define PERL_SCAN_DISALLOW_PREFIX 0x02 #endif #ifndef grok_numeric_radix #if defined(NEED_grok_numeric_radix) static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); static #else extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); #endif #ifdef grok_numeric_radix # undef grok_numeric_radix #endif #define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) #define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) #if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) bool DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) { #ifdef USE_LOCALE_NUMERIC #ifdef PL_numeric_radix_sv if (PL_numeric_radix_sv && IN_LOCALE) { STRLEN len; char* radix = SvPV(PL_numeric_radix_sv, len); if (*sp + len <= send && memEQ(*sp, radix, len)) { *sp += len; return TRUE; } } #else /* older perls don't have PL_numeric_radix_sv so the radix * must manually be requested from locale.h */ #include dTHR; /* needed for older threaded perls */ struct lconv *lc = localeconv(); char *radix = lc->decimal_point; if (radix && IN_LOCALE) { STRLEN len = strlen(radix); if (*sp + len <= send && memEQ(*sp, radix, len)) { *sp += len; return TRUE; } } #endif #endif /* USE_LOCALE_NUMERIC */ /* always try "." if numeric radix didn't match because * we may have data from different locales mixed */ if (*sp < send && **sp == '.') { ++*sp; return TRUE; } return FALSE; } #endif #endif #ifndef grok_number #if defined(NEED_grok_number) static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); static #else extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); #endif #ifdef grok_number # undef grok_number #endif #define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) #define Perl_grok_number DPPP_(my_grok_number) #if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) int DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) { const char *s = pv; const char *send = pv + len; const UV max_div_10 = UV_MAX / 10; const char max_mod_10 = UV_MAX % 10; int numtype = 0; int sawinf = 0; int sawnan = 0; while (s < send && isSPACE(*s)) s++; if (s == send) { return 0; } else if (*s == '-') { s++; numtype = IS_NUMBER_NEG; } else if (*s == '+') s++; if (s == send) return 0; /* next must be digit or the radix separator or beginning of infinity */ if (isDIGIT(*s)) { /* UVs are at least 32 bits, so the first 9 decimal digits cannot overflow. */ UV value = *s - '0'; /* This construction seems to be more optimiser friendly. (without it gcc does the isDIGIT test and the *s - '0' separately) With it gcc on arm is managing 6 instructions (6 cycles) per digit. In theory the optimiser could deduce how far to unroll the loop before checking for overflow. */ if (++s < send) { int digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { digit = *s - '0'; if (digit >= 0 && digit <= 9) { value = value * 10 + digit; if (++s < send) { /* Now got 9 digits, so need to check each time for overflow. */ digit = *s - '0'; while (digit >= 0 && digit <= 9 && (value < max_div_10 || (value == max_div_10 && digit <= max_mod_10))) { value = value * 10 + digit; if (++s < send) digit = *s - '0'; else break; } if (digit >= 0 && digit <= 9 && (s < send)) { /* value overflowed. skip the remaining digits, don't worry about setting *valuep. */ do { s++; } while (s < send && isDIGIT(*s)); numtype |= IS_NUMBER_GREATER_THAN_UV_MAX; goto skip_value; } } } } } } } } } } } } } } } } } } numtype |= IS_NUMBER_IN_UV; if (valuep) *valuep = value; skip_value: if (GROK_NUMERIC_RADIX(&s, send)) { numtype |= IS_NUMBER_NOT_INT; while (s < send && isDIGIT(*s)) /* optional digits after the radix */ s++; } } else if (GROK_NUMERIC_RADIX(&s, send)) { numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ /* no digits before the radix means we need digits after it */ if (s < send && isDIGIT(*s)) { do { s++; } while (s < send && isDIGIT(*s)); if (valuep) { /* integer approximation is valid - it's 0. */ *valuep = 0; } } else return 0; } else if (*s == 'I' || *s == 'i') { s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; s++; if (s < send && (*s == 'I' || *s == 'i')) { s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; s++; if (s == send || (*s != 'T' && *s != 't')) return 0; s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; s++; } sawinf = 1; } else if (*s == 'N' || *s == 'n') { /* XXX TODO: There are signaling NaNs and quiet NaNs. */ s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; s++; sawnan = 1; } else return 0; if (sawinf) { numtype &= IS_NUMBER_NEG; /* Keep track of sign */ numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; } else if (sawnan) { numtype &= IS_NUMBER_NEG; /* Keep track of sign */ numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; } else if (s < send) { /* we can have an optional exponent part */ if (*s == 'e' || *s == 'E') { /* The only flag we keep is sign. Blow away any "it's UV" */ numtype &= IS_NUMBER_NEG; numtype |= IS_NUMBER_NOT_INT; s++; if (s < send && (*s == '-' || *s == '+')) s++; if (s < send && isDIGIT(*s)) { do { s++; } while (s < send && isDIGIT(*s)); } else return 0; } } while (s < send && isSPACE(*s)) s++; if (s >= send) return numtype; if (len == 10 && memEQ(pv, "0 but true", 10)) { if (valuep) *valuep = 0; return IS_NUMBER_IN_UV; } return 0; } #endif #endif /* * The grok_* routines have been modified to use warn() instead of * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, * which is why the stack variable has been renamed to 'xdigit'. */ #ifndef grok_bin #if defined(NEED_grok_bin) static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #ifdef grok_bin # undef grok_bin #endif #define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) #define Perl_grok_bin DPPP_(my_grok_bin) #if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) UV DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_2 = UV_MAX / 2; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { /* strip off leading b or 0b. for compatibility silently suffer "b" and "0b" as valid binary numbers. */ if (len >= 1) { if (s[0] == 'b') { s++; len--; } else if (len >= 2 && s[0] == '0' && s[1] == 'b') { s+=2; len-=2; } } } for (; len-- && *s; s++) { char bit = *s; if (bit == '0' || bit == '1') { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. With gcc seems to be much straighter code than old scan_bin. */ redo: if (!overflowed) { if (value <= max_div_2) { value = (value << 1) | (bit - '0'); continue; } /* Bah. We're just overflowed. */ warn("Integer overflow in binary number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 2.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount. */ value_nv += (NV)(bit - '0'); continue; } if (bit == '_' && len && allow_underscores && (bit = s[1]) && (bit == '0' || bit == '1')) { --len; ++s; goto redo; } if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal binary digit '%c' ignored", *s); break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Binary number > 0b11111111111111111111111111111111 non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #ifndef grok_hex #if defined(NEED_grok_hex) static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #ifdef grok_hex # undef grok_hex #endif #define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) #define Perl_grok_hex DPPP_(my_grok_hex) #if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) UV DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_16 = UV_MAX / 16; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; const char *xdigit; if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { /* strip off leading x or 0x. for compatibility silently suffer "x" and "0x" as valid hex numbers. */ if (len >= 1) { if (s[0] == 'x') { s++; len--; } else if (len >= 2 && s[0] == '0' && s[1] == 'x') { s+=2; len-=2; } } } for (; len-- && *s; s++) { xdigit = strchr((char *) PL_hexdigit, *s); if (xdigit) { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. With gcc seems to be much straighter code than old scan_hex. */ redo: if (!overflowed) { if (value <= max_div_16) { value = (value << 4) | ((xdigit - PL_hexdigit) & 15); continue; } warn("Integer overflow in hexadecimal number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 16.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount of 16-tuples. */ value_nv += (NV)((xdigit - PL_hexdigit) & 15); continue; } if (*s == '_' && len && allow_underscores && s[1] && (xdigit = strchr((char *) PL_hexdigit, s[1]))) { --len; ++s; goto redo; } if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal hexadecimal digit '%c' ignored", *s); break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Hexadecimal number > 0xffffffff non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #ifndef grok_oct #if defined(NEED_grok_oct) static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); static #else extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); #endif #ifdef grok_oct # undef grok_oct #endif #define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) #define Perl_grok_oct DPPP_(my_grok_oct) #if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) UV DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) { const char *s = start; STRLEN len = *len_p; UV value = 0; NV value_nv = 0; const UV max_div_8 = UV_MAX / 8; bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; bool overflowed = FALSE; for (; len-- && *s; s++) { /* gcc 2.95 optimiser not smart enough to figure that this subtraction out front allows slicker code. */ int digit = *s - '0'; if (digit >= 0 && digit <= 7) { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. */ redo: if (!overflowed) { if (value <= max_div_8) { value = (value << 3) | digit; continue; } /* Bah. We're just overflowed. */ warn("Integer overflow in octal number"); overflowed = TRUE; value_nv = (NV) value; } value_nv *= 8.0; /* If an NV has not enough bits in its mantissa to * represent a UV this summing of small low-order numbers * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply value_nv by the * right amount of 8-tuples. */ value_nv += (NV)digit; continue; } if (digit == ('_' - '0') && len && allow_underscores && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) { --len; ++s; goto redo; } /* Allow \octal to work the DWIM way (that is, stop scanning * as soon as non-octal characters are seen, complain only iff * someone seems to want to use the digits eight and nine). */ if (digit == 8 || digit == 9) { if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) warn("Illegal octal digit '%c' ignored", *s); } break; } if ( ( overflowed && value_nv > 4294967295.0) #if UVSIZE > 4 || (!overflowed && value > 0xffffffff ) #endif ) { warn("Octal number > 037777777777 non-portable"); } *len_p = s - start; if (!overflowed) { *flags = 0; return value; } *flags = PERL_SCAN_GREATER_THAN_UV_MAX; if (result) *result = value_nv; return UV_MAX; } #endif #endif #if !defined(my_snprintf) #if defined(NEED_my_snprintf) static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); static #else extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); #endif #define my_snprintf DPPP_(my_my_snprintf) #define Perl_my_snprintf DPPP_(my_my_snprintf) #if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) int DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) { dTHX; int retval; va_list ap; va_start(ap, format); #ifdef HAS_VSNPRINTF retval = vsnprintf(buffer, len, format, ap); #else retval = vsprintf(buffer, format, ap); #endif va_end(ap); if (retval < 0 || (len > 0 && (Size_t)retval >= len)) Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); return retval; } #endif #endif #if !defined(my_sprintf) #if defined(NEED_my_sprintf) static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); static #else extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); #endif #define my_sprintf DPPP_(my_my_sprintf) #define Perl_my_sprintf DPPP_(my_my_sprintf) #if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) int DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) { va_list args; va_start(args, pat); vsprintf(buffer, pat, args); va_end(args); return strlen(buffer); } #endif #endif #ifdef NO_XSLOCKS # ifdef dJMPENV # define dXCPT dJMPENV; int rEtV = 0 # define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) # define XCPT_TRY_END JMPENV_POP; # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW JMPENV_JUMP(rEtV) # else # define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 # define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) # define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW Siglongjmp(top_env, rEtV) # endif #endif #if !defined(my_strlcat) #if defined(NEED_my_strlcat) static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); static #else extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); #endif #define my_strlcat DPPP_(my_my_strlcat) #define Perl_my_strlcat DPPP_(my_my_strlcat) #if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) Size_t DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) { Size_t used, length, copy; used = strlen(dst); length = strlen(src); if (size > 0 && used < size - 1) { copy = (length >= size - used) ? size - used - 1 : length; memcpy(dst + used, src, copy); dst[used + copy] = '\0'; } return used + length; } #endif #endif #if !defined(my_strlcpy) #if defined(NEED_my_strlcpy) static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); static #else extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); #endif #define my_strlcpy DPPP_(my_my_strlcpy) #define Perl_my_strlcpy DPPP_(my_my_strlcpy) #if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) Size_t DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) { Size_t length, copy; length = strlen(src); if (size > 0) { copy = (length >= size) ? size - 1 : length; memcpy(dst, src, copy); dst[copy] = '\0'; } return length; } #endif #endif #ifndef PERL_PV_ESCAPE_QUOTE # define PERL_PV_ESCAPE_QUOTE 0x0001 #endif #ifndef PERL_PV_PRETTY_QUOTE # define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE #endif #ifndef PERL_PV_PRETTY_ELLIPSES # define PERL_PV_PRETTY_ELLIPSES 0x0002 #endif #ifndef PERL_PV_PRETTY_LTGT # define PERL_PV_PRETTY_LTGT 0x0004 #endif #ifndef PERL_PV_ESCAPE_FIRSTCHAR # define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 #endif #ifndef PERL_PV_ESCAPE_UNI # define PERL_PV_ESCAPE_UNI 0x0100 #endif #ifndef PERL_PV_ESCAPE_UNI_DETECT # define PERL_PV_ESCAPE_UNI_DETECT 0x0200 #endif #ifndef PERL_PV_ESCAPE_ALL # define PERL_PV_ESCAPE_ALL 0x1000 #endif #ifndef PERL_PV_ESCAPE_NOBACKSLASH # define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 #endif #ifndef PERL_PV_ESCAPE_NOCLEAR # define PERL_PV_ESCAPE_NOCLEAR 0x4000 #endif #ifndef PERL_PV_ESCAPE_RE # define PERL_PV_ESCAPE_RE 0x8000 #endif #ifndef PERL_PV_PRETTY_NOCLEAR # define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR #endif #ifndef PERL_PV_PRETTY_DUMP # define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE #endif #ifndef PERL_PV_PRETTY_REGPROP # define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE #endif /* Hint: pv_escape * Note that unicode functionality is only backported to * those perl versions that support it. For older perl * versions, the implementation will fall back to bytes. */ #ifndef pv_escape #if defined(NEED_pv_escape) static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); static #else extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); #endif #ifdef pv_escape # undef pv_escape #endif #define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) #define Perl_pv_escape DPPP_(my_pv_escape) #if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) char * DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags) { const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; char octbuf[32] = "%123456789ABCDF"; STRLEN wrote = 0; STRLEN chsize = 0; STRLEN readsize = 1; #if defined(is_utf8_string) && defined(utf8_to_uvchr) bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; #endif const char *pv = str; const char * const end = pv + count; octbuf[0] = esc; if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) sv_setpvs(dsv, ""); #if defined(is_utf8_string) && defined(utf8_to_uvchr) if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) isuni = 1; #endif for (; pv < end && (!max || wrote < max) ; pv += readsize) { const UV u = #if defined(is_utf8_string) && defined(utf8_to_uvchr) isuni ? utf8_to_uvchr((U8*)pv, &readsize) : #endif (U8)*pv; const U8 c = (U8)u & 0xFF; if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { if (flags & PERL_PV_ESCAPE_FIRSTCHAR) chsize = my_snprintf(octbuf, sizeof octbuf, "%"UVxf, u); else chsize = my_snprintf(octbuf, sizeof octbuf, "%cx{%"UVxf"}", esc, u); } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { chsize = 1; } else { if (c == dq || c == esc || !isPRINT(c)) { chsize = 2; switch (c) { case '\\' : /* fallthrough */ case '%' : if (c == esc) octbuf[1] = esc; else chsize = 1; break; case '\v' : octbuf[1] = 'v'; break; case '\t' : octbuf[1] = 't'; break; case '\r' : octbuf[1] = 'r'; break; case '\n' : octbuf[1] = 'n'; break; case '\f' : octbuf[1] = 'f'; break; case '"' : if (dq == '"') octbuf[1] = '"'; else chsize = 1; break; default: chsize = my_snprintf(octbuf, sizeof octbuf, pv < end && isDIGIT((U8)*(pv+readsize)) ? "%c%03o" : "%c%o", esc, c); } } else { chsize = 1; } } if (max && wrote + chsize > max) { break; } else if (chsize > 1) { sv_catpvn(dsv, octbuf, chsize); wrote += chsize; } else { char tmp[2]; my_snprintf(tmp, sizeof tmp, "%c", c); sv_catpvn(dsv, tmp, 1); wrote++; } if (flags & PERL_PV_ESCAPE_FIRSTCHAR) break; } if (escaped != NULL) *escaped= pv - str; return SvPVX(dsv); } #endif #endif #ifndef pv_pretty #if defined(NEED_pv_pretty) static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); static #else extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); #endif #ifdef pv_pretty # undef pv_pretty #endif #define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) #define Perl_pv_pretty DPPP_(my_pv_pretty) #if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) char * DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags) { const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; STRLEN escaped; if (!(flags & PERL_PV_PRETTY_NOCLEAR)) sv_setpvs(dsv, ""); if (dq == '"') sv_catpvs(dsv, "\""); else if (flags & PERL_PV_PRETTY_LTGT) sv_catpvs(dsv, "<"); if (start_color != NULL) sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); if (end_color != NULL) sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); if (dq == '"') sv_catpvs(dsv, "\""); else if (flags & PERL_PV_PRETTY_LTGT) sv_catpvs(dsv, ">"); if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) sv_catpvs(dsv, "..."); return SvPVX(dsv); } #endif #endif #ifndef pv_display #if defined(NEED_pv_display) static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); static #else extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); #endif #ifdef pv_display # undef pv_display #endif #define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) #define Perl_pv_display DPPP_(my_pv_display) #if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) char * DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) { pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); if (len > cur && pv[cur] == '\0') sv_catpvs(dsv, "\\0"); return SvPVX(dsv); } #endif #endif #endif /* _P_P_PORTABILITY_H_ */ /* End of File ppport.h */ Compress-Raw-Lzma-2.101/Changes0000644000175000017500000001563714014210736014731 0ustar paulpaulCHANGES ------- 2.101 20 February 2021 * fix version numbers in meta files 2.100 7 January 2021 * Expose liblzma's 'preset_dict' feature https://github.com/pmqs/Compress-Raw-Lzma/pull/6 4d9d4e596c4f567c87626a827e39c4435e62472d fix typo dc394d53b0575edf8f72e28829a2ff9faea7e729 Add t/10preset_dict.t c5afb68e2a3a4b2fc4e548ffa61d2a3a383b5c96 Add cast to deRef 32f9085aba510c4d99d4a374406e734b13b82eef fix minor typos 55b8d6a6f65a1d6426c55f5b51aefdba6dabfbb3 fix merge issue 9eb88de7abaaefe736d475260c73de525e7ae39f Merge branch 'master' of https://github.com/pmqs/Compress-Raw-Lzma 3432a769b283ac5dc9fd757e973cc8aefc1e2345 Merge pull request #6 from anall/wip/preset_dictionary 68fe695c16b14a983f39c8c8567557148bbc43ca Expose the preset_dict feature from liblzma when creating a Lzma filter * trim whitespace 4ca252f1e1d740489dbd3736ab1f74e1492dff6d 2.096 31 July 2020 * No changes 2.095 19 July 2020 * No changes 2.094 13 July 2020 * Issue with Append mode & SvOOK Issue https://github.com/pmqs/Compress-Raw-Lzma/issues/4 10fbd83afbf02b255bfac79fc38f6b507bc93b4e 2.093 7 December 2019 * Lzma.xs -- add allocator to lzma_properties_decode Fixes chach on Windows. Issue https://github.com/pmqs/Compress-Raw-Lzma/issues/2 155b1730163301f59260316b2c011ec41ff4e378 2.092 1 December 2019 * use lzma_llocator Issue https://github.com/pmqs/Compress-Raw-Lzma/issues/2 2cf13f99ef6ce862b138f83f6d3d9597d59106b9 2.091 23 November 2019 * More updates for memory leak in raw_decoder Issue https://github.com/pmqs/Compress-Raw-Lzma/issues/1 08e80080b0d94e17eb1e9ceed589b145cdaf8495 ac9b6e5c9c6966a40d1a6caf2f2c6dc021ed50d9 * Silence compiler warning https://github.com/pmqs/Compress-Raw-Lzma/issues/1 c496f8716b3651cab2753cf90a3aa47a7ce0a339 2.090 9 November 2019 * Memory leak in raw_decoder Issue https://github.com/pmqs/Compress-Raw-Lzma/issues/1 05c0eac3ab1edd05e5bc945463af004dcbc88c00 b020045e17a7ab7338c010f5100ec63e8e8e9040 2.089 3 November 2019 * No Changes 2.088 31 October 2019 * Add SUPPPORT section 11a43c1b8053a0502d7a89bcfeb62f8fe5da7f14 2.086 31 March 2019 * Moved source to github https://github.com/pmqs/Compress-Raw-Lzma * Add META_MERGE to Makefile.PL * Added meta-json.t & meta-yaml.t 2.085 12 January 2019 * t/050interop-xz.t Test harness can use a lot of memory. On systems with small memory t/050interop-xz.t can fail. Free memory before invoking xz. [rt.cpan.org #128194] may fail (memory leak?) 2.084 5 January 2019 * No Changes 2.083 30 December 2018 * No Changes 2.082 15 April 2018 * README Document clash with older version of liblzma #125046: Undefined symbol "lzma_properties_size" * Lzma.pm #125093: [PATCH] fix spelling mistakes: defaut -> default 2.081 4 April 2018 * previous release used $^W instead of use warnings. Fixed. 2.080 2 April 2018 * No Changes 2.074 18 Feb 2017 * Lzma.xs Comment out unused variables & remove C++-ism #120272: [PATCH] Unbreak compilation * Make failure when LZMA_VERSION != lzma_version_number more excplicit * Added interface to LZMA_VERSION and LZMA_VERSION_STRING 2.072 4 Feb 2017 * Makefile.PL #120084: Need Fix for Makefile.PL depending on . in @INC * #105460: use of Compress::Raw::Lzma::RawDecoder fails with large amount of data AppendOutput for "encode" methods said default was 1. It is actually. 2.070 28 Dec 2016 * #119207: Compress-Raw-Lzma-2.069 bug report 2.069 26 Sep 2015 * No Changes 2.068 23 Dec 2014 * No Changes 2.067 8 Dec 2014 * No Changes 2.066 21 Sept 2014 * No Changes 2.064 1 February 2014 * [PATCH] Handle non-PVs better [#91558] 2.062 11 August 2013 * fix typos [RT #86418] 2.061 19 May 2013 * silence compiler warning by making 2nd parameter to DispStream a const char* 2.060 7 January 2013 * No Changes 2.059 24 November 2012 * Copy-on-write support 2.058 12 November 2012 * No Changes 2.057 10 November 2012 * update to ppport.h that includes SvPV_nomg_nolen * added PERL_NO_GET_CONTEXT 2.055 5 August 2012 * Fix misuse of magic in API 2.052 29 April 2012 * Fixed to allow building with C++ 2.049 17 February 2012 * README wasn't included in the distribution. 2.048 29 January 2012 * No Changes 2.047 28 January 2012 * Set minimum Perl version to 5.6 2.045 3 December 2011 * Moved FAQ.pod to IO::Compress 2.044 2 December 2011 * Moved FAQ.pod under the lib directory so it can get installed 2.043 20 November 2011 * No Changes 2.042 17 November 2011 * No Changes 2.040 28 October 2011 * No Changes 2.039 28 October 2011 * croak if attempt to freeze/thaw compression object [RT #69985] 2.037 22 June 2011 * No Changes 2.036 18 June 2011 * A number of changes to facilitate adding LZMA support to IO::Compress::Zip & IO::Uncompress::Unzip * Added preset filters Lzma::Filter::Lzma1::Preset & Lzma::Filter::Lzma2::Preset * Added forZip option to Compress::Raw::Lzma::Encoder * Added properties option to Compress::Raw::Lzma::RawDecoder 2.035 6 May 2011 * No Changes 2.033 11 Jan 2011 * Changed default MemLimit from 128Meg to unlimited. 2.032 4 Jan 2011 * No Changes 2.031 26 Oct 20100 * Changed to build with XZ 5.0.0 Dropped symbolic constants provided by subblock.h [RT #62461] 2.030 22 July 2010 * No Changes 2.029 8 May 2010 * Compress::Raw::Lzma::EasyEncoder with Preset => 9 needs a *lot* of memory. This was triggering smoke failures on some systems. Reworked that test harness to spot the memory failure. 2.028 3 May 2010 * Remove 'Persistent' option from Lzma::Filter::Lzma. The underlying lzma library doesn't support it anymore. [RT #57080] * Silenced a pile of compiler warnings. 2.027 24 April 2010 * No Changes 2.026 7 April 2010 * No Changes 2.025 27 March 2010 * No Changes 2.024 7 January 2010 * Documentation updates. * Silence the warning "UNIVERSAL->import is deprecated and will be removed in a future perl" when running perl 5.11 * Fixed a problem with the code that generated the LZMA constants. This issue was found in with the version of the lzma library that comes with Ubuntu 9.10 Pronlem reported by Graham Jenkins 2.023 9 November 2009 * First public beta Compress-Raw-Lzma-2.101/config.in0000755000175000017500000000105013747272630015233 0ustar paulpaul# Filename: config.in # # written by Paul Marquess # last modified 12th October 2009 # version 1.000 # # # This file is used to control which zlib library will be used by # Compress::Raw::Lzma # # See to the sections below in the README file for details of how to # use this file. # # Controlling the version of liblzma used by Compress::Raw::Lzma # INCLUDE = /usr/local/include LIB = /usr/local/lib #INCLUDE = ./libraries/5.2.1/include #LIB = ./libraries/5.2.1/lib # end of file config.in Compress-Raw-Lzma-2.101/Makefile.PL0000644000175000017500000001715313747272633015423 0ustar paulpaul#! perl -w use strict ; require 5.006 ; use lib '.'; use private::MakeUtil; use ExtUtils::MakeMaker 5.16 ; my $WALL= ''; $WALL = ' -Wall -Wno-comment ' if $Config{'cc'} =~ /gcc/ ; my $LIBLZMA_LIB ; my $LIBLZMA_INCLUDE ; my $LIBS = '-llzma'; ParseCONFIG() ; UpDowngrade(getPerlFiles('MANIFEST')) unless $ENV{PERL_CORE}; WriteMakefile( NAME => 'Compress::Raw::Lzma', VERSION_FROM => 'lib/Compress/Raw/Lzma.pm', INC => "-I$LIBLZMA_INCLUDE" , LIBS => ["-L${LIBLZMA_LIB} $LIBS"], DEFINE => "$WALL " , XS => { 'Lzma.xs' => 'Lzma.c'}, 'depend' => { 'Makefile' => 'config.in' }, 'dist' => { COMPRESS => 'gzip', TARFLAGS => '-chvf', SUFFIX => 'gz', DIST_DEFAULT => 'MyTrebleCheck tardist', }, ( $ENV{SKIP_FOR_CORE} ? (MAN3PODS => {}) : () ), ( $] >= 5.005 ? (ABSTRACT_FROM => 'lib/Compress/Raw/Lzma.pm', AUTHOR => 'Paul Marquess ') : () ), ( eval { ExtUtils::MakeMaker->VERSION(6.46) } ? ( META_MERGE => { "meta-spec" => { version => 2 }, no_index => { directory => [ 't', 'private' ], }, resources => { bugtracker => { web => 'https://github.com/pmqs/Compress-Raw-Lzma/issues' }, homepage => 'https://github.com/pmqs/Compress-Raw-Lzma', repository => { type => 'git', url => 'git://github.com/pmqs/Compress-Raw-Lzma.git', web => 'https://github.com/pmqs/Compress-Raw-Lzma', }, }, } ) : () ), ((ExtUtils::MakeMaker->VERSION() gt '6.30') ? ('LICENSE' => 'perl') : ()), ) ; my @names; while () { chomp; s/^\s*//; s/\s*$//; next if /^[^A-Z]/i || /^$/; my ($name, $type) = split /\s+/, $_; if (defined $type && $type =~ /enum/i) { push @names, { name => $name, macro => ["#if 1\n", "#endif\n"] } } elsif (defined $type && $type =~ /string/i) { push @names, { name => $name, type => "PV", macro => ["#ifdef $name \n", "#endif\n"] } } elsif (defined $type && $type =~ /int/i) { push @names, { name => $name, type => "IV", macro => ["#if 1\n", "#endif\n"] } } else { push @names, { name => $name } } } if (eval {require ExtUtils::Constant; 1}) { # Check the constants above all appear in @EXPORT in Lzma.pm my %names = map { $_ => 1 } map { $_->{name} } @names ; open F, ") { last if /^\s*\@EXPORT\s+=\s+qw\(/ ; } while () { last if /^\s*\)/ ; /(\S+)/ ; delete $names{$1} if defined $1 ; } close F ; if ( keys %names ) { my $missing = join ("\n\t", sort keys %names) ; die "The following names are missing from \@EXPORT in Lzma.pm\n" . "\t$missing\n" ; } ExtUtils::Constant::WriteConstants( NAME => 'Lzma', NAMES => \@names, C_FILE => 'constants.h', XS_FILE => 'constants.xs', ); } else { foreach my $name (qw( constants.h constants.xs )) { my $from = catfile('fallback', $name); copy ($from, $name) or die "Can't copy $from to $name: $!"; } } sub ParseCONFIG { my ($k, $v) ; my @badkey = () ; my %Info = () ; my @Options = qw( INCLUDE LIB ) ; my %ValidOption = map {$_, 1} @Options ; my %Parsed = %ValidOption ; my $CONFIG = 'config.in' ; print "Parsing $CONFIG...\n" ; open(F, "<$CONFIG") or die "Cannot open file $CONFIG: $!\n" ; while () { s/^\s*|\s*$//g ; next if /^\s*$/ or /^\s*#/ ; s/\s*#\s*$// ; ($k, $v) = split(/\s+=\s+/, $_, 2) ; $k = uc $k ; if ($ValidOption{$k}) { delete $Parsed{$k} ; $Info{$k} = $v ; } else { push(@badkey, $k) ; } } close F ; print "Unknown keys in $CONFIG ignored [@badkey]\n" if @badkey ; # check parsed values my @missing = () ; die "The following keys are missing from $CONFIG [@missing]\n" if @missing = keys %Parsed ; $LIBLZMA_INCLUDE = defined $ENV{'LIBLZMA_INCLUDE'} ? $ENV{'LIBLZMA_INCLUDE'} : $Info{'INCLUDE'} ; $LIBLZMA_LIB = defined $ENV{'LIBLZMA_LIB'} ? $ENV{'LIBLZMA_LIB'} : $Info{'LIB'} ; if ($^O eq 'VMS') { $LIBLZMA_INCLUDE = VMS::Filespec::vmspath($LIBLZMA_INCLUDE); $LIBLZMA_LIB = VMS::Filespec::vmspath($LIBLZMA_LIB); } print < 2 + $extra ; use_ok('Compress::Raw::Lzma') ; } # Check lzma_version and LZMA_VERSION are the same. SKIP: { skip "TEST_SKIP_VERSION_CHECK is set", 1 if $ENV{TEST_SKIP_VERSION_CHECK}; my $lzma_h = LZMA_VERSION ; my $liblzma = Compress::Raw::Lzma::lzma_version_number; my $lzma_h_string = LZMA_VERSION_STRING ; my $liblzma_string = Compress::Raw::Lzma::lzma_version_string; is($lzma_h, $liblzma, "LZMA_VERSION ($lzma_h_string) matches Compress::Raw::Lzma::lzma_version") or diag < ; close F ; } return @strings if wantarray ; return join "", @strings ; } sub readWithXz { my $file = shift ; my $opts = $_[1] || ""; my $lex = new LexFile my $outfile; my $comp = "$XZ -dc $opts 2>/dev/null" ; if (system("$comp $file >$outfile") == 0 ) { $_[0] = rdFile($outfile); return 1 ; } diag "'$comp' failed: \$?=$? \$!=$!"; return 0 ; } sub writeWithXz { my $content = shift ; my $output = \$_[0] ; my $options = $_[1] || ''; my $lex1 = new LexFile my $infile; my $lex2 = new LexFile my $outfile; writeFile($infile, $content); my $comp = "$XZ -c $options $infile >$outfile 2>/dev/null" ; if (system($comp) == 0) { $$output = rdFile($outfile); return 1 ; } diag "'$comp' failed: \$?=$? \$!=$!"; return 0 ; } BEGIN { # Check external xz is available my $name = $^O =~ /mswin/i ? 'xz.exe' : 'xz'; my $split = $^O =~ /mswin/i ? ";" : ":"; for my $dir (reverse split $split, $ENV{PATH}) { $XZ = "$dir/$name" if -x "$dir/$name" ; } # Handle spaces in path to xz $XZ = "\"$XZ\"" if defined $XZ && $XZ =~ /\s/; plan(skip_all => "Cannot find $name") if ! $XZ ; plan(skip_all => "$name doesn't work as expected") if ! ExternalXzWorks(); # use Test::NoWarnings, if available my $extra = 0 ; $extra = 1 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; plan tests => 1006 + $extra ; use_ok('Compress::Raw::Lzma') ; } sub compressWith { my $class = shift; my $xz_opts = shift; my %opts = @_ ; my $contents = '' ; foreach (1 .. 5000) { $contents .= chr int rand 255 } my ($x, $err) = $class->new(AppendOutput => 1, %opts) ; SKIP: { skip "Not Enough Memory", 7 if $err == LZMA_MEM_ERROR; isa_ok $x, $class; isa_ok $x, "Compress::Raw::Lzma::Encoder"; cmp_ok $err, '==', LZMA_OK," status is LZMA_OK" or diag "Error is $err"; my (%X, $Y, %Z, $X, $Z); cmp_ok $x->code($contents, $X), '==', LZMA_OK, " compressed ok" ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END, " flushed ok" ; my $lex = new LexFile my $file; writeFile($file, $X); undef $x ; # displayMemoryUsage("Before"); my $got = ''; ok readWithXz($file, $got, $xz_opts), " readWithXz returns 0"; # displayMemoryUsage("After"); is $got, $contents, " got content"; } } sub uncompressWith { my $class = shift; my $xz_opts = shift; my %opts = @_ ; my $contents = '' ; foreach (1 .. 5000) { $contents .= chr int rand 255 } my $compressed; writeWithXz($contents, $compressed, $xz_opts); my ($x, $err) = $class->new(AppendOutput => 1, %opts) ; isa_ok $x, $class; isa_ok $x, "Compress::Raw::Lzma::Decoder"; cmp_ok $err, '==', LZMA_OK," status is LZMA_OK" ; my $got = ''; cmp_ok $x->code($compressed, $got), '==', LZMA_STREAM_END, " compressed ok" ; #is $got, $contents, "got content"; ok $got eq $contents, " got content"; } { title "Test AloneEncoder interop with xz" ; compressWith('Compress::Raw::Lzma::AloneEncoder', '-F auto'); compressWith('Compress::Raw::Lzma::AloneEncoder', '-F auto', Filter => Lzma::Filter::Lzma1 ); # # Error # eval { # compressWith('Compress::Raw::Lzma::AloneEncoder', '-F auto', # Filter => Lzma::Filter::X86); # }; # like $@, mkErr("filter is not an Lzma::Filter::Lzma1 object"), " catch error"; compressWith('Compress::Raw::Lzma::AloneEncoder', '-F auto', Filter => Lzma::Filter::Lzma1( #DictSize => 1024 * 100, Lc => LZMA_LCLP_MAX, #Lp => 3, Pb => LZMA_PB_MAX, Mode => LZMA_MODE_FAST, Nice => 128, Mf => LZMA_MF_HC4, Depth => 77 ) ) ; sub compressAloneWithParam { my $name = shift; my $range = shift; for my $value (@$range) { title "test $name with $value"; compressWith('Compress::Raw::Lzma::AloneEncoder', '-F auto', Filter => Lzma::Filter::Lzma1($name, $value) ) ; } } compressAloneWithParam "Lc", [ 0 .. 4 ]; #compressAloneWithParam "Lp", [ 0 .. 4 ]; compressAloneWithParam "Mode", [ LZMA_MODE_NORMAL, LZMA_MODE_FAST ]; compressAloneWithParam "Mf", [ LZMA_MF_HC3, LZMA_MF_HC4, LZMA_MF_BT2, LZMA_MF_BT3, LZMA_MF_BT4]; #compressAloneWithParam "Nice", [ 2 .. 273 ]; #compressAloneWithParam "Depth", [ 2 .. 273 ]; } { # EasyEncoder for my $check (LZMA_CHECK_NONE, LZMA_CHECK_CRC32, LZMA_CHECK_CRC64, LZMA_CHECK_SHA256) { for my $extreme (0 .. 1) { for my $preset (0 .. 9) { title "Test EasyEncoder interop with xz, Check $check, Extreme $extreme, Preset $preset" ; compressWith('Compress::Raw::Lzma::EasyEncoder', '-F xz', Check => $check, Extreme => $extreme, Preset => $preset); } } } } my @Filters = ( ["Lzma2", [ Lzma::Filter::Lzma2 ] ], ["x86 + Lzma2", [ Lzma::Filter::X86, Lzma::Filter::Lzma2 ] ], ["x86 + Delta + Lzma2", [ Lzma::Filter::X86, Lzma::Filter::Delta, Lzma::Filter::Lzma2 ] ], ["x86 + Delta + x86 + Lzma2", [ Lzma::Filter::X86, Lzma::Filter::Delta, Lzma::Filter::X86, Lzma::Filter::Lzma2 ] ], ); { # StreamEncoder for my $check (LZMA_CHECK_NONE LZMA_CHECK_CRC32 LZMA_CHECK_CRC64 LZMA_CHECK_SHA256) { for my $f (@Filters) { my ($name, $filter) = @$f; title "Test StreamEncoder interop with xz, Filter '$name' Check $check" ; compressWith('Compress::Raw::Lzma::StreamEncoder', '-F xz', Check => $check, Filter => $filter, ); } } compressWith('Compress::Raw::Lzma::StreamEncoder', '-F auto', Filter => Lzma::Filter::Lzma2( #DictSize => 44, Lc => LZMA_LCLP_MAX, #Lp => 3, Pb => LZMA_PB_MAX, Mode => LZMA_MODE_FAST, Nice => 128, Mf => LZMA_MF_HC4, Depth => 77) ) ; sub compressStreamWithParam { my $name = shift; my $range = shift; for my $value (@$range) { title "test $name with $value"; compressWith('Compress::Raw::Lzma::StreamEncoder', '-F auto', Filter => Lzma::Filter::Lzma2($name, $value) ) ; } } compressStreamWithParam "Lc", [ 0 .. 4 ]; #compressStreamWithParam "Lp", [ 0 .. 4 ]; compressStreamWithParam "Mode", [ LZMA_MODE_NORMAL, LZMA_MODE_FAST ]; compressStreamWithParam "Mf", [ LZMA_MF_HC3, LZMA_MF_HC4, LZMA_MF_BT2, LZMA_MF_BT3, LZMA_MF_BT4]; #compressStreamWithParam "Nice", [ 2 .. 273 ]; #compressStreamWithParam "Depth", [ 2 .. 273 ]; } { title "Test RawEncoder interop with xz" ; compressWith('Compress::Raw::Lzma::RawEncoder', '-F raw'); sub compressRawWithParam { my $name = shift; my $range = shift; my $xz_opts = shift || ""; my $xz_values = shift || $range; for my $value (@$range) { my $xz_value = shift @$xz_values; title "test $name with $value"; compressWith('Compress::Raw::Lzma::RawEncoder', "-F raw $xz_opts=$xz_value", Filter => Lzma::Filter::Lzma2($name, $value) ) ; } } compressRawWithParam "Lc", [ 0 .. 4 ], "--lzma2=lc"; #compressRawWithParam "Lp", [ 0 .. 4 ], "--lzma2=lp"; compressRawWithParam "Mode", [ LZMA_MODE_NORMAL, LZMA_MODE_FAST ], "--lzma2=mode", ["normal", "fast"]; compressRawWithParam "Mf", [ LZMA_MF_HC3, LZMA_MF_HC4, LZMA_MF_BT2, LZMA_MF_BT3, LZMA_MF_BT4], "--lzma2=mf", [qw(hc3 hc4 bt2 bt3 bt4)]; #compressRawWithParam "Nice", [ 2 .. 273 ], "--lzma2=nice"; #compressRawWithParam "Depth", [ 2 .. 273 ], "--lzma2=depth"; } { title "Test AutoDecoder interop with xz" ; uncompressWith('Compress::Raw::Lzma::AutoDecoder', '-F xz'); } { title "Test AloneDecoder interop with xz" ; uncompressWith('Compress::Raw::Lzma::AloneDecoder', '-F lzma'); } { title "Test StreamDecoder interop with xz" ; uncompressWith('Compress::Raw::Lzma::StreamDecoder', '-F xz'); } { title "Test RawDecoder interop with xz" ; uncompressWith('Compress::Raw::Lzma::RawDecoder', '-F raw'); } Compress-Raw-Lzma-2.101/t/09limitoutput.t0000644000175000017500000000650413747272674016654 0ustar paulpaulBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t t/compress); use strict; use warnings; use bytes; use Test::More ; use CompTestUtils; BEGIN { # use Test::NoWarnings, if available my $extra = 0 ; $extra = 1 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; plan tests => 54 + $extra ; use_ok('Compress::Raw::Lzma', 2) ; } my $hello = "I am a HAL 9000 computer" x 2001; my $tmp = $hello ; my ($err, $x, $X, $status); ok( ($x, $err) = new Compress::Raw::Lzma::AloneEncoder (-AppendOutput => 1)); ok $x ; cmp_ok $err, '==', LZMA_OK, " status is LZMA_OK" ; my $out ; $status = $x->code($tmp, $out) ; cmp_ok $status, '==', LZMA_OK, " status is LZMA_OK" ; cmp_ok $x->flush($out), '==', LZMA_STREAM_END, " flush returned LZMA_STREAM_END" ; sub getOut { my $x = ''; return \$x } for my $bufsize (1, 2, 3, 13, 4096, 1024*10) { print "#\n#Bufsize $bufsize\n#\n"; $tmp = $out; my $k; ok(($k, $err) = new Compress::Raw::Lzma::AloneDecoder( AppendOutput => 1, LimitOutput => 1, #Bufsize => $bufsize )); ok $k ; cmp_ok $err, '==', LZMA_OK, " status is LZMA_OK" ; #ok ! defined $k->msg(), " no msg" ; #is $k->total_in(), 0, " total_in == 0" ; #is $k->total_out(), 0, " total_out == 0" ; my $GOT = getOut(); my $prev; my $deltaOK = 1; my $looped = 0; while (length $tmp) { ++ $looped; my $prev = length $GOT; $status = $k->code($tmp, $GOT) ; last if $status != LZMA_OK; $deltaOK = 0 if length($GOT) - $prev > $bufsize; } ok $deltaOK, " Output Delta never > $bufsize"; cmp_ok $looped, '>=', 1, " looped $looped"; is length($tmp), 0, " length of input buffer is zero"; cmp_ok $status, '==', LZMA_STREAM_END, " status is LZMA_STREAM_END" ; is length $$GOT, length $hello, " got expected output length" ; #is $$GOT, $hello, " got expected output" ; #ok ! defined $k->msg(), " no msg" ; #is $k->total_in(), length $out, " length total_in ok" ; #is $k->total_out(), length $hello, " length total_out ok " . $k->total_out() ; } exit; sub getit { my $obj = shift ; my $input = shift; my $data ; #1 while $obj->code($input, $data) != LZMA_STREAM_END ; 1 while $obj->code($input, $data) == LZMA_OK ; return \$data ; } { title "regression test"; my ($err, $x, $X, $status); ok( ($x, $err) = new Compress::Raw::Lzma::AloneEncoder (-AppendOutput => 1)); ok $x ; cmp_ok $err, '==', LZMA_OK, " status is LZMA_OK" ; my $line1 = ("abcdefghijklmnopq" x 1000) . "\n" ; my $line2 = "second line\n" ; my $text = $line1 . $line2 ; my $tmp = $text; my $out ; $status = $x->code($tmp, $out) ; cmp_ok $status, '==', LZMA_OK, " status is LZMA_OK" ; cmp_ok $x->flush($out), '==', LZMA_STREAM_END, " flush returned LZMA_STREAM_END" ; my $k; ok(($k, $err) = new Compress::Raw::Lzma::AloneDecoder( AppendOutput => 1, LimitOutput => 1 )); my $c = getit($k, $out); is $$c, $text; } Compress-Raw-Lzma-2.101/t/19nonpv.t0000644000175000017500000000510613747272675015414 0ustar paulpaulBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t t/compress); use strict; use warnings; use Test::More ; use CompTestUtils; BEGIN { # use Test::NoWarnings, if available my $extra = 0 ; $extra = 1 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; plan tests => 77 + $extra ; use_ok('Compress::Raw::Lzma') ; } sub doit { my $compress_class = shift; my $uncompress_class = shift; title "$compress_class - non-PV buffers"; # ============================== my $hello = *hello; $hello = *hello; my ($err, $x, $X, $status); ($x, $err) = $compress_class->new(); isa_ok $x, "Compress::Raw::Lzma::Encoder"; cmp_ok $err, '==', LZMA_OK, "status is LZMA_OK" ; is $x->uncompressedBytes(), 0, "uncompressedBytes() == 0" ; is $x->compressedBytes(), 0, "compressedBytes() == 0" ; $X = "" ; my $Answer = *Answer; $Answer = *Answer; $status = $x->code($hello, $Answer) ; cmp_ok $status, '==', LZMA_OK, "code returned LZMA_OK" ; $X = *X; cmp_ok $x->flush($X), '==', LZMA_STREAM_END, "flush returned LZMA_OK" ; $Answer .= $X ; is $x->uncompressedBytes(), length $hello, "uncompressedBytes ok" ; is $x->compressedBytes(), length $Answer, "compressedBytes ok" ; $X = *X; cmp_ok $x->flush($X), '==', LZMA_STREAM_END, "flush returned LZMA_STREAM_END"; $Answer .= $X ; #open F, ">/tmp/xx1"; print F $Answer ; close F; my @Answer = split('', $Answer) ; my $k; ok(($k, $err) = $uncompress_class->new(AppendOutput => 0, ConsumeInput => 0)); isa_ok $k, "Compress::Raw::Lzma::Decoder" ; cmp_ok $err, '==', LZMA_OK, "status is LZMA_OK" or diag "GOT $err\n"; is $k->compressedBytes(), 0, "compressedBytes() == 0" ; is $k->uncompressedBytes(), 0, "uncompressedBytes() == 0" ; my $GOT = *GOT; $GOT = *GOT; $status = $k->code($Answer, $GOT) ; cmp_ok $status, '==', LZMA_STREAM_END, "Got LZMA_STREAM_END" ; is $GOT, $hello, "uncompressed data matches ok" ; is $k->compressedBytes(), length $Answer, "compressedBytes ok" ; is $k->uncompressedBytes(), length $hello , "uncompressedBytes ok"; } for my $class ([qw(AloneEncoder AloneDecoder)], [qw(StreamEncoder StreamDecoder)], [qw(RawEncoder RawDecoder)] , [qw(EasyEncoder AutoDecoder)] , ) { my $c = "Compress::Raw::Lzma::" . $class->[0]; my $u = "Compress::Raw::Lzma::" . $class->[1]; doit $c, $u; } Compress-Raw-Lzma-2.101/t/01llzma-generic.t0000644000175000017500000004350613664477257017003 0ustar paulpaulBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; #@INC = ("../lib", "lib/compress"); @INC = ("../lib"); } } use lib 't'; use strict; use warnings; use bytes; use Test::More ; #use CompTestUtils; BEGIN { # use Test::NoWarnings, if available my $extra = 0 ; $extra = 1 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; my $count = 0 ; if ($] < 5.005) { $count = 199 ; } elsif ($] >= 5.006) { $count = 785 ; } else { $count = 227 ; } plan tests => $count + $extra; use_ok('Compress::Raw::Lzma') ; } sub title { #diag "" ; ok 1, $_[0] ; #diag "" ; } sub mkErr { my $string = shift ; my ($dummy, $file, $line) = caller ; -- $line ; $string = quotemeta $string; $file = quotemeta($file); #return "/$string\\s+at $file line $line/" if $] >= 5.006 ; return "/$string\\s+at /" ; } sub mkEvalErr { my $string = shift ; return "/$string\\s+at \\(eval /" if $] > 5.006 ; return "/$string\\s+at /" ; } sub doit { my $compress_class = shift; my $uncompress_class = shift; title "$compress_class and $uncompress_class"; my $hello = <new(1,2,3,4,5,6) }; like $@, mkErr "Usage: Compress::Raw::Lzma::lzma_alone_encoder(class, appendOut=1)"; } if (1) { title "lzma - small buffer"; # ============================== my $hello = "I am a HAL 9000 computer" ; my @hello = split('', $hello) ; my ($err, $x, $X, $status); ($x, $err) = $compress_class->new(); isa_ok $x, "Compress::Raw::Lzma::Encoder"; cmp_ok $err, '==', LZMA_OK, "status is LZMA_OK" ; is $x->uncompressedBytes(), 0, "uncompressedBytes() == 0" ; is $x->compressedBytes(), 0, "compressedBytes() == 0" ; $X = "" ; my $Answer = ''; foreach (@hello) { $status = $x->code($_, $X) ; last unless $status == LZMA_OK ; $Answer .= $X ; } cmp_ok $status, '==', LZMA_OK, "code returned LZMA_OK" ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END, "flush returned LZMA_OK" ; $Answer .= $X ; is $x->uncompressedBytes(), length $hello, "uncompressedBytes ok" ; is $x->compressedBytes(), length $Answer, "compressedBytes ok" ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END, "flush returned LZMA_STREAM_END"; $Answer .= $X ; #open F, ">/tmp/xx1"; print F $Answer ; close F; my @Answer = split('', $Answer) ; my $k; ok(($k, $err) = $uncompress_class->new(AppendOutput => 0, ConsumeInput => 0)); isa_ok $k, "Compress::Raw::Lzma::Decoder" ; cmp_ok $err, '==', LZMA_OK, "status is LZMA_OK" or diag "GOT $err\n"; is $k->compressedBytes(), 0, "compressedBytes() == 0" ; is $k->uncompressedBytes(), 0, "uncompressedBytes() == 0" ; my $GOT = ''; my $Z; $Z = 1 ;#x 2000 ; foreach (@Answer) { $status = $k->code($_, $Z) ; $GOT .= $Z ; last if $status == LZMA_STREAM_END or $status != LZMA_OK ; } cmp_ok $status, '==', LZMA_STREAM_END, "Got LZMA_STREAM_END" ; is $GOT, $hello, "uncompressed data matches ok" ; is $k->compressedBytes(), length $Answer, "compressedBytes ok" ; is $k->uncompressedBytes(), length $hello , "uncompressedBytes ok"; } if (1) { # code/code - small buffer with a number # ============================== my $hello = 6529 ; ok my ($x, $err) = $compress_class->new(AppendOutput => 1) ; ok $x ; cmp_ok $err, '==', LZMA_OK ; my $status; my $Answer = ''; cmp_ok $x->code($hello, $Answer), '==', LZMA_OK ; cmp_ok $x->flush($Answer), '==', LZMA_STREAM_END, "flush returned LZMA_STREAM_END"; my @Answer = split('', $Answer) ; my $k; ok(($k, $err) = $uncompress_class->new(AppendOutput => 1, ConsumeInput => 0) ); ok $k ; cmp_ok $err, '==', LZMA_OK ; #my $GOT = ''; my $GOT ; foreach (@Answer) { $status = $k->code($_, $GOT) ; last if $status == LZMA_STREAM_END or $status != LZMA_OK ; } cmp_ok $status, '==', LZMA_STREAM_END ; is $GOT, $hello ; } if(1) { # code/code options - AppendOutput # ================================ # AppendOutput # CRC my $hello = "I am a HAL 9000 computer" ; my @hello = split('', $hello) ; ok my ($x, $err) = $compress_class->new(AppendOutput => 1), " Created lzma object" ; ok $x ; cmp_ok $err, '==', LZMA_OK, "Status is LZMA_OK" ; my $status; my $X; foreach (@hello) { $status = $x->code($_, $X) ; last unless $status == LZMA_OK ; } cmp_ok $status, '==', LZMA_OK ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END ; my @Answer = split('', $X) ; my $k; ok(($k, $err) = $uncompress_class->new( {-AppendOutput =>1})); ok $k ; cmp_ok $err, '==', LZMA_OK ; my $Z; foreach (@Answer) { $status = $k->code($_, $Z) ; last if $status == LZMA_STREAM_END or $status != LZMA_OK ; } cmp_ok $status, '==', LZMA_STREAM_END ; is $Z, $hello ; } if(1) { title "lzma - larger buffer"; # ============================== # generate a long random string my $contents = '' ; foreach (1 .. 50000) { $contents .= chr int rand 255 } ok my ($x, $err) = $compress_class->new(AppendOutput => 0) ; ok $x, " lzma object ok" ; cmp_ok $err, '==', LZMA_OK," status is LZMA_OK" ; is $x->uncompressedBytes(), 0, " uncompressedBytes() == 0" ; is $x->compressedBytes(), 0, " compressedBytes() == 0" ; my (%X, $Y, %Z, $X, $Z); #cmp_ok $x->code($contents, $X{key}), '==', LZMA_OK ; my $status = $x->code($contents, $X); #cmp_ok $x->code($contents, $X), '==', LZMA_OK, " compressed ok" ; cmp_ok $status, '==', LZMA_OK, " compressed ok" ; #$Y = $X{key} ; $Y = $X ; #cmp_ok $x->flush($X{key}), '==', LZMA_OK ; #$Y .= $X{key} ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END ; $Y .= $X ; my $keep = $Y ; my $k; ok(($k, $err) = $uncompress_class->new(AppendOutput => 0, ConsumeInput => 0) ); ok $k ; cmp_ok $err, '==', LZMA_OK ; #cmp_ok $k->code($Y, $Z{key}), '==', LZMA_STREAM_END ; #ok $contents eq $Z{key} ; cmp_ok $k->code($Y, $Z), '==', LZMA_STREAM_END ; ok $contents eq $Z ; # redo deflate with AppendOutput ok (($k, $err) = $uncompress_class->new(AppendOutput => 1, ConsumeInput => 0)) ; ok $k ; cmp_ok $err, '==', LZMA_OK ; my $s ; my $out ; my @bits = split('', $keep) ; foreach my $bit (@bits) { $s = $k->code($bit, $out) ; } cmp_ok $s, '==', LZMA_STREAM_END ; ok $contents eq $out ; } for my $consume ( 0 .. 1) { title "lzma - check remaining buffer after LZMA_STREAM_END, Consume $consume"; ok my $x = $compress_class->new(AppendOutput => 0) ; my ($X, $Y, $Z); cmp_ok $x->code($hello, $X), '==', LZMA_OK; cmp_ok $x->flush($Y), '==', LZMA_STREAM_END; $X .= $Y ; ok my $k = $uncompress_class->new(AppendOutput => 0, ConsumeInput => $consume) ; my $first = substr($X, 0, 2) ; my $remember_first = $first ; my $last = substr($X, 2) ; cmp_ok $k->code($first, $Z), '==', LZMA_OK; if ($consume) { ok $first eq "" ; } else { ok $first eq $remember_first ; } my $T ; $last .= "appendage" ; my $remember_last = $last ; cmp_ok $k->code($last, $T), '==', LZMA_STREAM_END; is $hello, $Z . $T ; if ($consume) { is $last, "appendage" ; } else { is $last, $remember_last ; } } { title "ConsumeInput and a read-only buffer trapped" ; ok my $k = $uncompress_class->new(AppendOutput => 0, ConsumeInput => 1) ; my $Z; eval { $k->code("abc", $Z) ; }; like $@, mkErr("Compress::Raw::Lzma::Decoder::code input parameter cannot be read-only when ConsumeInput is specified"); } foreach (1 .. 2) { next if $] < 5.005 ; title 'test lzma with a substr'; my $contents = '' ; foreach (1 .. 5000) { $contents .= chr int rand 255 } ok my $x = $compress_class->new(AppendOutput => 1) ; my $X ; my $status = $x->code(substr($contents,0), $X); cmp_ok $status, '==', LZMA_OK ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END ; my $append = "Appended" ; $X .= $append ; ok my $k = $uncompress_class->new(AppendOutput => 1, ConsumeInput => 1) ; my $Z; my $keep = $X ; $status = $k->code(substr($X, 0), $Z) ; cmp_ok $status, '==', LZMA_STREAM_END ; #print "status $status X [$X]\n" ; is $contents, $Z ; ok $X eq $append; #is length($X), length($append); #ok $X eq $keep; #is length($X), length($keep); } title 'Looping Append test - checks that deRef_l resets the output buffer'; foreach (1 .. 2) { my $hello = "I am a HAL 9000 computer" ; my @hello = split('', $hello) ; my ($err, $x, $X, $status); ok( ($x, $err) = $compress_class->new(AppendOutput => 0) ); ok $x ; cmp_ok $err, '==', LZMA_OK ; $X = "" ; my $Answer = ''; foreach (@hello) { $status = $x->code($_, $X) ; last unless $status == LZMA_OK ; $Answer .= $X ; } cmp_ok $status, '==', LZMA_OK ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END ; $Answer .= $X ; my @Answer = split('', $Answer) ; my $k; ok(($k, $err) = $uncompress_class->new(AppendOutput => 1, ConsumeInput => 0) ); ok $k ; cmp_ok $err, '==', LZMA_OK ; my $GOT ; my $Z; $Z = 1 ;#x 2000 ; foreach (@Answer) { $status = $k->code($_, $GOT) ; last if $status == LZMA_STREAM_END or $status != LZMA_OK ; } cmp_ok $status, '==', LZMA_STREAM_END ; is $GOT, $hello ; } if ($] >= 5.005) { title 'test lzma input parameter via substr'; my $hello = "I am a HAL 9000 computer" ; my $data = $hello ; my($X, $Z); ok my $x = $compress_class->new(AppendOutput => 1); cmp_ok $x->code($data, $X), '==', LZMA_OK ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END ; my $append = "Appended" ; $X .= $append ; my $keep = $X ; ok my $k = $uncompress_class->new( AppendOutput => 1, ConsumeInput => 1); # cmp_ok $k->code(substr($X, 0, -1), $Z), '==', LZMA_STREAM_END ; ; cmp_ok $k->code(substr($X, 0), $Z), '==', LZMA_STREAM_END ; ; ok $hello eq $Z ; is $X, $append; $X = $keep ; $Z = ''; ok $k = $uncompress_class->new( AppendOutput => 1, ConsumeInput => 0); cmp_ok $k->code(substr($X, 0, -1), $Z), '==', LZMA_STREAM_END ; ; #cmp_ok $k->code(substr($X, 0), $Z), '==', LZMA_STREAM_END ; ; ok $hello eq $Z ; is $X, $keep; } { title 'RT#132734: test inflate append OOK output parameter'; # https://github.com/pmqs/Compress-Raw-Bzip2/issues/2 my $hello = "I am a HAL 9000 computer" ; my $data = $hello ; my($X, $Z); ok my $x = $compress_class->new( {-AppendOutput => 1} ); cmp_ok $x->code($data, $X), '==', LZMA_OK ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END ; ok my $k = $uncompress_class->new( {-AppendOutput => 1, -ConsumeInput => 1} ) ; $Z = 'prev. ' ; substr($Z, 0, 4, ''); # chop off first 4 characters using offset cmp_ok $Z, 'eq', '. ' ; # use Devel::Peek ; Dump($Z) ; # shows OOK flag # if (1) { # workaround # my $prev = $Z; # undef $Z ; # $Z = $prev ; # } cmp_ok $k->code($X, $Z), '==', LZMA_STREAM_END ; # use Devel::Peek ; Dump($Z) ; # No OOK flag cmp_ok $Z, 'eq', ". $hello" ; } { title 'RT#132734: test deflate append OOK output parameter'; # https://github.com/pmqs/Compress-Raw-Bzip2/issues/2 my $hello = "I am a HAL 9000 computer" ; my $data = $hello ; my($X, $Z); $X = 'prev. ' ; substr($X, 0, 6, ''); # chop off all characters using offset cmp_ok $X, 'eq', '' ; # use Devel::Peek ; Dump($X) ; # shows OOK flag # if (1) { # workaround # my $prev = $Z; # undef $Z ; # $Z = $prev ; # } ok my $x = $compress_class->new( { -AppendOutput => 1 } ); cmp_ok $x->code($data, $X), '==', LZMA_OK ; cmp_ok $x->flush($X), '==', LZMA_STREAM_END ; ok my $k = $uncompress_class->new( {-AppendOutput => 1, -ConsumeInput => 1} ) ; cmp_ok $k->code($X, $Z), '==', LZMA_STREAM_END ; is $Z, $hello ; } { title 'RT#132734: test flush append OOK output parameter'; # https://github.com/pmqs/Compress-Raw-Bzip2/issues/2 my $hello = "I am a HAL 9000 computer" ; my $data = $hello ; my($X, $Z); my $F = 'prev. ' ; substr($F, 0, 6, ''); # chop off all characters using offset cmp_ok $F, 'eq', '' ; # use Devel::Peek ; Dump($F) ; # shows OOK flag ok my $x = $compress_class->new( {-AppendOutput => 1 }); cmp_ok $x->code($data, $X), '==', LZMA_OK ; cmp_ok $x->flush($F), '==', LZMA_STREAM_END ; ok my $k = $uncompress_class->new( {-AppendOutput => 1, -ConsumeInput => 1} ) ; cmp_ok $k->code($X . $F, $Z), '==', LZMA_STREAM_END ; is $Z, $hello ; } exit if $] < 5.006 ; title 'Looping Append test with substr output - substr the end of the string'; foreach (1 .. 2) { my $hello = "I am a HAL 9000 computer" ; my @hello = split('', $hello) ; my ($err, $x, $X, $status); ok( ($x, $err) = $compress_class->new (AppendOutput => 1) ); ok $x ; cmp_ok $err, '==', LZMA_OK ; $X = "" ; my $Answer = ''; foreach (@hello) { $status = $x->code($_, substr($Answer, length($Answer))) ; last unless $status == LZMA_OK ; } cmp_ok $status, '==', LZMA_OK ; cmp_ok $x->flush(substr($Answer, length($Answer))), '==', LZMA_STREAM_END ; my @Answer = split('', $Answer) ; my $k; ok(($k, $err) = $uncompress_class->new(AppendOutput => 1, ConsumeInput => 0) ); ok $k ; cmp_ok $err, '==', LZMA_OK ; my $GOT = ''; my $Z; $Z = 1 ;#x 2000 ; foreach (@Answer) { $status = $k->code($_, substr($GOT, length($GOT))) ; last if $status == LZMA_STREAM_END or $status != LZMA_OK ; } cmp_ok $status, '==', LZMA_STREAM_END ; is $GOT, $hello ; } title 'Looping Append test with substr output - substr the complete string'; foreach (1 .. 2) { my $hello = "I am a HAL 9000 computer" ; my @hello = split('', $hello) ; my ($err, $x, $X, $status); ok( ($x, $err) = $compress_class->new (AppendOutput => 1) ); ok $x ; cmp_ok $err, '==', LZMA_OK ; $X = "" ; my $Answer = ''; foreach (@hello) { $status = $x->code($_, substr($Answer, 0)) ; last unless $status == LZMA_OK ; } cmp_ok $status, '==', LZMA_OK ; cmp_ok $x->flush(substr($Answer, 0)), '==', LZMA_STREAM_END ; my @Answer = split('', $Answer) ; # append, consume, limit my $k; ok(($k, $err) = $uncompress_class->new(AppendOutput => 1, ConsumeInput => 0) ); ok $k ; cmp_ok $err, '==', LZMA_OK ; my $GOT = ''; my $Z; $Z = 1 ;#x 2000 ; foreach (@Answer) { $status = $k->code($_, substr($GOT, 0)) ; last if $status == LZMA_STREAM_END or $status != LZMA_OK ; } cmp_ok $status, '==', LZMA_STREAM_END ; is $GOT, $hello ; } } for my $class ([qw(AloneEncoder AloneDecoder)], [qw(StreamEncoder StreamDecoder)], [qw(RawEncoder RawDecoder)] , [qw(EasyEncoder AutoDecoder)] , ) { my $c = "Compress::Raw::Lzma::" . $class->[0]; my $u = "Compress::Raw::Lzma::" . $class->[1]; doit $c, $u; } Compress-Raw-Lzma-2.101/t/10preset_dict.t0000644000175000017500000000451513767223641016542 0ustar paulpaulBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t); use strict; use warnings; use bytes; use Test::More tests => 15; BEGIN { use_ok('Compress::Raw::Lzma', 2); } my $dict = "sphinx of black quartz judge my vow"; my $to_compress = "sphinx of black quartz judge my vow" x 100; my $filter = Lzma::Filter::Lzma2( PresetDict => \$dict, DictSize => 1024 * 1024 * 8, Lc => 0, Lp => 3, Pb => LZMA_PB_MAX, Mode => LZMA_MODE_NORMAL, Nice => 128, Mf => LZMA_MF_HC4, Depth => 77); my $filter_no_dict = Lzma::Filter::Lzma2( DictSize => 1024 * 1024 * 8, Lc => 0, Lp => 3, Pb => LZMA_PB_MAX, Mode => LZMA_MODE_NORMAL, Nice => 128, Mf => LZMA_MF_HC4, Depth => 77); my ($x,$err,$status); my $out_no_dict; { (my $enc, $err) = Compress::Raw::Lzma::RawEncoder->new(Filter => [$filter_no_dict], AppendOutput => 1); ok $enc; cmp_ok $err, '==', LZMA_OK, " status is LZMA_OK"; my $tmp = $to_compress; $status = $enc->code($tmp, $out_no_dict); cmp_ok $status, '==', LZMA_OK, " status is LZMA_OK"; cmp_ok $enc->flush($out_no_dict), '==', LZMA_STREAM_END, " flush returned LZMA_STREAM_END"; } my $out_dict; { my ($x,$err,$status); (my $enc, $err) = Compress::Raw::Lzma::RawEncoder->new(Filter => [$filter], AppendOutput => 1); ok $enc; cmp_ok $err, '==', LZMA_OK, " status is LZMA_OK"; my $tmp = $to_compress; $status = $enc->code($tmp, $out_dict); cmp_ok $status, '==', LZMA_OK, " status is LZMA_OK"; cmp_ok $enc->flush($out_dict), '==', LZMA_STREAM_END, " flush returned LZMA_STREAM_END"; cmp_ok length($out_dict), '<', length($out_no_dict), " compressed w/ dictionary is shorter than without"; } substr($dict,0,2) = 'xx'; # clobber the dictionary, just to make sure this doesn't break anything my $out_decompressed; { my ($x,$err,$status); (my $dec, $err) = Compress::Raw::Lzma::RawDecoder->new(Filter => [$filter], AppendOutput => 1); ok $dec; cmp_ok $err, '==', LZMA_OK, " status is LZMA_OK"; my $out; $status = $dec->code($out_dict, $out_decompressed); cmp_ok $status, '==', LZMA_STREAM_END " status is LZMA_STREAM_END"; is length($out_decompressed), length($to_compress); ok $out_decompressed eq $to_compress; } Compress-Raw-Lzma-2.101/t/meta-yaml.t0000644000175000017500000000042313450173072015743 0ustar paulpaulBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t t/compress); use Test::More; eval "use Test::CPAN::Meta"; plan skip_all => "Test::CPAN::Meta required for testing META.yml" if $@; meta_yaml_ok();Compress-Raw-Lzma-2.101/t/Test/0000755000175000017500000000000014014211600014573 5ustar paulpaulCompress-Raw-Lzma-2.101/t/Test/Builder.pm0000644000175000017500000011054313445526011016537 0ustar paulpaulpackage Test::Builder; use 5.004; # $^C was only introduced in 5.005-ish. We do this to prevent # use of uninitialized value warnings in older perls. $^C ||= 0; use strict; our ($VERSION); $VERSION = '0.30'; $VERSION = eval $VERSION; # make the alpha version come out as a number # Make Test::Builder thread-safe for ithreads. BEGIN { use Config; # Load threads::shared when threads are turned on if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) { require threads::shared; # Hack around YET ANOTHER threads::shared bug. It would # occassionally forget the contents of the variable when sharing it. # So we first copy the data, then share, then put our copy back. *share = sub (\[$@%]) { my $type = ref $_[0]; my $data; if( $type eq 'HASH' ) { %$data = %{$_[0]}; } elsif( $type eq 'ARRAY' ) { @$data = @{$_[0]}; } elsif( $type eq 'SCALAR' ) { $$data = ${$_[0]}; } else { die "Unknown type: ".$type; } $_[0] = &threads::shared::share($_[0]); if( $type eq 'HASH' ) { %{$_[0]} = %$data; } elsif( $type eq 'ARRAY' ) { @{$_[0]} = @$data; } elsif( $type eq 'SCALAR' ) { ${$_[0]} = $$data; } else { die "Unknown type: ".$type; } return $_[0]; }; } # 5.8.0's threads::shared is busted when threads are off. # We emulate it here. else { *share = sub { return $_[0] }; *lock = sub { 0 }; } } =head1 NAME Test::Builder - Backend for building test libraries =head1 SYNOPSIS package My::Test::Module; use Test::Builder; require Exporter; @ISA = qw(Exporter); @EXPORT = qw(ok); my $Test = Test::Builder->new; $Test->output('my_logfile'); sub import { my($self) = shift; my $pack = caller; $Test->exported_to($pack); $Test->plan(@_); $self->export_to_level(1, $self, 'ok'); } sub ok { my($test, $name) = @_; $Test->ok($test, $name); } =head1 DESCRIPTION Test::Simple and Test::More have proven to be popular testing modules, but they're not always flexible enough. Test::Builder provides the a building block upon which to write your own test libraries I. =head2 Construction =over 4 =item B my $Test = Test::Builder->new; Returns a Test::Builder object representing the current state of the test. Since you only run one test per program C always returns the same Test::Builder object. No matter how many times you call new(), you're getting the same object. This is called a singleton. This is done so that multiple modules share such global information as the test counter and where test output is going. If you want a completely new Test::Builder object different from the singleton, use C. =cut my $Test = Test::Builder->new; sub new { my($class) = shift; $Test ||= $class->create; return $Test; } =item B my $Test = Test::Builder->create; Ok, so there can be more than one Test::Builder object and this is how you get it. You might use this instead of C if you're testing a Test::Builder based module, but otherwise you probably want C. B: the implementation is not complete. C, for example, is still shared amongst B Test::Builder objects, even ones created using this method. Also, the method name may change in the future. =cut sub create { my $class = shift; my $self = bless {}, $class; $self->reset; return $self; } =item B $Test->reset; Reinitializes the Test::Builder singleton to its original state. Mostly useful for tests run in persistent environments where the same test might be run multiple times in the same process. =cut our ($Level); sub reset { my ($self) = @_; # We leave this a global because it has to be localized and localizing # hash keys is just asking for pain. Also, it was documented. $Level = 1; $self->{Test_Died} = 0; $self->{Have_Plan} = 0; $self->{No_Plan} = 0; $self->{Original_Pid} = $$; share($self->{Curr_Test}); $self->{Curr_Test} = 0; $self->{Test_Results} = &share([]); $self->{Exported_To} = undef; $self->{Expected_Tests} = 0; $self->{Skip_All} = 0; $self->{Use_Nums} = 1; $self->{No_Header} = 0; $self->{No_Ending} = 0; $self->_dup_stdhandles unless $^C; return undef; } =back =head2 Setting up tests These methods are for setting up tests and declaring how many there are. You usually only want to call one of these methods. =over 4 =item B my $pack = $Test->exported_to; $Test->exported_to($pack); Tells Test::Builder what package you exported your functions to. This is important for getting TODO tests right. =cut sub exported_to { my($self, $pack) = @_; if( defined $pack ) { $self->{Exported_To} = $pack; } return $self->{Exported_To}; } =item B $Test->plan('no_plan'); $Test->plan( skip_all => $reason ); $Test->plan( tests => $num_tests ); A convenient way to set up your tests. Call this and Test::Builder will print the appropriate headers and take the appropriate actions. If you call plan(), don't call any of the other methods below. =cut sub plan { my($self, $cmd, $arg) = @_; return unless $cmd; if( $self->{Have_Plan} ) { die sprintf "You tried to plan twice! Second plan at %s line %d\n", ($self->caller)[1,2]; } if( $cmd eq 'no_plan' ) { $self->no_plan; } elsif( $cmd eq 'skip_all' ) { return $self->skip_all($arg); } elsif( $cmd eq 'tests' ) { if( $arg ) { return $self->expected_tests($arg); } elsif( !defined $arg ) { die "Got an undefined number of tests. Looks like you tried to ". "say how many tests you plan to run but made a mistake.\n"; } elsif( !$arg ) { die "You said to run 0 tests! You've got to run something.\n"; } } else { require Carp; my @args = grep { defined } ($cmd, $arg); Carp::croak("plan() doesn't understand @args"); } return 1; } =item B my $max = $Test->expected_tests; $Test->expected_tests($max); Gets/sets the # of tests we expect this test to run and prints out the appropriate headers. =cut sub expected_tests { my $self = shift; my($max) = @_; if( @_ ) { die "Number of tests must be a postive integer. You gave it '$max'.\n" unless $max =~ /^\+?\d+$/ and $max > 0; $self->{Expected_Tests} = $max; $self->{Have_Plan} = 1; $self->_print("1..$max\n") unless $self->no_header; } return $self->{Expected_Tests}; } =item B $Test->no_plan; Declares that this test will run an indeterminate # of tests. =cut sub no_plan { my $self = shift; $self->{No_Plan} = 1; $self->{Have_Plan} = 1; } =item B $plan = $Test->has_plan Find out whether a plan has been defined. $plan is either C (no plan has been set), C (indeterminate # of tests) or an integer (the number of expected tests). =cut sub has_plan { my $self = shift; return($self->{Expected_Tests}) if $self->{Expected_Tests}; return('no_plan') if $self->{No_Plan}; return(undef); }; =item B $Test->skip_all; $Test->skip_all($reason); Skips all the tests, using the given $reason. Exits immediately with 0. =cut sub skip_all { my($self, $reason) = @_; my $out = "1..0"; $out .= " # Skip $reason" if $reason; $out .= "\n"; $self->{Skip_All} = 1; $self->_print($out) unless $self->no_header; exit(0); } =back =head2 Running tests These actually run the tests, analogous to the functions in Test::More. $name is always optional. =over 4 =item B $Test->ok($test, $name); Your basic test. Pass if $test is true, fail if $test is false. Just like Test::Simple's ok(). =cut sub ok { my($self, $test, $name) = @_; # $test might contain an object which we don't want to accidentally # store, so we turn it into a boolean. $test = $test ? 1 : 0; unless( $self->{Have_Plan} ) { require Carp; Carp::croak("You tried to run a test without a plan! Gotta have a plan."); } lock $self->{Curr_Test}; $self->{Curr_Test}++; # In case $name is a string overloaded object, force it to stringify. $self->_unoverload(\$name); $self->diag(<caller; my $todo = $self->todo($pack); $self->_unoverload(\$todo); my $out; my $result = &share({}); unless( $test ) { $out .= "not "; @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 ); } else { @$result{ 'ok', 'actual_ok' } = ( 1, $test ); } $out .= "ok"; $out .= " $self->{Curr_Test}" if $self->use_numbers; if( defined $name ) { $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness. $out .= " - $name"; $result->{name} = $name; } else { $result->{name} = ''; } if( $todo ) { $out .= " # TODO $todo"; $result->{reason} = $todo; $result->{type} = 'todo'; } else { $result->{reason} = ''; $result->{type} = ''; } $self->{Test_Results}[$self->{Curr_Test}-1] = $result; $out .= "\n"; $self->_print($out); unless( $test ) { my $msg = $todo ? "Failed (TODO)" : "Failed"; $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE}; $self->diag(" $msg test ($file at line $line)\n"); } return $test ? 1 : 0; } sub _unoverload { my $self = shift; local($@,$!); eval { require overload } || return; foreach my $thing (@_) { eval { if( defined $$thing ) { if( my $string_meth = overload::Method($$thing, '""') ) { $$thing = $$thing->$string_meth(); } } }; } } =item B $Test->is_eq($got, $expected, $name); Like Test::More's is(). Checks if $got eq $expected. This is the string version. =item B $Test->is_num($got, $expected, $name); Like Test::More's is(). Checks if $got == $expected. This is the numeric version. =cut sub is_eq { my($self, $got, $expect, $name) = @_; local $Level = $Level + 1; if( !defined $got || !defined $expect ) { # undef only matches undef and nothing else my $test = !defined $got && !defined $expect; $self->ok($test, $name); $self->_is_diag($got, 'eq', $expect) unless $test; return $test; } return $self->cmp_ok($got, 'eq', $expect, $name); } sub is_num { my($self, $got, $expect, $name) = @_; local $Level = $Level + 1; if( !defined $got || !defined $expect ) { # undef only matches undef and nothing else my $test = !defined $got && !defined $expect; $self->ok($test, $name); $self->_is_diag($got, '==', $expect) unless $test; return $test; } return $self->cmp_ok($got, '==', $expect, $name); } sub _is_diag { my($self, $got, $type, $expect) = @_; foreach my $val (\$got, \$expect) { if( defined $$val ) { if( $type eq 'eq' ) { # quote and force string context $$val = "'$$val'" } else { # force numeric context $$val = $$val+0; } } else { $$val = 'undef'; } } return $self->diag(sprintf < $Test->isnt_eq($got, $dont_expect, $name); Like Test::More's isnt(). Checks if $got ne $dont_expect. This is the string version. =item B $Test->is_num($got, $dont_expect, $name); Like Test::More's isnt(). Checks if $got ne $dont_expect. This is the numeric version. =cut sub isnt_eq { my($self, $got, $dont_expect, $name) = @_; local $Level = $Level + 1; if( !defined $got || !defined $dont_expect ) { # undef only matches undef and nothing else my $test = defined $got || defined $dont_expect; $self->ok($test, $name); $self->_cmp_diag($got, 'ne', $dont_expect) unless $test; return $test; } return $self->cmp_ok($got, 'ne', $dont_expect, $name); } sub isnt_num { my($self, $got, $dont_expect, $name) = @_; local $Level = $Level + 1; if( !defined $got || !defined $dont_expect ) { # undef only matches undef and nothing else my $test = defined $got || defined $dont_expect; $self->ok($test, $name); $self->_cmp_diag($got, '!=', $dont_expect) unless $test; return $test; } return $self->cmp_ok($got, '!=', $dont_expect, $name); } =item B $Test->like($this, qr/$regex/, $name); $Test->like($this, '/$regex/', $name); Like Test::More's like(). Checks if $this matches the given $regex. You'll want to avoid qr// if you want your tests to work before 5.005. =item B $Test->unlike($this, qr/$regex/, $name); $Test->unlike($this, '/$regex/', $name); Like Test::More's unlike(). Checks if $this B the given $regex. =cut sub like { my($self, $this, $regex, $name) = @_; local $Level = $Level + 1; $self->_regex_ok($this, $regex, '=~', $name); } sub unlike { my($self, $this, $regex, $name) = @_; local $Level = $Level + 1; $self->_regex_ok($this, $regex, '!~', $name); } =item B $Test->maybe_regex(qr/$regex/); $Test->maybe_regex('/$regex/'); Convenience method for building testing functions that take regular expressions as arguments, but need to work before perl 5.005. Takes a quoted regular expression produced by qr//, or a string representing a regular expression. Returns a Perl value which may be used instead of the corresponding regular expression, or undef if it's argument is not recognised. For example, a version of like(), sans the useful diagnostic messages, could be written as: sub laconic_like { my ($self, $this, $regex, $name) = @_; my $usable_regex = $self->maybe_regex($regex); die "expecting regex, found '$regex'\n" unless $usable_regex; $self->ok($this =~ m/$usable_regex/, $name); } =cut sub maybe_regex { my ($self, $regex) = @_; my $usable_regex = undef; return $usable_regex unless defined $regex; my($re, $opts); # Check for qr/foo/ if( ref $regex eq 'Regexp' ) { $usable_regex = $regex; } # Check for '/foo/' or 'm,foo,' elsif( ($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx or (undef, $re, $opts) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx ) { $usable_regex = length $opts ? "(?$opts)$re" : $re; } return $usable_regex; }; sub _regex_ok { my($self, $this, $regex, $cmp, $name) = @_; local $Level = $Level + 1; my $ok = 0; my $usable_regex = $self->maybe_regex($regex); unless (defined $usable_regex) { $ok = $self->ok( 0, $name ); $self->diag(" '$regex' doesn't look much like a regex to me."); return $ok; } { local $^W = 0; my $test = $this =~ /$usable_regex/ ? 1 : 0; $test = !$test if $cmp eq '!~'; $ok = $self->ok( $test, $name ); } unless( $ok ) { $this = defined $this ? "'$this'" : 'undef'; my $match = $cmp eq '=~' ? "doesn't match" : "matches"; $self->diag(sprintf < $Test->cmp_ok($this, $type, $that, $name); Works just like Test::More's cmp_ok(). $Test->cmp_ok($big_num, '!=', $other_big_num); =cut sub cmp_ok { my($self, $got, $type, $expect, $name) = @_; my $test; { local $^W = 0; local($@,$!); # don't interfere with $@ # eval() sometimes resets $! $test = eval "\$got $type \$expect"; } local $Level = $Level + 1; my $ok = $self->ok($test, $name); unless( $ok ) { if( $type =~ /^(eq|==)$/ ) { $self->_is_diag($got, $type, $expect); } else { $self->_cmp_diag($got, $type, $expect); } } return $ok; } sub _cmp_diag { my($self, $got, $type, $expect) = @_; $got = defined $got ? "'$got'" : 'undef'; $expect = defined $expect ? "'$expect'" : 'undef'; return $self->diag(sprintf < $Test->BAILOUT($reason); Indicates to the Test::Harness that things are going so badly all testing should terminate. This includes running any additional test scripts. It will exit with 255. =cut sub BAILOUT { my($self, $reason) = @_; $self->_print("Bail out! $reason"); exit 255; } =item B $Test->skip; $Test->skip($why); Skips the current test, reporting $why. =cut sub skip { my($self, $why) = @_; $why ||= ''; $self->_unoverload(\$why); unless( $self->{Have_Plan} ) { require Carp; Carp::croak("You tried to run tests without a plan! Gotta have a plan."); } lock($self->{Curr_Test}); $self->{Curr_Test}++; $self->{Test_Results}[$self->{Curr_Test}-1] = &share({ 'ok' => 1, actual_ok => 1, name => '', type => 'skip', reason => $why, }); my $out = "ok"; $out .= " $self->{Curr_Test}" if $self->use_numbers; $out .= " # skip"; $out .= " $why" if length $why; $out .= "\n"; $self->_print($out); return 1; } =item B $Test->todo_skip; $Test->todo_skip($why); Like skip(), only it will declare the test as failing and TODO. Similar to print "not ok $tnum # TODO $why\n"; =cut sub todo_skip { my($self, $why) = @_; $why ||= ''; unless( $self->{Have_Plan} ) { require Carp; Carp::croak("You tried to run tests without a plan! Gotta have a plan."); } lock($self->{Curr_Test}); $self->{Curr_Test}++; $self->{Test_Results}[$self->{Curr_Test}-1] = &share({ 'ok' => 1, actual_ok => 0, name => '', type => 'todo_skip', reason => $why, }); my $out = "not ok"; $out .= " $self->{Curr_Test}" if $self->use_numbers; $out .= " # TODO & SKIP $why\n"; $self->_print($out); return 1; } =begin _unimplemented =item B $Test->skip_rest; $Test->skip_rest($reason); Like skip(), only it skips all the rest of the tests you plan to run and terminates the test. If you're running under no_plan, it skips once and terminates the test. =end _unimplemented =back =head2 Test style =over 4 =item B $Test->level($how_high); How far up the call stack should $Test look when reporting where the test failed. Defaults to 1. Setting $Test::Builder::Level overrides. This is typically useful localized: { local $Test::Builder::Level = 2; $Test->ok($test); } =cut sub level { my($self, $level) = @_; if( defined $level ) { $Level = $level; } return $Level; } =item B $Test->use_numbers($on_or_off); Whether or not the test should output numbers. That is, this if true: ok 1 ok 2 ok 3 or this if false ok ok ok Most useful when you can't depend on the test output order, such as when threads or forking is involved. Test::Harness will accept either, but avoid mixing the two styles. Defaults to on. =cut sub use_numbers { my($self, $use_nums) = @_; if( defined $use_nums ) { $self->{Use_Nums} = $use_nums; } return $self->{Use_Nums}; } =item B $Test->no_header($no_header); If set to true, no "1..N" header will be printed. =item B $Test->no_ending($no_ending); Normally, Test::Builder does some extra diagnostics when the test ends. It also changes the exit code as described below. If this is true, none of that will be done. =cut sub no_header { my($self, $no_header) = @_; if( defined $no_header ) { $self->{No_Header} = $no_header; } return $self->{No_Header}; } sub no_ending { my($self, $no_ending) = @_; if( defined $no_ending ) { $self->{No_Ending} = $no_ending; } return $self->{No_Ending}; } =back =head2 Output Controlling where the test output goes. It's ok for your test to change where STDOUT and STDERR point to, Test::Builder's default output settings will not be affected. =over 4 =item B $Test->diag(@msgs); Prints out the given @msgs. Like C, arguments are simply appended together. Normally, it uses the failure_output() handle, but if this is for a TODO test, the todo_output() handle is used. Output will be indented and marked with a # so as not to interfere with test output. A newline will be put on the end if there isn't one already. We encourage using this rather than calling print directly. Returns false. Why? Because diag() is often used in conjunction with a failing test (C) it "passes through" the failure. return ok(...) || diag(...); =for blame transfer Mark Fowler =cut sub diag { my($self, @msgs) = @_; return unless @msgs; # Prevent printing headers when compiling (i.e. -c) return if $^C; # Smash args together like print does. # Convert undef to 'undef' so its readable. my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs; # Escape each line with a #. $msg =~ s/^/# /gm; # Stick a newline on the end if it needs it. $msg .= "\n" unless $msg =~ /\n\Z/; local $Level = $Level + 1; $self->_print_diag($msg); return 0; } =begin _private =item B<_print> $Test->_print(@msgs); Prints to the output() filehandle. =end _private =cut sub _print { my($self, @msgs) = @_; # Prevent printing headers when only compiling. Mostly for when # tests are deparsed with B::Deparse return if $^C; my $msg = join '', @msgs; local($\, $", $,) = (undef, ' ', ''); my $fh = $self->output; # Escape each line after the first with a # so we don't # confuse Test::Harness. $msg =~ s/\n(.)/\n# $1/sg; # Stick a newline on the end if it needs it. $msg .= "\n" unless $msg =~ /\n\Z/; print $fh $msg; } =item B<_print_diag> $Test->_print_diag(@msg); Like _print, but prints to the current diagnostic filehandle. =cut sub _print_diag { my $self = shift; local($\, $", $,) = (undef, ' ', ''); my $fh = $self->todo ? $self->todo_output : $self->failure_output; print $fh @_; } =item B $Test->output($fh); $Test->output($file); Where normal "ok/not ok" test output should go. Defaults to STDOUT. =item B $Test->failure_output($fh); $Test->failure_output($file); Where diagnostic output on test failures and diag() should go. Defaults to STDERR. =item B $Test->todo_output($fh); $Test->todo_output($file); Where diagnostics about todo test failures and diag() should go. Defaults to STDOUT. =cut sub output { my($self, $fh) = @_; if( defined $fh ) { $self->{Out_FH} = _new_fh($fh); } return $self->{Out_FH}; } sub failure_output { my($self, $fh) = @_; if( defined $fh ) { $self->{Fail_FH} = _new_fh($fh); } return $self->{Fail_FH}; } sub todo_output { my($self, $fh) = @_; if( defined $fh ) { $self->{Todo_FH} = _new_fh($fh); } return $self->{Todo_FH}; } sub _new_fh { my($file_or_fh) = shift; my $fh; if( _is_fh($file_or_fh) ) { $fh = $file_or_fh; } else { $fh = do { local *FH }; open $fh, ">$file_or_fh" or die "Can't open test output log $file_or_fh: $!"; _autoflush($fh); } return $fh; } sub _is_fh { my $maybe_fh = shift; return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob return UNIVERSAL::isa($maybe_fh, 'GLOB') || UNIVERSAL::isa($maybe_fh, 'IO::Handle') || # 5.5.4's tied() and can() doesn't like getting undef UNIVERSAL::can((tied($maybe_fh) || ''), 'TIEHANDLE'); } sub _autoflush { my($fh) = shift; my $old_fh = select $fh; $| = 1; select $old_fh; } sub _dup_stdhandles { my $self = shift; $self->_open_testhandles; # Set everything to unbuffered else plain prints to STDOUT will # come out in the wrong order from our own prints. _autoflush(\*TESTOUT); _autoflush(\*STDOUT); _autoflush(\*TESTERR); _autoflush(\*STDERR); $self->output(\*TESTOUT); $self->failure_output(\*TESTERR); $self->todo_output(\*TESTOUT); } my $Opened_Testhandles = 0; sub _open_testhandles { return if $Opened_Testhandles; # We dup STDOUT and STDERR so people can change them in their # test suites while still getting normal test output. open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT: $!"; open(TESTERR, ">&STDERR") or die "Can't dup STDERR: $!"; $Opened_Testhandles = 1; } =back =head2 Test Status and Info =over 4 =item B my $curr_test = $Test->current_test; $Test->current_test($num); Gets/sets the current test number we're on. You usually shouldn't have to set this. If set forward, the details of the missing tests are filled in as 'unknown'. if set backward, the details of the intervening tests are deleted. You can erase history if you really want to. =cut sub current_test { my($self, $num) = @_; lock($self->{Curr_Test}); if( defined $num ) { unless( $self->{Have_Plan} ) { require Carp; Carp::croak("Can't change the current test number without a plan!"); } $self->{Curr_Test} = $num; # If the test counter is being pushed forward fill in the details. my $test_results = $self->{Test_Results}; if( $num > @$test_results ) { my $start = @$test_results ? @$test_results : 0; for ($start..$num-1) { $test_results->[$_] = &share({ 'ok' => 1, actual_ok => undef, reason => 'incrementing test number', type => 'unknown', name => undef }); } } # If backward, wipe history. Its their funeral. elsif( $num < @$test_results ) { $#{$test_results} = $num - 1; } } return $self->{Curr_Test}; } =item B my @tests = $Test->summary; A simple summary of the tests so far. True for pass, false for fail. This is a logical pass/fail, so todos are passes. Of course, test #1 is $tests[0], etc... =cut sub summary { my($self) = shift; return map { $_->{'ok'} } @{ $self->{Test_Results} }; } =item B
my @tests = $Test->details; Like summary(), but with a lot more detail. $tests[$test_num - 1] = { 'ok' => is the test considered a pass? actual_ok => did it literally say 'ok'? name => name of the test (if any) type => type of test (if any, see below). reason => reason for the above (if any) }; 'ok' is true if Test::Harness will consider the test to be a pass. 'actual_ok' is a reflection of whether or not the test literally printed 'ok' or 'not ok'. This is for examining the result of 'todo' tests. 'name' is the name of the test. 'type' indicates if it was a special test. Normal tests have a type of ''. Type can be one of the following: skip see skip() todo see todo() todo_skip see todo_skip() unknown see below Sometimes the Test::Builder test counter is incremented without it printing any test output, for example, when current_test() is changed. In these cases, Test::Builder doesn't know the result of the test, so it's type is 'unkown'. These details for these tests are filled in. They are considered ok, but the name and actual_ok is left undef. For example "not ok 23 - hole count # TODO insufficient donuts" would result in this structure: $tests[22] = # 23 - 1, since arrays start from 0. { ok => 1, # logically, the test passed since it's todo actual_ok => 0, # in absolute terms, it failed name => 'hole count', type => 'todo', reason => 'insufficient donuts' }; =cut sub details { my $self = shift; return @{ $self->{Test_Results} }; } =item B my $todo_reason = $Test->todo; my $todo_reason = $Test->todo($pack); todo() looks for a $TODO variable in your tests. If set, all tests will be considered 'todo' (see Test::More and Test::Harness for details). Returns the reason (ie. the value of $TODO) if running as todo tests, false otherwise. todo() is about finding the right package to look for $TODO in. It uses the exported_to() package to find it. If that's not set, it's pretty good at guessing the right package to look at based on $Level. Sometimes there is some confusion about where todo() should be looking for the $TODO variable. If you want to be sure, tell it explicitly what $pack to use. =cut sub todo { my($self, $pack) = @_; $pack = $pack || $self->exported_to || $self->caller($Level); return 0 unless $pack; no strict 'refs'; return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'} : 0; } =item B my $package = $Test->caller; my($pack, $file, $line) = $Test->caller; my($pack, $file, $line) = $Test->caller($height); Like the normal caller(), except it reports according to your level(). =cut sub caller { my($self, $height) = @_; $height ||= 0; my @caller = CORE::caller($self->level + $height + 1); return wantarray ? @caller : $caller[0]; } =back =cut =begin _private =over 4 =item B<_sanity_check> $self->_sanity_check(); Runs a bunch of end of test sanity checks to make sure reality came through ok. If anything is wrong it will die with a fairly friendly error message. =cut #'# sub _sanity_check { my $self = shift; _whoa($self->{Curr_Test} < 0, 'Says here you ran a negative number of tests!'); _whoa(!$self->{Have_Plan} and $self->{Curr_Test}, 'Somehow your tests ran without a plan!'); _whoa($self->{Curr_Test} != @{ $self->{Test_Results} }, 'Somehow you got a different number of results than tests ran!'); } =item B<_whoa> _whoa($check, $description); A sanity check, similar to assert(). If the $check is true, something has gone horribly wrong. It will die with the given $description and a note to contact the author. =cut sub _whoa { my($check, $desc) = @_; if( $check ) { die < _my_exit($exit_num); Perl seems to have some trouble with exiting inside an END block. 5.005_03 and 5.6.1 both seem to do odd things. Instead, this function edits $? directly. It should ONLY be called from inside an END block. It doesn't actually exit, that's your job. =cut sub _my_exit { $? = $_[0]; return 1; } =back =end _private =cut $SIG{__DIE__} = sub { # We don't want to muck with death in an eval, but $^S isn't # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing # with it. Instead, we use caller. This also means it runs under # 5.004! my $in_eval = 0; for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) { $in_eval = 1 if $sub =~ /^\(eval\)/; } $Test->{Test_Died} = 1 unless $in_eval; }; sub _ending { my $self = shift; $self->_sanity_check(); # Don't bother with an ending if this is a forked copy. Only the parent # should do the ending. # Exit if plan() was never called. This is so "require Test::Simple" # doesn't puke. if( ($self->{Original_Pid} != $$) or (!$self->{Have_Plan} && !$self->{Test_Died}) ) { _my_exit($?); return; } # Figure out if we passed or failed and print helpful messages. my $test_results = $self->{Test_Results}; if( @$test_results ) { # The plan? We have no plan. if( $self->{No_Plan} ) { $self->_print("1..$self->{Curr_Test}\n") unless $self->no_header; $self->{Expected_Tests} = $self->{Curr_Test}; } # Auto-extended arrays and elements which aren't explicitly # filled in with a shared reference will puke under 5.8.0 # ithreads. So we have to fill them in by hand. :( my $empty_result = &share({}); for my $idx ( 0..$self->{Expected_Tests}-1 ) { $test_results->[$idx] = $empty_result unless defined $test_results->[$idx]; } my $num_failed = grep !$_->{'ok'}, @{$test_results}[0..$self->{Expected_Tests}-1]; $num_failed += abs($self->{Expected_Tests} - @$test_results); if( $self->{Curr_Test} < $self->{Expected_Tests} ) { my $s = $self->{Expected_Tests} == 1 ? '' : 's'; $self->diag(<<"FAIL"); Looks like you planned $self->{Expected_Tests} test$s but only ran $self->{Curr_Test}. FAIL } elsif( $self->{Curr_Test} > $self->{Expected_Tests} ) { my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests}; my $s = $self->{Expected_Tests} == 1 ? '' : 's'; $self->diag(<<"FAIL"); Looks like you planned $self->{Expected_Tests} test$s but ran $num_extra extra. FAIL } elsif ( $num_failed ) { my $s = $num_failed == 1 ? '' : 's'; $self->diag(<<"FAIL"); Looks like you failed $num_failed test$s of $self->{Expected_Tests}. FAIL } if( $self->{Test_Died} ) { $self->diag(<<"FAIL"); Looks like your test died just after $self->{Curr_Test}. FAIL _my_exit( 255 ) && return; } _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return; } elsif ( $self->{Skip_All} ) { _my_exit( 0 ) && return; } elsif ( $self->{Test_Died} ) { $self->diag(<<'FAIL'); Looks like your test died before it could output anything. FAIL _my_exit( 255 ) && return; } else { $self->diag("No tests run!\n"); _my_exit( 255 ) && return; } } END { $Test->_ending if defined $Test and !$Test->no_ending; } =head1 EXIT CODES If all your tests passed, Test::Builder will exit with zero (which is normal). If anything failed it will exit with how many failed. If you run less (or more) tests than you planned, the missing (or extras) will be considered failures. If no tests were ever run Test::Builder will throw a warning and exit with 255. If the test died, even after having successfully completed all its tests, it will still be considered a failure and will exit with 255. So the exit codes are... 0 all tests successful 255 test died any other number how many failed (including missing or extras) If you fail more than 254 tests, it will be reported as 254. =head1 THREADS In perl 5.8.0 and later, Test::Builder is thread-safe. The test number is shared amongst all threads. This means if one thread sets the test number using current_test() they will all be effected. Test::Builder is only thread-aware if threads.pm is loaded I Test::Builder. =head1 EXAMPLES CPAN can provide the best examples. Test::Simple, Test::More, Test::Exception and Test::Differences all use Test::Builder. =head1 SEE ALSO Test::Simple, Test::More, Test::Harness =head1 AUTHORS Original code by chromatic, maintained by Michael G Schwern Eschwern@pobox.comE =head1 COPYRIGHT Copyright 2002, 2004 by chromatic Echromatic@wgz.orgE and Michael G Schwern Eschwern@pobox.comE. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See F =cut 1; Compress-Raw-Lzma-2.101/t/Test/More.pm0000644000175000017500000011135313445526011016053 0ustar paulpaulpackage Test::More; use 5.004; use strict; use Test::Builder; # Can't use Carp because it might cause use_ok() to accidentally succeed # even though the module being used forgot to use Carp. Yes, this # actually happened. sub _carp { my($file, $line) = (caller(1))[1,2]; warn @_, " at $file line $line\n"; } require Exporter; our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $TODO); $VERSION = '0.60'; $VERSION = eval $VERSION; # make the alpha version come out as a number @ISA = qw(Exporter); @EXPORT = qw(ok use_ok require_ok is isnt like unlike is_deeply cmp_ok skip todo todo_skip pass fail eq_array eq_hash eq_set $TODO plan can_ok isa_ok diag ); my $Test = Test::Builder->new; my $Show_Diag = 1; # 5.004's Exporter doesn't have export_to_level. sub _export_to_level { my $pkg = shift; my $level = shift; (undef) = shift; # redundant arg my $callpkg = caller($level); $pkg->export($callpkg, @_); } =head1 NAME Test::More - yet another framework for writing test scripts =head1 SYNOPSIS use Test::More tests => $Num_Tests; # or use Test::More qw(no_plan); # or use Test::More skip_all => $reason; BEGIN { use_ok( 'Some::Module' ); } require_ok( 'Some::Module' ); # Various ways to say "ok" ok($this eq $that, $test_name); is ($this, $that, $test_name); isnt($this, $that, $test_name); # Rather than print STDERR "# here's what went wrong\n" diag("here's what went wrong"); like ($this, qr/that/, $test_name); unlike($this, qr/that/, $test_name); cmp_ok($this, '==', $that, $test_name); is_deeply($complex_structure1, $complex_structure2, $test_name); SKIP: { skip $why, $how_many unless $have_some_feature; ok( foo(), $test_name ); is( foo(42), 23, $test_name ); }; TODO: { local $TODO = $why; ok( foo(), $test_name ); is( foo(42), 23, $test_name ); }; can_ok($module, @methods); isa_ok($object, $class); pass($test_name); fail($test_name); # UNIMPLEMENTED!!! my @status = Test::More::status; # UNIMPLEMENTED!!! BAIL_OUT($why); =head1 DESCRIPTION B If you're just getting started writing tests, have a look at Test::Simple first. This is a drop in replacement for Test::Simple which you can switch to once you get the hang of basic testing. The purpose of this module is to provide a wide range of testing utilities. Various ways to say "ok" with better diagnostics, facilities to skip tests, test future features and compare complicated data structures. While you can do almost anything with a simple C function, it doesn't provide good diagnostic output. =head2 I love it when a plan comes together Before anything else, you need a testing plan. This basically declares how many tests your script is going to run to protect against premature failure. The preferred way to do this is to declare a plan when you C. use Test::More tests => $Num_Tests; There are rare cases when you will not know beforehand how many tests your script is going to run. In this case, you can declare that you have no plan. (Try to avoid using this as it weakens your test.) use Test::More qw(no_plan); B: using no_plan requires a Test::Harness upgrade else it will think everything has failed. See L) In some cases, you'll want to completely skip an entire testing script. use Test::More skip_all => $skip_reason; Your script will declare a skip with the reason why you skipped and exit immediately with a zero (success). See L for details. If you want to control what functions Test::More will export, you have to use the 'import' option. For example, to import everything but 'fail', you'd do: use Test::More tests => 23, import => ['!fail']; Alternatively, you can use the plan() function. Useful for when you have to calculate the number of tests. use Test::More; plan tests => keys %Stuff * 3; or for deciding between running the tests at all: use Test::More; if( $^O eq 'MacOS' ) { plan skip_all => 'Test irrelevant on MacOS'; } else { plan tests => 42; } =cut sub plan { my(@plan) = @_; my $idx = 0; my @cleaned_plan; while( $idx <= $#plan ) { my $item = $plan[$idx]; if( $item eq 'no_diag' ) { $Show_Diag = 0; } else { push @cleaned_plan, $item; } $idx++; } $Test->plan(@cleaned_plan); } sub import { my($class) = shift; my $caller = caller; $Test->exported_to($caller); my $idx = 0; my @plan; my @imports; while( $idx <= $#_ ) { my $item = $_[$idx]; if( $item eq 'import' ) { push @imports, @{$_[$idx+1]}; $idx++; } else { push @plan, $item; } $idx++; } plan(@plan); __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports); } =head2 Test names By convention, each test is assigned a number in order. This is largely done automatically for you. However, it's often very useful to assign a name to each test. Which would you rather see: ok 4 not ok 5 ok 6 or ok 4 - basic multi-variable not ok 5 - simple exponential ok 6 - force == mass * acceleration The later gives you some idea of what failed. It also makes it easier to find the test in your script, simply search for "simple exponential". All test functions take a name argument. It's optional, but highly suggested that you use it. =head2 I'm ok, you're not ok. The basic purpose of this module is to print out either "ok #" or "not ok #" depending on if a given test succeeded or failed. Everything else is just gravy. All of the following print "ok" or "not ok" depending on if the test succeeded or failed. They all also return true or false, respectively. =over 4 =item B ok($this eq $that, $test_name); This simply evaluates any expression (C<$this eq $that> is just a simple example) and uses that to determine if the test succeeded or failed. A true expression passes, a false one fails. Very simple. For example: ok( $exp{9} == 81, 'simple exponential' ); ok( Film->can('db_Main'), 'set_db()' ); ok( $p->tests == 4, 'saw tests' ); ok( !grep !defined $_, @items, 'items populated' ); (Mnemonic: "This is ok.") $test_name is a very short description of the test that will be printed out. It makes it very easy to find a test in your script when it fails and gives others an idea of your intentions. $test_name is optional, but we B strongly encourage its use. Should an ok() fail, it will produce some diagnostics: not ok 18 - sufficient mucus # Failed test 18 (foo.t at line 42) This is actually Test::Simple's ok() routine. =cut sub ok ($;$) { my($test, $name) = @_; $Test->ok($test, $name); } =item B =item B is ( $this, $that, $test_name ); isnt( $this, $that, $test_name ); Similar to ok(), is() and isnt() compare their two arguments with C and C respectively and use the result of that to determine if the test succeeded or failed. So these: # Is the ultimate answer 42? is( ultimate_answer(), 42, "Meaning of Life" ); # $foo isn't empty isnt( $foo, '', "Got some foo" ); are similar to these: ok( ultimate_answer() eq 42, "Meaning of Life" ); ok( $foo ne '', "Got some foo" ); (Mnemonic: "This is that." "This isn't that.") So why use these? They produce better diagnostics on failure. ok() cannot know what you are testing for (beyond the name), but is() and isnt() know what the test was and why it failed. For example this test: my $foo = 'waffle'; my $bar = 'yarblokos'; is( $foo, $bar, 'Is foo the same as bar?' ); Will produce something like this: not ok 17 - Is foo the same as bar? # Failed test (foo.t at line 139) # got: 'waffle' # expected: 'yarblokos' So you can figure out what went wrong without rerunning the test. You are encouraged to use is() and isnt() over ok() where possible, however do not be tempted to use them to find out if something is true or false! # XXX BAD! is( exists $brooklyn{tree}, 1, 'A tree grows in Brooklyn' ); This does not check if C is true, it checks if it returns 1. Very different. Similar caveats exist for false and 0. In these cases, use ok(). ok( exists $brooklyn{tree}, 'A tree grows in Brooklyn' ); For those grammatical pedants out there, there's an C function which is an alias of isnt(). =cut sub is ($$;$) { $Test->is_eq(@_); } sub isnt ($$;$) { $Test->isnt_eq(@_); } *isn't = \&isnt; =item B like( $this, qr/that/, $test_name ); Similar to ok(), like() matches $this against the regex C. So this: like($this, qr/that/, 'this is like that'); is similar to: ok( $this =~ /that/, 'this is like that'); (Mnemonic "This is like that".) The second argument is a regular expression. It may be given as a regex reference (i.e. C) or (for better compatibility with older perls) as a string that looks like a regex (alternative delimiters are currently not supported): like( $this, '/that/', 'this is like that' ); Regex options may be placed on the end (C<'/that/i'>). Its advantages over ok() are similar to that of is() and isnt(). Better diagnostics on failure. =cut sub like ($$;$) { $Test->like(@_); } =item B unlike( $this, qr/that/, $test_name ); Works exactly as like(), only it checks if $this B match the given pattern. =cut sub unlike ($$;$) { $Test->unlike(@_); } =item B cmp_ok( $this, $op, $that, $test_name ); Halfway between ok() and is() lies cmp_ok(). This allows you to compare two arguments using any binary perl operator. # ok( $this eq $that ); cmp_ok( $this, 'eq', $that, 'this eq that' ); # ok( $this == $that ); cmp_ok( $this, '==', $that, 'this == that' ); # ok( $this && $that ); cmp_ok( $this, '&&', $that, 'this && that' ); ...etc... Its advantage over ok() is when the test fails you'll know what $this and $that were: not ok 1 # Failed test (foo.t at line 12) # '23' # && # undef It's also useful in those cases where you are comparing numbers and is()'s use of C will interfere: cmp_ok( $big_hairy_number, '==', $another_big_hairy_number ); =cut sub cmp_ok($$$;$) { $Test->cmp_ok(@_); } =item B can_ok($module, @methods); can_ok($object, @methods); Checks to make sure the $module or $object can do these @methods (works with functions, too). can_ok('Foo', qw(this that whatever)); is almost exactly like saying: ok( Foo->can('this') && Foo->can('that') && Foo->can('whatever') ); only without all the typing and with a better interface. Handy for quickly testing an interface. No matter how many @methods you check, a single can_ok() call counts as one test. If you desire otherwise, use: foreach my $meth (@methods) { can_ok('Foo', $meth); } =cut sub can_ok ($@) { my($proto, @methods) = @_; my $class = ref $proto || $proto; unless( @methods ) { my $ok = $Test->ok( 0, "$class->can(...)" ); $Test->diag(' can_ok() called with no methods'); return $ok; } my @nok = (); foreach my $method (@methods) { local($!, $@); # don't interfere with caller's $@ # eval sometimes resets $! eval { $proto->can($method) } || push @nok, $method; } my $name; $name = @methods == 1 ? "$class->can('$methods[0]')" : "$class->can(...)"; my $ok = $Test->ok( !@nok, $name ); $Test->diag(map " $class->can('$_') failed\n", @nok); return $ok; } =item B isa_ok($object, $class, $object_name); isa_ok($ref, $type, $ref_name); Checks to see if the given C<< $object->isa($class) >>. Also checks to make sure the object was defined in the first place. Handy for this sort of thing: my $obj = Some::Module->new; isa_ok( $obj, 'Some::Module' ); where you'd otherwise have to write my $obj = Some::Module->new; ok( defined $obj && $obj->isa('Some::Module') ); to safeguard against your test script blowing up. It works on references, too: isa_ok( $array_ref, 'ARRAY' ); The diagnostics of this test normally just refer to 'the object'. If you'd like them to be more specific, you can supply an $object_name (for example 'Test customer'). =cut sub isa_ok ($$;$) { my($object, $class, $obj_name) = @_; my $diag; $obj_name = 'The object' unless defined $obj_name; my $name = "$obj_name isa $class"; if( !defined $object ) { $diag = "$obj_name isn't defined"; } elsif( !ref $object ) { $diag = "$obj_name isn't a reference"; } else { # We can't use UNIVERSAL::isa because we want to honor isa() overrides local($@, $!); # eval sometimes resets $! my $rslt = eval { $object->isa($class) }; if( $@ ) { if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) { if( !UNIVERSAL::isa($object, $class) ) { my $ref = ref $object; $diag = "$obj_name isn't a '$class' it's a '$ref'"; } } else { die <isa on your object and got some weird error. This should never happen. Please contact the author immediately. Here's the error. $@ WHOA } } elsif( !$rslt ) { my $ref = ref $object; $diag = "$obj_name isn't a '$class' it's a '$ref'"; } } my $ok; if( $diag ) { $ok = $Test->ok( 0, $name ); $Test->diag(" $diag\n"); } else { $ok = $Test->ok( 1, $name ); } return $ok; } =item B =item B pass($test_name); fail($test_name); Sometimes you just want to say that the tests have passed. Usually the case is you've got some complicated condition that is difficult to wedge into an ok(). In this case, you can simply use pass() (to declare the test ok) or fail (for not ok). They are synonyms for ok(1) and ok(0). Use these very, very, very sparingly. =cut sub pass (;$) { $Test->ok(1, @_); } sub fail (;$) { $Test->ok(0, @_); } =back =head2 Diagnostics If you pick the right test function, you'll usually get a good idea of what went wrong when it failed. But sometimes it doesn't work out that way. So here we have ways for you to write your own diagnostic messages which are safer than just C. =over 4 =item B diag(@diagnostic_message); Prints a diagnostic message which is guaranteed not to interfere with test output. Like C @diagnostic_message is simply concatinated together. Handy for this sort of thing: ok( grep(/foo/, @users), "There's a foo user" ) or diag("Since there's no foo, check that /etc/bar is set up right"); which would produce: not ok 42 - There's a foo user # Failed test (foo.t at line 52) # Since there's no foo, check that /etc/bar is set up right. You might remember C with the mnemonic C. All diag()s can be made silent by passing the "no_diag" option to Test::More. C 1, 'no_diag'>. This is useful if you have diagnostics for personal testing but then wish to make them silent for release without commenting out each individual statement. B The exact formatting of the diagnostic output is still changing, but it is guaranteed that whatever you throw at it it won't interfere with the test. =cut sub diag { return unless $Show_Diag; $Test->diag(@_); } =back =head2 Module tests You usually want to test if the module you're testing loads ok, rather than just vomiting if its load fails. For such purposes we have C and C. =over 4 =item B BEGIN { use_ok($module); } BEGIN { use_ok($module, @imports); } These simply use the given $module and test to make sure the load happened ok. It's recommended that you run use_ok() inside a BEGIN block so its functions are exported at compile-time and prototypes are properly honored. If @imports are given, they are passed through to the use. So this: BEGIN { use_ok('Some::Module', qw(foo bar)) } is like doing this: use Some::Module qw(foo bar); Version numbers can be checked like so: # Just like "use Some::Module 1.02" BEGIN { use_ok('Some::Module', 1.02) } Don't try to do this: BEGIN { use_ok('Some::Module'); ...some code that depends on the use... ...happening at compile time... } because the notion of "compile-time" is relative. Instead, you want: BEGIN { use_ok('Some::Module') } BEGIN { ...some code that depends on the use... } =cut sub use_ok ($;@) { my($module, @imports) = @_; @imports = () unless @imports; my($pack,$filename,$line) = caller; local($@,$!); # eval sometimes interferes with $! if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) { # probably a version check. Perl needs to see the bare number # for it to work with non-Exporter based modules. eval <ok( !$@, "use $module;" ); unless( $ok ) { chomp $@; $@ =~ s{^BEGIN failed--compilation aborted at .*$} {BEGIN failed--compilation aborted at $filename line $line.}m; $Test->diag(< require_ok($module); require_ok($file); Like use_ok(), except it requires the $module or $file. =cut sub require_ok ($) { my($module) = shift; my $pack = caller; # Try to deterine if we've been given a module name or file. # Module names must be barewords, files not. $module = qq['$module'] unless _is_module_name($module); local($!, $@); # eval sometimes interferes with $! eval <ok( !$@, "require $module;" ); unless( $ok ) { chomp $@; $Test->diag(<. The way Test::More handles this is with a named block. Basically, a block of tests which can be skipped over or made todo. It's best if I just show you... =over 4 =item B SKIP: { skip $why, $how_many if $condition; ...normal testing code goes here... } This declares a block of tests that might be skipped, $how_many tests there are, $why and under what $condition to skip them. An example is the easiest way to illustrate: SKIP: { eval { require HTML::Lint }; skip "HTML::Lint not installed", 2 if $@; my $lint = new HTML::Lint; isa_ok( $lint, "HTML::Lint" ); $lint->parse( $html ); is( $lint->errors, 0, "No errors found in HTML" ); } If the user does not have HTML::Lint installed, the whole block of code I. Test::More will output special ok's which Test::Harness interprets as skipped, but passing, tests. It's important that $how_many accurately reflects the number of tests in the SKIP block so the # of tests run will match up with your plan. If your plan is C $how_many is optional and will default to 1. It's perfectly safe to nest SKIP blocks. Each SKIP block must have the label C, or Test::More can't work its magic. You don't skip tests which are failing because there's a bug in your program, or for which you don't yet have code written. For that you use TODO. Read on. =cut #'# sub skip { my($why, $how_many) = @_; unless( defined $how_many ) { # $how_many can only be avoided when no_plan is in use. _carp "skip() needs to know \$how_many tests are in the block" unless $Test->has_plan eq 'no_plan'; $how_many = 1; } for( 1..$how_many ) { $Test->skip($why); } local $^W = 0; last SKIP; } =item B TODO: { local $TODO = $why if $condition; ...normal testing code goes here... } Declares a block of tests you expect to fail and $why. Perhaps it's because you haven't fixed a bug or haven't finished a new feature: TODO: { local $TODO = "URI::Geller not finished"; my $card = "Eight of clubs"; is( URI::Geller->your_card, $card, 'Is THIS your card?' ); my $spoon; URI::Geller->bend_spoon; is( $spoon, 'bent', "Spoon bending, that's original" ); } With a todo block, the tests inside are expected to fail. Test::More will run the tests normally, but print out special flags indicating they are "todo". Test::Harness will interpret failures as being ok. Should anything succeed, it will report it as an unexpected success. You then know the thing you had todo is done and can remove the TODO flag. The nice part about todo tests, as opposed to simply commenting out a block of tests, is it's like having a programmatic todo list. You know how much work is left to be done, you're aware of what bugs there are, and you'll know immediately when they're fixed. Once a todo test starts succeeding, simply move it outside the block. When the block is empty, delete it. B: TODO tests require a Test::Harness upgrade else it will treat it as a normal failure. See L) =item B TODO: { todo_skip $why, $how_many if $condition; ...normal testing code... } With todo tests, it's best to have the tests actually run. That way you'll know when they start passing. Sometimes this isn't possible. Often a failing test will cause the whole program to die or hang, even inside an C with and using C. In these extreme cases you have no choice but to skip over the broken tests entirely. The syntax and behavior is similar to a C except the tests will be marked as failing but todo. Test::Harness will interpret them as passing. =cut sub todo_skip { my($why, $how_many) = @_; unless( defined $how_many ) { # $how_many can only be avoided when no_plan is in use. _carp "todo_skip() needs to know \$how_many tests are in the block" unless $Test->has_plan eq 'no_plan'; $how_many = 1; } for( 1..$how_many ) { $Test->todo_skip($why); } local $^W = 0; last TODO; } =item When do I use SKIP vs. TODO? B, use SKIP. This includes optional modules that aren't installed, running under an OS that doesn't have some feature (like fork() or symlinks), or maybe you need an Internet connection and one isn't available. B, use TODO. This is for any code you haven't written yet, or bugs you have yet to fix, but want to put tests in your testing script (always a good idea). =back =head2 Complex data structures Not everything is a simple eq check or regex. There are times you need to see if two data structures are equivalent. For these instances Test::More provides a handful of useful functions. B I'm not quite sure what will happen with filehandles. =over 4 =item B is_deeply( $this, $that, $test_name ); Similar to is(), except that if $this and $that are hash or array references, it does a deep comparison walking each data structure to see if they are equivalent. If the two structures are different, it will display the place where they start differing. Test::Differences and Test::Deep provide more in-depth functionality along these lines. =back =cut our (@Data_Stack, %Refs_Seen); my $DNE = bless [], 'Does::Not::Exist'; sub is_deeply { unless( @_ == 2 or @_ == 3 ) { my $msg = <ok(0); } my($this, $that, $name) = @_; my $ok; if( !ref $this and !ref $that ) { # neither is a reference $ok = $Test->is_eq($this, $that, $name); } elsif( !ref $this xor !ref $that ) { # one's a reference, one isn't $ok = $Test->ok(0, $name); $Test->diag( _format_stack({ vals => [ $this, $that ] }) ); } else { # both references local @Data_Stack = (); if( _deep_check($this, $that) ) { $ok = $Test->ok(1, $name); } else { $ok = $Test->ok(0, $name); $Test->diag(_format_stack(@Data_Stack)); } } return $ok; } sub _format_stack { my(@Stack) = @_; my $var = '$FOO'; my $did_arrow = 0; foreach my $entry (@Stack) { my $type = $entry->{type} || ''; my $idx = $entry->{'idx'}; if( $type eq 'HASH' ) { $var .= "->" unless $did_arrow++; $var .= "{$idx}"; } elsif( $type eq 'ARRAY' ) { $var .= "->" unless $did_arrow++; $var .= "[$idx]"; } elsif( $type eq 'REF' ) { $var = "\${$var}"; } } my @vals = @{$Stack[-1]{vals}}[0,1]; my @vars = (); ($vars[0] = $var) =~ s/\$FOO/ \$got/; ($vars[1] = $var) =~ s/\$FOO/\$expected/; my $out = "Structures begin differing at:\n"; foreach my $idx (0..$#vals) { my $val = $vals[$idx]; $vals[$idx] = !defined $val ? 'undef' : $val eq $DNE ? "Does not exist" : ref $val ? "$val" : "'$val'"; } $out .= "$vars[0] = $vals[0]\n"; $out .= "$vars[1] = $vals[1]\n"; $out =~ s/^/ /msg; return $out; } sub _type { my $thing = shift; return '' if !ref $thing; for my $type (qw(ARRAY HASH REF SCALAR GLOB Regexp)) { return $type if UNIVERSAL::isa($thing, $type); } return ''; } =head2 Discouraged comparison functions The use of the following functions is discouraged as they are not actually testing functions and produce no diagnostics to help figure out what went wrong. They were written before is_deeply() existed because I couldn't figure out how to display a useful diff of two arbitrary data structures. These functions are usually used inside an ok(). ok( eq_array(\@this, \@that) ); C can do that better and with diagnostics. is_deeply( \@this, \@that ); They may be deprecated in future versions. =over 4 =item B my $is_eq = eq_array(\@this, \@that); Checks if two arrays are equivalent. This is a deep check, so multi-level structures are handled correctly. =cut #'# sub eq_array { local @Data_Stack; _deep_check(@_); } sub _eq_array { my($a1, $a2) = @_; if( grep !_type($_) eq 'ARRAY', $a1, $a2 ) { warn "eq_array passed a non-array ref"; return 0; } return 1 if $a1 eq $a2; my $ok = 1; my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2; for (0..$max) { my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_]; my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_]; push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] }; $ok = _deep_check($e1,$e2); pop @Data_Stack if $ok; last unless $ok; } return $ok; } sub _deep_check { my($e1, $e2) = @_; my $ok = 0; # Effectively turn %Refs_Seen into a stack. This avoids picking up # the same referenced used twice (such as [\$a, \$a]) to be considered # circular. local %Refs_Seen = %Refs_Seen; { # Quiet uninitialized value warnings when comparing undefs. local $^W = 0; $Test->_unoverload(\$e1, \$e2); # Either they're both references or both not. my $same_ref = !(!ref $e1 xor !ref $e2); my $not_ref = (!ref $e1 and !ref $e2); if( defined $e1 xor defined $e2 ) { $ok = 0; } elsif ( $e1 == $DNE xor $e2 == $DNE ) { $ok = 0; } elsif ( $same_ref and ($e1 eq $e2) ) { $ok = 1; } elsif ( $not_ref ) { push @Data_Stack, { type => '', vals => [$e1, $e2] }; $ok = 0; } else { if( $Refs_Seen{$e1} ) { return $Refs_Seen{$e1} eq $e2; } else { $Refs_Seen{$e1} = "$e2"; } my $type = _type($e1); $type = 'DIFFERENT' unless _type($e2) eq $type; if( $type eq 'DIFFERENT' ) { push @Data_Stack, { type => $type, vals => [$e1, $e2] }; $ok = 0; } elsif( $type eq 'ARRAY' ) { $ok = _eq_array($e1, $e2); } elsif( $type eq 'HASH' ) { $ok = _eq_hash($e1, $e2); } elsif( $type eq 'REF' ) { push @Data_Stack, { type => $type, vals => [$e1, $e2] }; $ok = _deep_check($$e1, $$e2); pop @Data_Stack if $ok; } elsif( $type eq 'SCALAR' ) { push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; $ok = _deep_check($$e1, $$e2); pop @Data_Stack if $ok; } else { _whoa(1, "No type in _deep_check"); } } } return $ok; } sub _whoa { my($check, $desc) = @_; if( $check ) { die < my $is_eq = eq_hash(\%this, \%that); Determines if the two hashes contain the same keys and values. This is a deep check. =cut sub eq_hash { local @Data_Stack; return _deep_check(@_); } sub _eq_hash { my($a1, $a2) = @_; if( grep !_type($_) eq 'HASH', $a1, $a2 ) { warn "eq_hash passed a non-hash ref"; return 0; } return 1 if $a1 eq $a2; my $ok = 1; my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2; foreach my $k (keys %$bigger) { my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE; my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE; push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] }; $ok = _deep_check($e1, $e2); pop @Data_Stack if $ok; last unless $ok; } return $ok; } =item B my $is_eq = eq_set(\@this, \@that); Similar to eq_array(), except the order of the elements is B important. This is a deep check, but the irrelevancy of order only applies to the top level. ok( eq_set(\@this, \@that) ); Is better written: is_deeply( [sort @this], [sort @that] ); B By historical accident, this is not a true set comparision. While the order of elements does not matter, duplicate elements do. Test::Deep contains much better set comparison functions. =cut sub eq_set { my($a1, $a2) = @_; return 0 unless @$a1 == @$a2; # There's faster ways to do this, but this is easiest. local $^W = 0; # We must make sure that references are treated neutrally. It really # doesn't matter how we sort them, as long as both arrays are sorted # with the same algorithm. # Have to inline the sort routine due to a threading/sort bug. # See [rt.cpan.org 6782] return eq_array( [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a1], [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a2] ); } =back =head2 Extending and Embedding Test::More Sometimes the Test::More interface isn't quite enough. Fortunately, Test::More is built on top of Test::Builder which provides a single, unified backend for any test library to use. This means two test libraries which both use Test::Builder B. If you simply want to do a little tweaking of how the tests behave, you can access the underlying Test::Builder object like so: =over 4 =item B my $test_builder = Test::More->builder; Returns the Test::Builder object underlying Test::More for you to play with. =cut sub builder { return Test::Builder->new; } =back =head1 EXIT CODES If all your tests passed, Test::Builder will exit with zero (which is normal). If anything failed it will exit with how many failed. If you run less (or more) tests than you planned, the missing (or extras) will be considered failures. If no tests were ever run Test::Builder will throw a warning and exit with 255. If the test died, even after having successfully completed all its tests, it will still be considered a failure and will exit with 255. So the exit codes are... 0 all tests successful 255 test died any other number how many failed (including missing or extras) If you fail more than 254 tests, it will be reported as 254. B This behavior may go away in future versions. =head1 CAVEATS and NOTES =over 4 =item Backwards compatibility Test::More works with Perls as old as 5.004_05. =item Overloaded objects String overloaded objects are compared B. This prevents Test::More from piercing an object's interface allowing better blackbox testing. So if a function starts returning overloaded objects instead of bare strings your tests won't notice the difference. This is good. However, it does mean that functions like is_deeply() cannot be used to test the internals of string overloaded objects. In this case I would suggest Test::Deep which contains more flexible testing functions for complex data structures. =item Threads Test::More will only be aware of threads if "use threads" has been done I Test::More is loaded. This is ok: use threads; use Test::More; This may cause problems: use Test::More use threads; =item Test::Harness upgrade no_plan and todo depend on new Test::Harness features and fixes. If you're going to distribute tests that use no_plan or todo your end-users will have to upgrade Test::Harness to the latest one on CPAN. If you avoid no_plan and TODO tests, the stock Test::Harness will work fine. Installing Test::More should also upgrade Test::Harness. =back =head1 HISTORY This is a case of convergent evolution with Joshua Pritikin's Test module. I was largely unaware of its existence when I'd first written my own ok() routines. This module exists because I can't figure out how to easily wedge test names into Test's interface (along with a few other problems). The goal here is to have a testing utility that's simple to learn, quick to use and difficult to trip yourself up with while still providing more flexibility than the existing Test.pm. As such, the names of the most common routines are kept tiny, special cases and magic side-effects are kept to a minimum. WYSIWYG. =head1 SEE ALSO L if all this confuses you and you just want to write some tests. You can upgrade to Test::More later (it's forward compatible). L is the old testing module. Its main benefit is that it has been distributed with Perl since 5.004_05. L for details on how your test results are interpreted by Perl. L for more ways to test complex data structures. And it plays well with Test::More. L is like XUnit but more perlish. L gives you more powerful complex data structure testing. L is XUnit style testing. L shows the idea of embedded testing. L installs a whole bunch of useful test modules. =head1 AUTHORS Michael G Schwern Eschwern@pobox.comE with much inspiration from Joshua Pritikin's Test module and lots of help from Barrie Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa gang. =head1 BUGS See F to report and view bugs. =head1 COPYRIGHT Copyright 2001, 2002, 2004 by Michael G Schwern Eschwern@pobox.comE. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See F =cut 1; Compress-Raw-Lzma-2.101/t/Test/Simple.pm0000644000175000017500000001470313445526011016403 0ustar paulpaulpackage Test::Simple; use 5.004; use strict 'vars'; our ($VERSION); $VERSION = '0.60'; $VERSION = eval $VERSION; # make the alpha version come out as a number use Test::Builder; my $Test = Test::Builder->new; sub import { my $self = shift; my $caller = caller; *{$caller.'::ok'} = \&ok; $Test->exported_to($caller); $Test->plan(@_); } =head1 NAME Test::Simple - Basic utilities for writing tests. =head1 SYNOPSIS use Test::Simple tests => 1; ok( $foo eq $bar, 'foo is bar' ); =head1 DESCRIPTION ** If you are unfamiliar with testing B first! ** This is an extremely simple, extremely basic module for writing tests suitable for CPAN modules and other pursuits. If you wish to do more complicated testing, use the Test::More module (a drop-in replacement for this one). The basic unit of Perl testing is the ok. For each thing you want to test your program will print out an "ok" or "not ok" to indicate pass or fail. You do this with the ok() function (see below). The only other constraint is you must pre-declare how many tests you plan to run. This is in case something goes horribly wrong during the test and your test program aborts, or skips a test or whatever. You do this like so: use Test::Simple tests => 23; You must have a plan. =over 4 =item B ok( $foo eq $bar, $name ); ok( $foo eq $bar ); ok() is given an expression (in this case C<$foo eq $bar>). If it's true, the test passed. If it's false, it didn't. That's about it. ok() prints out either "ok" or "not ok" along with a test number (it keeps track of that for you). # This produces "ok 1 - Hell not yet frozen over" (or not ok) ok( get_temperature($hell) > 0, 'Hell not yet frozen over' ); If you provide a $name, that will be printed along with the "ok/not ok" to make it easier to find your test when if fails (just search for the name). It also makes it easier for the next guy to understand what your test is for. It's highly recommended you use test names. All tests are run in scalar context. So this: ok( @stuff, 'I have some stuff' ); will do what you mean (fail if stuff is empty) =cut sub ok ($;$) { $Test->ok(@_); } =back Test::Simple will start by printing number of tests run in the form "1..M" (so "1..5" means you're going to run 5 tests). This strange format lets Test::Harness know how many tests you plan on running in case something goes horribly wrong. If all your tests passed, Test::Simple will exit with zero (which is normal). If anything failed it will exit with how many failed. If you run less (or more) tests than you planned, the missing (or extras) will be considered failures. If no tests were ever run Test::Simple will throw a warning and exit with 255. If the test died, even after having successfully completed all its tests, it will still be considered a failure and will exit with 255. So the exit codes are... 0 all tests successful 255 test died any other number how many failed (including missing or extras) If you fail more than 254 tests, it will be reported as 254. This module is by no means trying to be a complete testing system. It's just to get you started. Once you're off the ground its recommended you look at L. =head1 EXAMPLE Here's an example of a simple .t file for the fictional Film module. use Test::Simple tests => 5; use Film; # What you're testing. my $btaste = Film->new({ Title => 'Bad Taste', Director => 'Peter Jackson', Rating => 'R', NumExplodingSheep => 1 }); ok( defined($btaste) && ref $btaste eq 'Film, 'new() works' ); ok( $btaste->Title eq 'Bad Taste', 'Title() get' ); ok( $btaste->Director eq 'Peter Jackson', 'Director() get' ); ok( $btaste->Rating eq 'R', 'Rating() get' ); ok( $btaste->NumExplodingSheep == 1, 'NumExplodingSheep() get' ); It will produce output like this: 1..5 ok 1 - new() works ok 2 - Title() get ok 3 - Director() get not ok 4 - Rating() get # Failed test (t/film.t at line 14) ok 5 - NumExplodingSheep() get # Looks like you failed 1 tests of 5 Indicating the Film::Rating() method is broken. =head1 CAVEATS Test::Simple will only report a maximum of 254 failures in its exit code. If this is a problem, you probably have a huge test script. Split it into multiple files. (Otherwise blame the Unix folks for using an unsigned short integer as the exit status). Because VMS's exit codes are much, much different than the rest of the universe, and perl does horrible mangling to them that gets in my way, it works like this on VMS. 0 SS$_NORMAL all tests successful 4 SS$_ABORT something went wrong Unfortunately, I can't differentiate any further. =head1 NOTES Test::Simple is B tested all the way back to perl 5.004. Test::Simple is thread-safe in perl 5.8.0 and up. =head1 HISTORY This module was conceived while talking with Tony Bowden in his kitchen one night about the problems I was having writing some really complicated feature into the new Testing module. He observed that the main problem is not dealing with these edge cases but that people hate to write tests B. What was needed was a dead simple module that took all the hard work out of testing and was really, really easy to learn. Paul Johnson simultaneously had this idea (unfortunately, he wasn't in Tony's kitchen). This is it. =head1 SEE ALSO =over 4 =item L More testing functions! Once you outgrow Test::Simple, look at Test::More. Test::Simple is 100% forward compatible with Test::More (i.e. you can just use Test::More instead of Test::Simple in your programs and things will still work). =item L The original Perl testing module. =item L Elaborate unit testing. =item L, L Embed tests in your code! =item L Interprets the output of your test program. =back =head1 AUTHORS Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern Eschwern@pobox.comE, wardrobe by Calvin Klein. =head1 COPYRIGHT Copyright 2001, 2002, 2004 by Michael G Schwern Eschwern@pobox.comE. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See F =cut 1; Compress-Raw-Lzma-2.101/t/99pod.t0000644000175000017500000000040513445526011015020 0ustar paulpaulBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t t/compress); use Test::More; eval "use Test::Pod 1.00"; plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; all_pod_files_ok(); Compress-Raw-Lzma-2.101/t/compress/0000755000175000017500000000000014014211600015507 5ustar paulpaulCompress-Raw-Lzma-2.101/t/compress/CompTestUtils.pm0000644000175000017500000005602613747272703020664 0ustar paulpaulpackage CompTestUtils; package main ; use strict ; use warnings; use bytes; #use lib qw(t t/compress); use Carp ; #use Test::More ; sub title { #diag "" ; ok 1, $_[0] ; #diag "" ; } sub like_eval { like $@, @_ ; } { package LexFile ; our ($index); $index = '00000'; sub new { my $self = shift ; foreach (@_) { # autogenerate the name unless if none supplied $_ = "tst" . $index ++ . ".tmp" unless defined $_; } chmod 0777, @_; for (@_) { 1 while unlink $_ } ; bless [ @_ ], $self ; } sub DESTROY { my $self = shift ; chmod 0777, @{ $self } ; for (@$self) { 1 while unlink $_ } ; } } { package LexDir ; use File::Path; sub new { my $self = shift ; foreach (@_) { rmtree $_ } bless [ @_ ], $self ; } sub DESTROY { my $self = shift ; foreach (@$self) { rmtree $_ } } } sub readFile { my $f = shift ; my @strings ; if (IO::Compress::Base::Common::isaFilehandle($f)) { my $pos = tell($f); seek($f, 0,0); @strings = <$f> ; seek($f, 0, $pos); } else { open (F, "<$f") or croak "Cannot open $f: $!\n" ; binmode F; @strings = ; close F ; } return @strings if wantarray ; return join "", @strings ; } sub touch { foreach (@_) { writeFile($_, '') } } sub writeFile { my($filename, @strings) = @_ ; 1 while unlink $filename ; open (F, ">$filename") or croak "Cannot open $filename: $!\n" ; binmode F; foreach (@strings) { no warnings ; print F $_ ; } close F ; } sub GZreadFile { my ($filename) = shift ; my ($uncomp) = "" ; my $line = "" ; my $fil = gzopen($filename, "rb") or croak "Cannopt open '$filename': $Compress::Zlib::gzerrno" ; $uncomp .= $line while $fil->gzread($line) > 0; $fil->gzclose ; return $uncomp ; } sub hexDump { my $d = shift ; if (IO::Compress::Base::Common::isaFilehandle($d)) { $d = readFile($d); } elsif (IO::Compress::Base::Common::isaFilename($d)) { $d = readFile($d); } else { $d = $$d ; } my $offset = 0 ; $d = '' unless defined $d ; #while (read(STDIN, $data, 16)) { while (my $data = substr($d, 0, 16)) { substr($d, 0, 16) = '' ; printf "# %8.8lx ", $offset; $offset += 16; my @array = unpack('C*', $data); foreach (@array) { printf('%2.2x ', $_); } print " " x (16 - @array) if @array < 16 ; $data =~ tr/\0-\37\177-\377/./; print " $data\n"; } } sub readHeaderInfo { my $name = shift ; my %opts = @_ ; my $string = <write($string) ; ok $x->close ; #is GZreadFile($name), $string ; ok my $gunz = new IO::Uncompress::Gunzip $name, Strict => 0 or diag "GunzipError is $IO::Uncompress::Gunzip::GunzipError" ; ok my $hdr = $gunz->getHeaderInfo(); my $uncomp ; ok $gunz->read($uncomp) ; ok $uncomp eq $string; ok $gunz->close ; return $hdr ; } sub cmpFile { my ($filename, $uue) = @_ ; return readFile($filename) eq unpack("u", $uue) ; } sub isRawFormat { my $class = shift; my %raw = map { $_ => 1 } qw( RawDeflate ); return defined $raw{$class}; } sub uncompressBuffer { my $compWith = shift ; my $buffer = shift ; my %mapping = ( 'IO::Compress::Gzip' => 'IO::Uncompress::Gunzip', 'IO::Compress::Gzip::gzip' => 'IO::Uncompress::Gunzip', 'IO::Compress::Deflate' => 'IO::Uncompress::Inflate', 'IO::Compress::Deflate::deflate' => 'IO::Uncompress::Inflate', 'IO::Compress::RawDeflate' => 'IO::Uncompress::RawInflate', 'IO::Compress::RawDeflate::rawdeflate' => 'IO::Uncompress::RawInflate', 'IO::Compress::Bzip2' => 'IO::Uncompress::Bunzip2', 'IO::Compress::Bzip2::bzip2' => 'IO::Uncompress::Bunzip2', 'IO::Compress::Zip' => 'IO::Uncompress::Unzip', 'IO::Compress::Zip::zip' => 'IO::Uncompress::Unzip', 'IO::Compress::Lzop' => 'IO::Uncompress::UnLzop', 'IO::Compress::Lzop::lzop' => 'IO::Uncompress::UnLzop', 'IO::Compress::Lzf' => 'IO::Uncompress::UnLzf' , 'IO::Compress::Lzf::lzf' => 'IO::Uncompress::UnLzf', 'IO::Compress::PPMd' => 'IO::Uncompress::UnPPMd' , 'IO::Compress::PPMd::ppmd' => 'IO::Uncompress::UnPPMd', 'IO::Compress::Lzma' => 'IO::Uncompress::UnLzma', 'IO::Compress::Lzma::lzma' => 'IO::Uncompress::UnLzma', 'IO::Compress::DummyComp' => 'IO::Uncompress::DummyUncomp', 'IO::Compress::DummyComp::dummycomp' => 'IO::Uncompress::DummyUncomp', ); my $out ; my $obj = $mapping{$compWith}->new( \$buffer, -Append => 1); 1 while $obj->read($out) > 0 ; return $out ; } my %ErrorMap = ( 'IO::Compress::Gzip' => \$IO::Compress::Gzip::GzipError, 'IO::Compress::Gzip::gzip' => \$IO::Compress::Gzip::GzipError, 'IO::Uncompress::Gunzip' => \$IO::Uncompress::Gunzip::GunzipError, 'IO::Uncompress::Gunzip::gunzip' => \$IO::Uncompress::Gunzip::GunzipError, 'IO::Uncompress::Inflate' => \$IO::Uncompress::Inflate::InflateError, 'IO::Uncompress::Inflate::inflate' => \$IO::Uncompress::Inflate::InflateError, 'IO::Compress::Deflate' => \$IO::Compress::Deflate::DeflateError, 'IO::Compress::Deflate::deflate' => \$IO::Compress::Deflate::DeflateError, 'IO::Uncompress::RawInflate' => \$IO::Uncompress::RawInflate::RawInflateError, 'IO::Uncompress::RawInflate::rawinflate' => \$IO::Uncompress::RawInflate::RawInflateError, 'IO::Uncompress::AnyInflate' => \$IO::Uncompress::AnyInflate::AnyInflateError, 'IO::Uncompress::AnyInflate::anyinflate' => \$IO::Uncompress::AnyInflate::AnyInflateError, 'IO::Uncompress::AnyUncompress' => \$IO::Uncompress::AnyUncompress::AnyUncompressError, 'IO::Uncompress::AnyUncompress::anyUncompress' => \$IO::Uncompress::AnyUncompress::AnyUncompressError, 'IO::Compress::RawDeflate' => \$IO::Compress::RawDeflate::RawDeflateError, 'IO::Compress::RawDeflate::rawdeflate' => \$IO::Compress::RawDeflate::RawDeflateError, 'IO::Compress::Bzip2' => \$IO::Compress::Bzip2::Bzip2Error, 'IO::Compress::Bzip2::bzip2' => \$IO::Compress::Bzip2::Bzip2Error, 'IO::Uncompress::Bunzip2' => \$IO::Uncompress::Bunzip2::Bunzip2Error, 'IO::Uncompress::Bunzip2::bunzip2' => \$IO::Uncompress::Bunzip2::Bunzip2Error, 'IO::Compress::Zip' => \$IO::Compress::Zip::ZipError, 'IO::Compress::Zip::zip' => \$IO::Compress::Zip::ZipError, 'IO::Uncompress::Unzip' => \$IO::Uncompress::Unzip::UnzipError, 'IO::Uncompress::Unzip::unzip' => \$IO::Uncompress::Unzip::UnzipError, 'IO::Compress::Lzop' => \$IO::Compress::Lzop::LzopError, 'IO::Compress::Lzop::lzop' => \$IO::Compress::Lzop::LzopError, 'IO::Uncompress::UnLzop' => \$IO::Uncompress::UnLzop::UnLzopError, 'IO::Uncompress::UnLzop::unlzop' => \$IO::Uncompress::UnLzop::UnLzopError, 'IO::Compress::Lzf' => \$IO::Compress::Lzf::LzfError, 'IO::Compress::Lzf::lzf' => \$IO::Compress::Lzf::LzfError, 'IO::Uncompress::UnLzf' => \$IO::Uncompress::UnLzf::UnLzfError, 'IO::Uncompress::UnLzf::unlzf' => \$IO::Uncompress::UnLzf::UnLzfError, 'IO::Compress::PPMd' => \$IO::Compress::PPMd::PPMdError, 'IO::Compress::PPMd::ppmd' => \$IO::Compress::PPMd::PPMdError, 'IO::Uncompress::UnPPMd' => \$IO::Uncompress::UnPPMd::UnPPMdError, 'IO::Uncompress::UnPPMd::unppmd' => \$IO::Uncompress::UnPPMd::UnPPMdError, 'IO::Compress::Lzma' => \$IO::Compress::Lzma::LzmaError, 'IO::Compress::Lzma::lzma' => \$IO::Compress::Lzma::LzmaError, 'IO::Uncompress::UnLzma' => \$IO::Uncompress::UnLzma::UnLzmaError, 'IO::Uncompress::UnLzma::unlzma' => \$IO::Uncompress::UnLzma::UnLzmaError, 'IO::Compress::DummyComp' => \$IO::Compress::DummyComp::DummyCompError, 'IO::Compress::DummyComp::dummycomp'=> \$IO::Compress::DummyComp::DummyCompError, 'IO::Uncompress::DummyUncomp' => \$IO::Uncompress::DummyUncomp::DummyUncompError, 'IO::Uncompress::DummyUncomp::dummyuncomp' => \$IO::Uncompress::DummyUncomp::DummyUncompError, ); my %TopFuncMap = ( 'IO::Compress::Gzip' => 'IO::Compress::Gzip::gzip', 'IO::Uncompress::Gunzip' => 'IO::Uncompress::Gunzip::gunzip', 'IO::Compress::Deflate' => 'IO::Compress::Deflate::deflate', 'IO::Uncompress::Inflate' => 'IO::Uncompress::Inflate::inflate', 'IO::Compress::RawDeflate' => 'IO::Compress::RawDeflate::rawdeflate', 'IO::Uncompress::RawInflate' => 'IO::Uncompress::RawInflate::rawinflate', 'IO::Uncompress::AnyInflate' => 'IO::Uncompress::AnyInflate::anyinflate', 'IO::Uncompress::AnyUncompress' => 'IO::Uncompress::AnyUncompress::anyuncompress', 'IO::Compress::Bzip2' => 'IO::Compress::Bzip2::bzip2', 'IO::Uncompress::Bunzip2' => 'IO::Uncompress::Bunzip2::bunzip2', 'IO::Compress::Zip' => 'IO::Compress::Zip::zip', 'IO::Uncompress::Unzip' => 'IO::Uncompress::Unzip::unzip', 'IO::Compress::Lzop' => 'IO::Compress::Lzop::lzop', 'IO::Uncompress::UnLzop' => 'IO::Uncompress::UnLzop::unlzop', 'IO::Compress::Lzf' => 'IO::Compress::Lzf::lzf', 'IO::Uncompress::UnLzf' => 'IO::Uncompress::UnLzf::unlzf', 'IO::Compress::PPMd' => 'IO::Compress::PPMd::ppmd', 'IO::Uncompress::UnPPMd' => 'IO::Uncompress::UnPPMd::unppmd', 'IO::Compress::Lzma' => 'IO::Compress::Lzma::lzma', 'IO::Uncompress::UnLzma' => 'IO::Uncompress::UnLzma::unlzma', 'IO::Compress::DummyComp' => 'IO::Compress::DummyComp::dummyuncomp', 'IO::Uncompress::DummyUncomp' => 'IO::Uncompress::DummyUncomp::dummyuncomp', ); %TopFuncMap = map { ($_ => $TopFuncMap{$_}, $TopFuncMap{$_} => $TopFuncMap{$_}) } keys %TopFuncMap ; #%TopFuncMap = map { ($_ => \&{ $TopFuncMap{$_} ) } #keys %TopFuncMap ; my %inverse = ( 'IO::Compress::Gzip' => 'IO::Uncompress::Gunzip', 'IO::Compress::Gzip::gzip' => 'IO::Uncompress::Gunzip::gunzip', 'IO::Compress::Deflate' => 'IO::Uncompress::Inflate', 'IO::Compress::Deflate::deflate' => 'IO::Uncompress::Inflate::inflate', 'IO::Compress::RawDeflate' => 'IO::Uncompress::RawInflate', 'IO::Compress::RawDeflate::rawdeflate' => 'IO::Uncompress::RawInflate::rawinflate', 'IO::Compress::Bzip2::bzip2' => 'IO::Uncompress::Bunzip2::bunzip2', 'IO::Compress::Bzip2' => 'IO::Uncompress::Bunzip2', 'IO::Compress::Zip::zip' => 'IO::Uncompress::Unzip::unzip', 'IO::Compress::Zip' => 'IO::Uncompress::Unzip', 'IO::Compress::Lzop::lzop' => 'IO::Uncompress::UnLzop::unlzop', 'IO::Compress::Lzop' => 'IO::Uncompress::UnLzop', 'IO::Compress::Lzf::lzf' => 'IO::Uncompress::UnLzf::unlzf', 'IO::Compress::Lzf' => 'IO::Uncompress::UnLzf', 'IO::Compress::PPMd::ppmd' => 'IO::Uncompress::UnPPMd::unppmd', 'IO::Compress::PPMd' => 'IO::Uncompress::UnPPMd', 'IO::Compress::Lzma::lzma' => 'IO::Uncompress::UnLzma::unlzma', 'IO::Compress::Lzma' => 'IO::Uncompress::UnLzma', 'IO::Compress::DummyComp::dummycomp' => 'IO::Uncompress::DummyUncomp::dummyuncomp', 'IO::Compress::DummyComp' => 'IO::Uncompress::DummyUncomp', ); %inverse = map { ($_ => $inverse{$_}, $inverse{$_} => $_) } keys %inverse; sub getInverse { my $class = shift ; return $inverse{$class} ; } sub getErrorRef { my $class = shift ; return $ErrorMap{$class} ; } sub getTopFuncRef { my $class = shift ; return \&{ $TopFuncMap{$class} } ; } sub getTopFuncName { my $class = shift ; return $TopFuncMap{$class} ; } sub compressBuffer { my $compWith = shift ; my $buffer = shift ; my %mapping = ( 'IO::Uncompress::Gunzip' => 'IO::Compress::Gzip', 'IO::Uncompress::Gunzip::gunzip' => 'IO::Compress::Gzip', 'IO::Uncompress::Inflate' => 'IO::Compress::Deflate', 'IO::Uncompress::Inflate::inflate' => 'IO::Compress::Deflate', 'IO::Uncompress::RawInflate' => 'IO::Compress::RawDeflate', 'IO::Uncompress::RawInflate::rawinflate' => 'IO::Compress::RawDeflate', 'IO::Uncompress::Bunzip2' => 'IO::Compress::Bzip2', 'IO::Uncompress::Bunzip2::bunzip2' => 'IO::Compress::Bzip2', 'IO::Uncompress::Unzip' => 'IO::Compress::Zip', 'IO::Uncompress::Unzip::unzip' => 'IO::Compress::Zip', 'IO::Uncompress::UnLzop' => 'IO::Compress::Lzop', 'IO::Uncompress::UnLzop::unlzop' => 'IO::Compress::Lzop', 'IO::Uncompress::UnLzp' => 'IO::Compress::Lzf', 'IO::Uncompress::UnLzf::unlzf' => 'IO::Compress::Lzf', 'IO::Uncompress::UnPPMd' => 'IO::Compress::PPMd', 'IO::Uncompress::UnPPMd::unppmd' => 'IO::Compress::PPMd', 'IO::Uncompress::AnyInflate' => 'IO::Compress::Gzip', 'IO::Uncompress::AnyInflate::anyinflate' => 'IO::Compress::Gzip', 'IO::Uncompress::AnyUncompress' => 'IO::Compress::Gzip', 'IO::Uncompress::AnyUncompress::anyuncompress' => 'IO::Compress::Gzip', 'IO::Uncompress::UnLzma' => 'IO::Compress::Lzma', 'IO::Uncompress::UnLzma::unlzma' => 'IO::Compress::Lzma', 'IO::Uncompress::DummyUncomp' => 'IO::Compress::DummyComp', 'IO::Uncompress::DummyUncomp::dummyuncomp'=> 'IO::Compress::DummyComp', ); my $out ; my $obj = $mapping{$compWith}->new( \$out); $obj->write($buffer) ; $obj->close(); return $out ; } our ($AnyUncompressError); BEGIN { eval ' use IO::Uncompress::AnyUncompress qw($AnyUncompressError); '; } sub anyUncompress { my $buffer = shift ; my $already = shift; my @opts = (); if (ref $buffer && ref $buffer eq 'ARRAY') { @opts = @$buffer; $buffer = shift @opts; } if (ref $buffer) { croak "buffer is undef" unless defined $$buffer; croak "buffer is empty" unless length $$buffer; } my $data ; if (IO::Compress::Base::Common::isaFilehandle($buffer)) { $data = readFile($buffer); } elsif (IO::Compress::Base::Common::isaFilename($buffer)) { $data = readFile($buffer); } else { $data = $$buffer ; } if (defined $already && length $already) { my $got = substr($data, 0, length($already)); substr($data, 0, length($already)) = ''; is $got, $already, ' Already OK' ; } my $out = ''; my $o = new IO::Uncompress::AnyUncompress \$data, Append => 1, Transparent => 0, RawInflate => 1, @opts or croak "Cannot open buffer/file: $AnyUncompressError" ; 1 while $o->read($out) > 0 ; croak "Error uncompressing -- " . $o->error() if $o->error() ; return $out ; } sub getHeaders { my $buffer = shift ; my $already = shift; my @opts = (); if (ref $buffer && ref $buffer eq 'ARRAY') { @opts = @$buffer; $buffer = shift @opts; } if (ref $buffer) { croak "buffer is undef" unless defined $$buffer; croak "buffer is empty" unless length $$buffer; } my $data ; if (IO::Compress::Base::Common::isaFilehandle($buffer)) { $data = readFile($buffer); } elsif (IO::Compress::Base::Common::isaFilename($buffer)) { $data = readFile($buffer); } else { $data = $$buffer ; } if (defined $already && length $already) { my $got = substr($data, 0, length($already)); substr($data, 0, length($already)) = ''; is $got, $already, ' Already OK' ; } my $out = ''; my $o = new IO::Uncompress::AnyUncompress \$data, MultiStream => 1, Append => 1, Transparent => 0, RawInflate => 1, @opts or croak "Cannot open buffer/file: $AnyUncompressError" ; 1 while $o->read($out) > 0 ; croak "Error uncompressing -- " . $o->error() if $o->error() ; return ($o->getHeaderInfo()) ; } sub mkComplete { my $class = shift ; my $data = shift; my $Error = getErrorRef($class); my $buffer ; my %params = (); if ($class eq 'IO::Compress::Gzip') { %params = ( Name => "My name", Comment => "a comment", ExtraField => ['ab' => "extra"], HeaderCRC => 1); } elsif ($class eq 'IO::Compress::Zip'){ %params = ( Name => "My name", Comment => "a comment", ZipComment => "last comment", exTime => [100, 200, 300], ExtraFieldLocal => ["ab" => "extra1"], ExtraFieldCentral => ["cd" => "extra2"], ); } my $z = new $class( \$buffer, %params) or croak "Cannot create $class object: $$Error"; $z->write($data); $z->close(); my $unc = getInverse($class); anyUncompress(\$buffer) eq $data or die "bad bad bad"; my $u = new $unc( \$buffer); my $info = $u->getHeaderInfo() ; return wantarray ? ($info, $buffer) : $buffer ; } sub mkErr { my $string = shift ; my ($dummy, $file, $line) = caller ; -- $line ; $file = quotemeta($file); #return "/$string\\s+at $file line $line/" if $] >= 5.006 ; return "/$string\\s+at /" ; } sub mkEvalErr { my $string = shift ; return "/$string\\s+at \\(eval /" if $] > 5.006 ; return "/$string\\s+at /" ; } sub dumpObj { my $obj = shift ; my ($dummy, $file, $line) = caller ; if (@_) { print "#\n# dumpOBJ from $file line $line @_\n" ; } else { print "#\n# dumpOBJ from $file line $line \n" ; } my $max = 0 ;; foreach my $k (keys %{ *$obj }) { $max = length $k if length $k > $max ; } foreach my $k (sort keys %{ *$obj }) { my $v = $obj->{$k} ; $v = '-undef-' unless defined $v; my $pad = ' ' x ($max - length($k) + 2) ; print "# $k$pad: [$v]\n"; } print "#\n" ; } sub getMultiValues { my $class = shift ; return (0,0) if $class =~ /lzf/i; return (1,0); } sub gotScalarUtilXS { eval ' use Scalar::Util "dualvar" '; return $@ ? 0 : 1 ; } sub currmem { # From https://github.com/eserte/srezic-repository/blob/master/perl/currmem#L14 my $pid = shift || $$; no warnings 'portable'; # because of possible large hex values on 64bit systems if ($^O eq 'freebsd' && open(MAP, "dd if=/proc/$pid/map bs=64k 2>/dev/null |")) { # FreeBSD my $mem = 0; my $realmem = 0; while() { my(@l) = split /\s+/; my $delta = (hex($l[1])-hex($l[0])); $mem += $delta; if ($l[11] ne 'vnode') { $realmem += $delta; } } close MAP; ($mem, $realmem); } elsif ($^O eq 'linux' && open(MAP, "/proc/$pid/maps")) { # Linux my $mem = 0; my $realmem = 0; while() { my(@l) = split /\s+/; my($start,$end) = split /-/, $l[0]; my $delta = (hex($end)-hex($start)); $mem += $delta; if (!defined $l[5] || $l[5] eq '' || $l[5] eq '[heap]') { $realmem += $delta; } } close MAP; ($mem, $realmem); } else { undef; } } sub displayMemoryUsage { my $message = shift; my ($mem, $realmem) = currmem(); print "$message:\t$mem\t$realmem\n"; } package CompTestUtils; 1; __END__ t/Test/Builder.pm t/Test/More.pm t/Test/Simple.pm t/compress/CompTestUtils.pm t/compress/any.pl t/compress/anyunc.pl t/compress/destroy.pl t/compress/generic.pl t/compress/merge.pl t/compress/multi.pl t/compress/newtied.pl t/compress/oneshot.pl t/compress/prime.pl t/compress/tied.pl t/compress/truncate.pl t/compress/zlib-generic.plParsing config.in... Building Zlib enabled Auto Detect Gzip OS Code.. Setting Gzip OS Code to 3 [Unix/Default] Looks Good. Compress-Raw-Lzma-2.101/t/meta-json.t0000644000175000017500000000044113450173064015753 0ustar paulpaul BEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t t/compress); use Test::More; eval "use Test::CPAN::Meta::JSON"; plan skip_all => "Test::CPAN::Meta::JSON required for testing META.json" if $@; meta_json_ok();Compress-Raw-Lzma-2.101/t/02filters.t0000644000175000017500000000761713747272672015722 0ustar paulpaulBEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t t/compress); use strict; use warnings; use bytes; use Test::More ; use CompTestUtils; my $XZ ; BEGIN { # use Test::NoWarnings, if available my $extra = 0 ; $extra = 1 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; plan tests => 2463 + $extra ; use_ok('Compress::Raw::Lzma') ; } { title "BCJ"; my @filters = map { "Lzma::Filter::$_" } qw(X86 PowerPC IA64 ARM ARMThumb Sparc); for my $filter (@filters) { no strict 'refs'; my $x = &{ $filter } ; isa_ok $x, $filter; isa_ok $x, 'Lzma::Filter::BCJ'; isa_ok $x, 'Lzma::Filter'; } isa_ok Lzma::Filter::X86, "Lzma::Filter::X86"; } { title "Delta"; { my $x = Lzma::Filter::Delta; isa_ok $x, 'Lzma::Filter::Delta'; isa_ok $x, 'Lzma::Filter'; } { my $x = Lzma::Filter::Delta Type => LZMA_DELTA_TYPE_BYTE, Distance => LZMA_DELTA_DIST_MAX ; isa_ok $x, 'Lzma::Filter::Delta'; isa_ok $x, 'Lzma::Filter'; } # TODO -- add error cases } { title "Lzma"; my @filters = map { "Lzma::Filter::$_" } qw(Lzma1 Lzma2); for my $filter (@filters) { no strict 'refs'; #my $x = &{ $filter } ; my $x = $filter->(); isa_ok $x, $filter; isa_ok $x, 'Lzma::Filter::Lzma'; isa_ok $x, 'Lzma::Filter'; } { my $x = Lzma::Filter::Lzma2 DictSize => 1024 * 1024 * 100, Lc => 0, Lp => 3, Pb => LZMA_PB_MAX, Mode => LZMA_MODE_FAST, Nice => 128, Mf => LZMA_MF_HC4, Depth => 77; isa_ok $x, 'Lzma::Filter::Lzma2'; isa_ok $x, 'Lzma::Filter'; } use constant oneK => 1024; use constant oneMeg => 1024 * 1024; sub testParam { my $name = shift; my $good_range = shift; my $bad_range = shift; my $message = shift; my $other = shift || []; for my $filter (@filters) { for my $value (@$good_range) { title "$filter + $name $value"; no strict 'refs'; #my $x = &{ $filter } ; my $x = $filter->($name => $value, @$other); isa_ok $x, $filter; isa_ok $x, 'Lzma::Filter::Lzma'; isa_ok $x, 'Lzma::Filter'; } for my $value (@$bad_range) { title "$filter + $name $value - error"; no strict 'refs'; #my $x = &{ $filter } ; eval { $filter->($name => $value, @$other) ; } ; like $@, mkErr(sprintf $message, $value), " catch error"; } } } testParam "DictSize", [ 4 * oneK, 1536 * oneMeg ], [ (4 * oneK) - 1, (1536 * oneMeg) + 1 ], "Dictsize %d not in range 4KiB - 1536Mib" ; testParam "Lc", [ 0 .. 4 ], [ 5 .. 10 ], "Lc %d not in range 0-4" ; testParam "Lp", [ 0 .. 4 ], [ 5 .. 10 ], "Lp %d not in range 0-4", [Lc => 0] ; testParam "Mode", [ LZMA_MODE_NORMAL, LZMA_MODE_FAST ], [ 5 .. 10 ], "Mode %d not LZMA_MODE_FAST or LZMA_MODE_NORMAL" ; testParam "Mf", [ LZMA_MF_HC3, LZMA_MF_HC4, LZMA_MF_BT2, LZMA_MF_BT3, LZMA_MF_BT4], [ 100, 300 ], "Mf %d not valid" ; testParam "Nice", [ 2 .. 273 ], [ 0, 1, 274 ], "Nice %d not in range 2-273" ; } Compress-Raw-Lzma-2.101/META.json0000664000175000017500000000235514014211600015041 0ustar paulpaul{ "abstract" : "Low-Level Interface to lzma compression library", "author" : [ "Paul Marquess " ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 7.34, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Compress-Raw-Lzma", "no_index" : { "directory" : [ "t", "inc", "t", "private" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/pmqs/Compress-Raw-Lzma/issues" }, "homepage" : "https://github.com/pmqs/Compress-Raw-Lzma", "repository" : { "type" : "git", "url" : "git://github.com/pmqs/Compress-Raw-Lzma.git", "web" : "https://github.com/pmqs/Compress-Raw-Lzma" } }, "version" : "2.101", "x_serialization_backend" : "JSON::PP version 4.02" } Compress-Raw-Lzma-2.101/META.yml0000664000175000017500000000136614014211600014672 0ustar paulpaul--- abstract: 'Low-Level Interface to lzma compression library' author: - 'Paul Marquess ' build_requires: ExtUtils::MakeMaker: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 7.34, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Compress-Raw-Lzma no_index: directory: - t - inc - t - private resources: bugtracker: https://github.com/pmqs/Compress-Raw-Lzma/issues homepage: https://github.com/pmqs/Compress-Raw-Lzma repository: git://github.com/pmqs/Compress-Raw-Lzma.git version: '2.101' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' Compress-Raw-Lzma-2.101/fallback/0000755000175000017500000000000014014211600015150 5ustar paulpaulCompress-Raw-Lzma-2.101/fallback/constants.h0000644000175000017500000006602313747272662017377 0ustar paulpaul#define PERL_constant_NOTFOUND 1 #define PERL_constant_NOTDEF 2 #define PERL_constant_ISIV 3 #define PERL_constant_ISNO 4 #define PERL_constant_ISNV 5 #define PERL_constant_ISPV 6 #define PERL_constant_ISPVN 7 #define PERL_constant_ISSV 8 #define PERL_constant_ISUNDEF 9 #define PERL_constant_ISUV 10 #define PERL_constant_ISYES 11 #ifndef NVTYPE typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */ #endif #ifndef aTHX_ #define aTHX_ /* 5.6 or later define this for threading support. */ #endif #ifndef pTHX_ #define pTHX_ /* 5.6 or later define this for threading support. */ #endif static int constant_11 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_FINISH LZMA_MF_BT2 LZMA_MF_BT3 LZMA_MF_BT4 LZMA_MF_HC3 LZMA_MF_HC4 LZMA_PB_MAX LZMA_PB_MIN */ /* Offset 10 gives the best switch position. */ switch (name[10]) { case '2': if (memEQ(name, "LZMA_MF_BT", 10)) { /* 2 */ #if 1 *iv_return = LZMA_MF_BT2; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case '3': if (memEQ(name, "LZMA_MF_BT", 10)) { /* 3 */ #if 1 *iv_return = LZMA_MF_BT3; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } if (memEQ(name, "LZMA_MF_HC", 10)) { /* 3 */ #if 1 *iv_return = LZMA_MF_HC3; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case '4': if (memEQ(name, "LZMA_MF_BT", 10)) { /* 4 */ #if 1 *iv_return = LZMA_MF_BT4; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } if (memEQ(name, "LZMA_MF_HC", 10)) { /* 4 */ #if 1 *iv_return = LZMA_MF_HC4; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'H': if (memEQ(name, "LZMA_FINIS", 10)) { /* H */ #if 1 *iv_return = LZMA_FINISH; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'N': if (memEQ(name, "LZMA_PB_MI", 10)) { /* N */ #ifdef LZMA_PB_MIN *iv_return = LZMA_PB_MIN; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'X': if (memEQ(name, "LZMA_PB_MA", 10)) { /* X */ #ifdef LZMA_PB_MAX *iv_return = LZMA_PB_MAX; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_13 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_LCLP_MAX LZMA_LCLP_MIN LZMA_NO_CHECK */ /* Offset 11 gives the best switch position. */ switch (name[11]) { case 'A': if (memEQ(name, "LZMA_LCLP_MAX", 13)) { /* ^ */ #ifdef LZMA_LCLP_MAX *iv_return = LZMA_LCLP_MAX; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'C': if (memEQ(name, "LZMA_NO_CHECK", 13)) { /* ^ */ #if 1 *iv_return = LZMA_NO_CHECK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'I': if (memEQ(name, "LZMA_LCLP_MIN", 13)) { /* ^ */ #ifdef LZMA_LCLP_MIN *iv_return = LZMA_LCLP_MIN; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_14 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_BUF_ERROR LZMA_GET_CHECK LZMA_MEM_ERROR LZMA_MODE_FAST */ /* Offset 7 gives the best switch position. */ switch (name[7]) { case 'D': if (memEQ(name, "LZMA_MODE_FAST", 14)) { /* ^ */ #if 1 *iv_return = LZMA_MODE_FAST; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'F': if (memEQ(name, "LZMA_BUF_ERROR", 14)) { /* ^ */ #if 1 *iv_return = LZMA_BUF_ERROR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'M': if (memEQ(name, "LZMA_MEM_ERROR", 14)) { /* ^ */ #if 1 *iv_return = LZMA_MEM_ERROR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'T': if (memEQ(name, "LZMA_GET_CHECK", 14)) { /* ^ */ #if 1 *iv_return = LZMA_GET_CHECK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_15 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_CHECK_NONE LZMA_DATA_ERROR LZMA_FILTER_ARM LZMA_FILTER_X86 LZMA_FULL_FLUSH LZMA_LC_DEFAULT LZMA_LP_DEFAULT LZMA_PB_DEFAULT LZMA_PROG_ERROR LZMA_STREAM_END LZMA_SYNC_FLUSH */ /* Offset 6 gives the best switch position. */ switch (name[6]) { case 'A': if (memEQ(name, "LZMA_DATA_ERROR", 15)) { /* ^ */ #if 1 *iv_return = LZMA_DATA_ERROR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'B': if (memEQ(name, "LZMA_PB_DEFAULT", 15)) { /* ^ */ #ifdef LZMA_PB_DEFAULT *iv_return = LZMA_PB_DEFAULT; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'C': if (memEQ(name, "LZMA_LC_DEFAULT", 15)) { /* ^ */ #ifdef LZMA_LC_DEFAULT *iv_return = LZMA_LC_DEFAULT; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'H': if (memEQ(name, "LZMA_CHECK_NONE", 15)) { /* ^ */ #if 1 *iv_return = LZMA_CHECK_NONE; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'I': if (memEQ(name, "LZMA_FILTER_ARM", 15)) { /* ^ */ #ifdef LZMA_FILTER_ARM *iv_return = LZMA_FILTER_ARM; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } if (memEQ(name, "LZMA_FILTER_X86", 15)) { /* ^ */ #ifdef LZMA_FILTER_X86 *iv_return = LZMA_FILTER_X86; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'P': if (memEQ(name, "LZMA_LP_DEFAULT", 15)) { /* ^ */ #ifdef LZMA_LP_DEFAULT *iv_return = LZMA_LP_DEFAULT; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'R': if (memEQ(name, "LZMA_PROG_ERROR", 15)) { /* ^ */ #if 1 *iv_return = LZMA_PROG_ERROR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'T': if (memEQ(name, "LZMA_STREAM_END", 15)) { /* ^ */ #if 1 *iv_return = LZMA_STREAM_END; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'U': if (memEQ(name, "LZMA_FULL_FLUSH", 15)) { /* ^ */ #if 1 *iv_return = LZMA_FULL_FLUSH; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'Y': if (memEQ(name, "LZMA_SYNC_FLUSH", 15)) { /* ^ */ #if 1 *iv_return = LZMA_SYNC_FLUSH; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_16 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_CHECK_CRC32 LZMA_CHECK_CRC64 LZMA_FILTERS_MAX LZMA_FILTER_IA64 LZMA_MODE_NORMAL */ /* Offset 11 gives the best switch position. */ switch (name[11]) { case 'C': if (memEQ(name, "LZMA_CHECK_CRC32", 16)) { /* ^ */ #if 1 *iv_return = LZMA_CHECK_CRC32; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } if (memEQ(name, "LZMA_CHECK_CRC64", 16)) { /* ^ */ #if 1 *iv_return = LZMA_CHECK_CRC64; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'O': if (memEQ(name, "LZMA_MODE_NORMAL", 16)) { /* ^ */ #if 1 *iv_return = LZMA_MODE_NORMAL; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'S': if (memEQ(name, "LZMA_FILTERS_MAX", 16)) { /* ^ */ #ifdef LZMA_FILTERS_MAX *iv_return = LZMA_FILTERS_MAX; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case '_': if (memEQ(name, "LZMA_FILTER_IA64", 16)) { /* ^ */ #ifdef LZMA_FILTER_IA64 *iv_return = LZMA_FILTER_IA64; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_17 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_CHECK_ID_MAX LZMA_CHECK_SHA256 LZMA_CONCATENATED LZMA_FILTER_DELTA LZMA_FILTER_LZMA2 LZMA_FILTER_SPARC LZMA_FORMAT_ERROR */ /* Offset 16 gives the best switch position. */ switch (name[16]) { case '2': if (memEQ(name, "LZMA_FILTER_LZMA", 16)) { /* 2 */ #ifdef LZMA_FILTER_LZMA2 *iv_return = LZMA_FILTER_LZMA2; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case '6': if (memEQ(name, "LZMA_CHECK_SHA25", 16)) { /* 6 */ #if 1 *iv_return = LZMA_CHECK_SHA256; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'A': if (memEQ(name, "LZMA_FILTER_DELT", 16)) { /* A */ #ifdef LZMA_FILTER_DELTA *iv_return = LZMA_FILTER_DELTA; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'C': if (memEQ(name, "LZMA_FILTER_SPAR", 16)) { /* C */ #ifdef LZMA_FILTER_SPARC *iv_return = LZMA_FILTER_SPARC; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'D': if (memEQ(name, "LZMA_CONCATENATE", 16)) { /* D */ #ifdef LZMA_CONCATENATED *iv_return = LZMA_CONCATENATED; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'R': if (memEQ(name, "LZMA_FORMAT_ERRO", 16)) { /* R */ #if 1 *iv_return = LZMA_FORMAT_ERROR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'X': if (memEQ(name, "LZMA_CHECK_ID_MA", 16)) { /* X */ #ifdef LZMA_CHECK_ID_MAX *iv_return = LZMA_CHECK_ID_MAX; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_18 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_DICT_SIZE_MIN LZMA_OPTIONS_ERROR LZMA_TELL_NO_CHECK LZMA_VERSION_MAJOR LZMA_VERSION_MINOR LZMA_VERSION_PATCH */ /* Offset 15 gives the best switch position. */ switch (name[15]) { case 'E': if (memEQ(name, "LZMA_TELL_NO_CHECK", 18)) { /* ^ */ #ifdef LZMA_TELL_NO_CHECK *iv_return = LZMA_TELL_NO_CHECK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'J': if (memEQ(name, "LZMA_VERSION_MAJOR", 18)) { /* ^ */ #ifdef LZMA_VERSION_MAJOR *iv_return = LZMA_VERSION_MAJOR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'M': if (memEQ(name, "LZMA_DICT_SIZE_MIN", 18)) { /* ^ */ #ifdef LZMA_DICT_SIZE_MIN *iv_return = LZMA_DICT_SIZE_MIN; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'N': if (memEQ(name, "LZMA_VERSION_MINOR", 18)) { /* ^ */ #ifdef LZMA_VERSION_MINOR *iv_return = LZMA_VERSION_MINOR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'R': if (memEQ(name, "LZMA_OPTIONS_ERROR", 18)) { /* ^ */ #if 1 *iv_return = LZMA_OPTIONS_ERROR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'T': if (memEQ(name, "LZMA_VERSION_PATCH", 18)) { /* ^ */ #ifdef LZMA_VERSION_PATCH *iv_return = LZMA_VERSION_PATCH; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_19 (pTHX_ const char *name, IV *iv_return, const char **pv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_CHECK_SIZE_MAX LZMA_DELTA_DIST_MAX LZMA_DELTA_DIST_MIN LZMA_FILTER_POWERPC LZMA_MEMLIMIT_ERROR LZMA_PRESET_DEFAULT LZMA_PRESET_EXTREME LZMA_TELL_ANY_CHECK LZMA_VERSION_STRING */ /* Offset 17 gives the best switch position. */ switch (name[17]) { case 'A': if (memEQ(name, "LZMA_CHECK_SIZE_MAX", 19)) { /* ^ */ #ifdef LZMA_CHECK_SIZE_MAX *iv_return = LZMA_CHECK_SIZE_MAX; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } if (memEQ(name, "LZMA_DELTA_DIST_MAX", 19)) { /* ^ */ #ifdef LZMA_DELTA_DIST_MAX *iv_return = LZMA_DELTA_DIST_MAX; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'C': if (memEQ(name, "LZMA_TELL_ANY_CHECK", 19)) { /* ^ */ #ifdef LZMA_TELL_ANY_CHECK *iv_return = LZMA_TELL_ANY_CHECK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'I': if (memEQ(name, "LZMA_DELTA_DIST_MIN", 19)) { /* ^ */ #ifdef LZMA_DELTA_DIST_MIN *iv_return = LZMA_DELTA_DIST_MIN; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'L': if (memEQ(name, "LZMA_PRESET_DEFAULT", 19)) { /* ^ */ #ifdef LZMA_PRESET_DEFAULT *iv_return = LZMA_PRESET_DEFAULT; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'M': if (memEQ(name, "LZMA_PRESET_EXTREME", 19)) { /* ^ */ #ifdef LZMA_PRESET_EXTREME *iv_return = LZMA_PRESET_EXTREME; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'N': if (memEQ(name, "LZMA_VERSION_STRING", 19)) { /* ^ */ #ifdef LZMA_VERSION_STRING *pv_return = LZMA_VERSION_STRING; return PERL_constant_ISPV; #else return PERL_constant_NOTDEF; #endif } break; case 'O': if (memEQ(name, "LZMA_MEMLIMIT_ERROR", 19)) { /* ^ */ #if 1 *iv_return = LZMA_MEMLIMIT_ERROR; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'P': if (memEQ(name, "LZMA_FILTER_POWERPC", 19)) { /* ^ */ #ifdef LZMA_FILTER_POWERPC *iv_return = LZMA_FILTER_POWERPC; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant_22 (pTHX_ const char *name, IV *iv_return) { /* When generated this function returned values for the list of names given here. However, subsequent manual editing may have added or removed some. LZMA_BACKWARD_SIZE_MIN LZMA_DICT_SIZE_DEFAULT LZMA_PRESET_LEVEL_MASK LZMA_UNSUPPORTED_CHECK LZMA_VERSION_STABILITY */ /* Offset 6 gives the best switch position. */ switch (name[6]) { case 'A': if (memEQ(name, "LZMA_BACKWARD_SIZE_MIN", 22)) { /* ^ */ #ifdef LZMA_BACKWARD_SIZE_MIN *iv_return = LZMA_BACKWARD_SIZE_MIN; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'E': if (memEQ(name, "LZMA_VERSION_STABILITY", 22)) { /* ^ */ #ifdef LZMA_VERSION_STABILITY *iv_return = LZMA_VERSION_STABILITY; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'I': if (memEQ(name, "LZMA_DICT_SIZE_DEFAULT", 22)) { /* ^ */ #ifdef LZMA_DICT_SIZE_DEFAULT *iv_return = LZMA_DICT_SIZE_DEFAULT; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'N': if (memEQ(name, "LZMA_UNSUPPORTED_CHECK", 22)) { /* ^ */ #if 1 *iv_return = LZMA_UNSUPPORTED_CHECK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'R': if (memEQ(name, "LZMA_PRESET_LEVEL_MASK", 22)) { /* ^ */ #ifdef LZMA_PRESET_LEVEL_MASK *iv_return = LZMA_PRESET_LEVEL_MASK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } static int constant (pTHX_ const char *name, STRLEN len, IV *iv_return, const char **pv_return) { /* Initially switch on the length of the name. */ /* When generated this function returned values for the list of names given in this section of perl code. Rather than manually editing these functions to add or remove constants, which would result in this comment and section of code becoming inaccurate, we recommend that you edit this section of code, and use it to regenerate a new set of constant functions which you then use to replace the originals. Regenerate these constant functions by feeding this entire source file to perl -x #!/linux-shared/base/perl/install/bin/perl -w use ExtUtils::Constant qw (constant_types C_constant XS_constant); my $types = {map {($_, 1)} qw(IV PV)}; my @names = (qw(LZMA_BACKWARD_SIZE_MIN LZMA_BLOCK_HEADER_SIZE_MAX LZMA_BLOCK_HEADER_SIZE_MIN LZMA_CHECK_ID_MAX LZMA_CHECK_SIZE_MAX LZMA_CONCATENATED LZMA_DELTA_DIST_MAX LZMA_DELTA_DIST_MIN LZMA_DICT_SIZE_DEFAULT LZMA_DICT_SIZE_MIN LZMA_FILTERS_MAX LZMA_FILTER_ARM LZMA_FILTER_ARMTHUMB LZMA_FILTER_DELTA LZMA_FILTER_IA64 LZMA_FILTER_LZMA2 LZMA_FILTER_POWERPC LZMA_FILTER_SPARC LZMA_FILTER_X86 LZMA_LCLP_MAX LZMA_LCLP_MIN LZMA_LC_DEFAULT LZMA_LP_DEFAULT LZMA_PB_DEFAULT LZMA_PB_MAX LZMA_PB_MIN LZMA_PRESET_DEFAULT LZMA_PRESET_EXTREME LZMA_PRESET_LEVEL_MASK LZMA_STREAM_HEADER_SIZE LZMA_TELL_ANY_CHECK LZMA_TELL_NO_CHECK LZMA_TELL_UNSUPPORTED_CHECK LZMA_VERSION LZMA_VERSION_MAJOR LZMA_VERSION_MINOR LZMA_VERSION_PATCH LZMA_VERSION_STABILITY), {name=>"LZMA_BUF_ERROR", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_CHECK_CRC32", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_CHECK_CRC64", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_CHECK_NONE", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_CHECK_SHA256", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_DATA_ERROR", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_DELTA_TYPE_BYTE", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_FINISH", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_FORMAT_ERROR", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_FULL_FLUSH", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_GET_CHECK", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MEMLIMIT_ERROR", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MEM_ERROR", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MF_BT2", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MF_BT3", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MF_BT4", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MF_HC3", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MF_HC4", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MODE_FAST", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_MODE_NORMAL", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_NO_CHECK", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_OK", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_OPTIONS_ERROR", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_PROG_ERROR", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_RUN", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_STREAM_END", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_SYNC_FLUSH", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_UNSUPPORTED_CHECK", type=>"IV", macro=>["#if 1\n", "#endif\n"]}, {name=>"LZMA_VERSION_STABILITY_STRING", type=>"PV", macro=>["#ifdef LZMA_VERSION_STABILITY_STRING \n", "#endif\n"]}, {name=>"LZMA_VERSION_STRING", type=>"PV", macro=>["#ifdef LZMA_VERSION_STRING \n", "#endif\n"]}); print constant_types(), "\n"; # macro defs foreach (C_constant ("Lzma", 'constant', 'IV', $types, undef, 3, @names) ) { print $_, "\n"; # C constant subs } print "\n#### XS Section:\n"; print XS_constant ("Lzma", $types); __END__ */ switch (len) { case 7: if (memEQ(name, "LZMA_OK", 7)) { #if 1 *iv_return = LZMA_OK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 8: if (memEQ(name, "LZMA_RUN", 8)) { #if 1 *iv_return = LZMA_RUN; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 11: return constant_11 (aTHX_ name, iv_return); break; case 12: if (memEQ(name, "LZMA_VERSION", 12)) { #ifdef LZMA_VERSION *iv_return = LZMA_VERSION; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 13: return constant_13 (aTHX_ name, iv_return); break; case 14: return constant_14 (aTHX_ name, iv_return); break; case 15: return constant_15 (aTHX_ name, iv_return); break; case 16: return constant_16 (aTHX_ name, iv_return); break; case 17: return constant_17 (aTHX_ name, iv_return); break; case 18: return constant_18 (aTHX_ name, iv_return); break; case 19: return constant_19 (aTHX_ name, iv_return, pv_return); break; case 20: /* Names all of length 20. */ /* LZMA_DELTA_TYPE_BYTE LZMA_FILTER_ARMTHUMB */ /* Offset 5 gives the best switch position. */ switch (name[5]) { case 'D': if (memEQ(name, "LZMA_DELTA_TYPE_BYTE", 20)) { /* ^ */ #if 1 *iv_return = LZMA_DELTA_TYPE_BYTE; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'F': if (memEQ(name, "LZMA_FILTER_ARMTHUMB", 20)) { /* ^ */ #ifdef LZMA_FILTER_ARMTHUMB *iv_return = LZMA_FILTER_ARMTHUMB; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } break; case 22: return constant_22 (aTHX_ name, iv_return); break; case 23: if (memEQ(name, "LZMA_STREAM_HEADER_SIZE", 23)) { #ifdef LZMA_STREAM_HEADER_SIZE *iv_return = LZMA_STREAM_HEADER_SIZE; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 26: /* Names all of length 26. */ /* LZMA_BLOCK_HEADER_SIZE_MAX LZMA_BLOCK_HEADER_SIZE_MIN */ /* Offset 24 gives the best switch position. */ switch (name[24]) { case 'A': if (memEQ(name, "LZMA_BLOCK_HEADER_SIZE_MAX", 26)) { /* ^ */ #ifdef LZMA_BLOCK_HEADER_SIZE_MAX *iv_return = LZMA_BLOCK_HEADER_SIZE_MAX; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 'I': if (memEQ(name, "LZMA_BLOCK_HEADER_SIZE_MIN", 26)) { /* ^ */ #ifdef LZMA_BLOCK_HEADER_SIZE_MIN *iv_return = LZMA_BLOCK_HEADER_SIZE_MIN; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; } break; case 27: if (memEQ(name, "LZMA_TELL_UNSUPPORTED_CHECK", 27)) { #ifdef LZMA_TELL_UNSUPPORTED_CHECK *iv_return = LZMA_TELL_UNSUPPORTED_CHECK; return PERL_constant_ISIV; #else return PERL_constant_NOTDEF; #endif } break; case 29: if (memEQ(name, "LZMA_VERSION_STABILITY_STRING", 29)) { #ifdef LZMA_VERSION_STABILITY_STRING *pv_return = LZMA_VERSION_STABILITY_STRING; return PERL_constant_ISPV; #else return PERL_constant_NOTDEF; #endif } break; } return PERL_constant_NOTFOUND; } Compress-Raw-Lzma-2.101/fallback/constants.xs0000644000175000017500000000477613443224313017570 0ustar paulpaulvoid constant(sv) PREINIT: #ifdef dXSTARG dXSTARG; /* Faster if we have it. */ #else dTARGET; #endif STRLEN len; int type; IV iv; /* NV nv; Uncomment this if you need to return NVs */ const char *pv; INPUT: SV * sv; const char * s = SvPV(sv, len); PPCODE: /* Change this to constant(aTHX_ s, len, &iv, &nv); if you need to return both NVs and IVs */ type = constant(aTHX_ s, len, &iv, &pv); /* Return 1 or 2 items. First is error message, or undef if no error. Second, if present, is found value */ switch (type) { case PERL_constant_NOTFOUND: sv = sv_2mortal(newSVpvf("%s is not a valid Lzma macro", s)); PUSHs(sv); break; case PERL_constant_NOTDEF: sv = sv_2mortal(newSVpvf( "Your vendor has not defined Lzma macro %s, used", s)); PUSHs(sv); break; case PERL_constant_ISIV: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHi(iv); break; /* Uncomment this if you need to return NOs case PERL_constant_ISNO: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHs(&PL_sv_no); break; */ /* Uncomment this if you need to return NVs case PERL_constant_ISNV: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHn(nv); break; */ case PERL_constant_ISPV: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHp(pv, strlen(pv)); break; /* Uncomment this if you need to return PVNs case PERL_constant_ISPVN: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHp(pv, iv); break; */ /* Uncomment this if you need to return SVs case PERL_constant_ISSV: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHs(sv); break; */ /* Uncomment this if you need to return UNDEFs case PERL_constant_ISUNDEF: break; */ /* Uncomment this if you need to return UVs case PERL_constant_ISUV: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHu((UV)iv); break; */ /* Uncomment this if you need to return YESs case PERL_constant_ISYES: EXTEND(SP, 1); PUSHs(&PL_sv_undef); PUSHs(&PL_sv_yes); break; */ default: sv = sv_2mortal(newSVpvf( "Unexpected return type %d while processing Lzma macro %s, used", type, s)); PUSHs(sv); } Compress-Raw-Lzma-2.101/Lzma.xs0000644000175000017500000010653413767226326014732 0ustar paulpaul/* Filename: Lzma.xs * Author : Paul Marquess, * Created : 14th March 2009 * Version : 2.000 * * Copyright (c) 2009-2010 Paul Marquess. All rights reserved. * This program is free software; you can redistribute it and/or * modify it under the same terms as Perl itself. * */ #define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "lzma.h" #define NEED_sv_2pv_nolen #include "ppport.h" #if PERL_REVISION == 5 && (PERL_VERSION < 8 || (PERL_VERSION == 8 && PERL_SUBVERSION < 4 )) # ifdef SvPVbyte_force # undef SvPVbyte_force # endif # define SvPVbyte_force(sv,lp) SvPV_force(sv,lp) #endif #ifndef SvPVbyte_nolen # define SvPVbyte_nolen SvPV_nolen #endif #if PERL_REVISION == 5 && (PERL_VERSION >= 8 || (PERL_VERSION == 8 && PERL_SUBVERSION < 4 )) # define UTF8_AVAILABLE #endif typedef int DualType ; typedef int int_undef ; typedef unsigned long uLong; typedef unsigned int uInt; typedef struct di_stream { int flags ; #define FLAG_APPEND_OUTPUT 1 #define FLAG_CONSUME_INPUT 8 #define FLAG_LIMIT_OUTPUT 16 //bool is_tainted; bool forZip; void* extraAddress ; lzma_stream stream ; lzma_filter filters[LZMA_FILTERS_MAX + 1]; SV* sv_filters[LZMA_FILTERS_MAX]; uInt bufsize; int last_error ; uint64_t bytesInflated ; uint64_t compressedBytes ; uint64_t uncompressedBytes ; } di_stream; typedef struct di_filter { lzma_filter filter; SV* dict; } di_filter; typedef di_stream * deflateStream ; typedef di_stream * Compress__Raw__Lzma ; typedef di_stream * Compress__Raw__Lzma__Encoder ; typedef di_stream * Compress__Raw__Lzma__Decoder ; typedef di_filter * Lzma__Filter ; typedef di_filter * Lzma__Filter__Lzma; typedef di_filter * Lzma__Filter__BCJ ; typedef di_filter * Lzma__Filter__Delta ; typedef di_filter * Lzma__Filter__SubBlock ; typedef di_stream * inflateStream ; typedef lzma_options_lzma * Compress__Raw__Lzma__Options; #define COMPRESS_CLASS "Compress::Raw::Lzma::Encoder" #define UNCOMPRESS_CLASS "Compress::Raw::Lzma::Decoder" #define ZMALLOC(to, typ) (((to) = (typ *)safemalloc(sizeof(typ))), \ Zero((to),1,typ)) #define setDefaultOptions(options) \ { \ Zero((options),1,lzma_options_lzma); \ (options)->dict_size = LZMA_DICT_SIZE_DEFAULT; \ (options)->preset_dict = NULL; \ (options)->preset_dict_size = 0; \ (options)->lc = LZMA_LC_DEFAULT; \ (options)->lp = LZMA_LP_DEFAULT; \ (options)->pb = LZMA_PB_DEFAULT; \ (options)->mode = LZMA_MODE_NORMAL; \ (options)->nice_len = 64; \ (options)->mf = LZMA_MF_BT4; \ (options)->depth = 0; \ } #if 0 #if sizeof(unsigned long) >= 8 #define IN_u64(arg) (unsigned long)SvUV(arg) #define OUT_u64(arg, var) sv_setuv(arg, (IV)var) #else #define IN_u64(arg) if (SvOK($arg)) $var = ($type)SvPVbyte_nolen($arg); else $var = NULL ; #define OUT_u64(arg, var) sv_setpv((SV*)arg, var); #endif #endif /*** Tainting ***/ #define isTainted(sv) ( SvTAINTED(sv) || (SvROK(sv) ? SvTAINTED(SvRV(sv)) : FALSE)) #define rememberTainting(sv) STMT_START { s->is_tainted |= isTainted(sv); } STMT_END #define setTainted(sv) STMT_START { SvTAINTED_on(sv); } STMT_END #define taintedStack(x) ( FALSE || items >= x && isTainted(ST(x-1)) ) /* #define taintedStack(items) ( isTainted(ST(items-1)) ) */ #define taintedStack_1 ( taintedStack(1) ) #define taintedStack_2 ( taintedStack_1 || taintedStack(2) ) #define taintedStack_3 ( taintedStack_2 || taintedStack(3) ) #define taintedStack_4 ( taintedStack_3 || taintedStack(4) ) #define taintedStack_5 ( taintedStack_4 || taintedStack(5) ) #define taintedStack_6 ( taintedStack_5 || taintedStack(6) ) #define taintedStack_7 ( taintedStack_6 || taintedStack(7) ) #define taintedStack_8 ( taintedStack_7 || taintedStack(8) ) #define getTaint1 ( s->is_tainted = s->is_tainted || taintedStack_1 ) #define getTaint2 ( s->is_tainted = s->is_tainted || taintedStack_2 ) #define getTaint3 ( s->is_tainted = s->is_tainted || taintedStack_3 ) #define getTaint4 ( s->is_tainted = s->is_tainted || taintedStack_4 ) #define getTaint5 ( s->is_tainted = s->is_tainted || taintedStack_5 ) #define getTaint6 ( s->is_tainted = s->is_tainted || taintedStack_6 ) #define getTaint7 ( s->is_tainted = s->is_tainted || taintedStack_7 ) #define getTaint8 ( s->is_tainted = s->is_tainted || taintedStack_8 ) /*** End Tainting ***/ //static const char * const my_l_errmsg[] = { static const char my_l_errmsg[][34] = { "OK", /* LZMA_OK = 0 */ "End of stream", /* LZMA_STREAM_END = 1 */ "No integrity check", /* LZMA_NO_CHECK = 2 */ "Cannot calculate integrity check", /* LZMA_UNSUPPORTED_CHECK = 3 */ "Integrity check type available", /* LZMA_GET_CHECK = 4 */ "Cannot allocate memory", /* LZMA_MEM_ERROR = 5 */ "Memory usage limit was reached", /* LZMA_MEMLIMIT_ERROR = 6 */ "File format not recognized", /* LZMA_FORMAT_ERROR = 7 */ "Invalid or unsupported options", /* LZMA_OPTIONS_ERROR = 8 */ "Data is corrupt", /* LZMA_DATA_ERROR = 9 */ "No progress is possible", /* LZMA_BUF_ERROR = 10 */ "Programming error", /* LZMA_PROG_ERROR = 11 */ ""}; #define setDUALstatus(var, err) \ sv_setnv(var, (double)err) ; \ sv_setpv(var, ((err) ? GetErrorString(err) : "")) ; \ SvNOK_on(var); #if defined(__SYMBIAN32__) # define NO_WRITEABLE_DATA #endif #define TRACE_DEFAULT 0 #ifdef NO_WRITEABLE_DATA # define trace TRACE_DEFAULT #else static int trace = TRACE_DEFAULT ; #endif /* Dodge PerlIO hiding of these functions. */ #undef printf #if 1 #define getInnerObject(x) (*av_fetch((AV*)SvRV(x), 0, FALSE)) #else #define getInnerObject(x) ((SV*)SvRV(sv)) #endif static char * #ifdef CAN_PROTOTYPE GetErrorString(int error_no) #else GetErrorString(error_no) int error_no ; #endif { dTHX; char * errstr ; errstr = (char*) my_l_errmsg[error_no]; return errstr ; } #if 0 static void #ifdef CAN_PROTOTYPE DispHex(void * ptr, int length) #else DispHex(ptr, length) void * ptr; int length; #endif { char * p = (char*)ptr; int i; for (i = 0; i < length; ++i) { printf(" %02x", 0xFF & *(p+i)); } } static void #ifdef CAN_PROTOTYPE DispStream(di_stream * s, SV* sv, const char * message) #else DispStream(s, message) di_stream * s; const char * message; #endif { dTHX; #if 0 if (! trace) return ; #endif #define EnDis(f) (s->flags & f ? "Enabled" : "Disabled") printf("DispStream 0x%p", s) ; if (message) printf("- %s \n", message) ; printf("\n") ; if (sv) { sv_dump(sv); printf("\n") ; } if (!s) { printf(" stream pointer is NULL\n"); } else { printf(" stream 0x%p\n", &(s->stream)); printf(" next_in 0x%p", s->stream.next_in); if (s->stream.next_in){ printf(" =>"); DispHex((void*)s->stream.next_in, 4); } printf("\n"); printf(" next_out 0x%p", s->stream.next_out); if (s->stream.next_out){ printf(" =>"); DispHex((void*)s->stream.next_out, 4); } printf("\n"); printf(" avail_in %lu\n", (unsigned long)s->stream.avail_in); printf(" avail_out %lu\n", (unsigned long)s->stream.avail_out); printf(" bufsize %lu\n", (unsigned long)s->bufsize); printf(" flags 0x%x\n", s->flags); printf(" APPEND %s\n", EnDis(FLAG_APPEND_OUTPUT)); printf(" CONSUME %s\n", EnDis(FLAG_CONSUME_INPUT)); printf(" LIMIT %s\n", EnDis(FLAG_LIMIT_OUTPUT)); printf("\n"); } } #endif void* my_alloc (void* opaque, size_t items, size_t size) { PERL_UNUSED_VAR(opaque); return safemalloc(items * size); } void my_free (void* opaque, void* ptr) { PERL_UNUSED_VAR(opaque); safefree(ptr); return; } static di_stream * #ifdef CAN_PROTOTYPE InitStream(void) #else InitStream() #endif { dTHX; di_stream *s ; lzma_allocator * allocator; ZMALLOC(s, di_stream) ; /* lzma_memory_usage(lzma_preset_lzma, TRUE); */ ZMALLOC(allocator, lzma_allocator) ; allocator->alloc = my_alloc; allocator->free = my_free; s->stream.allocator = allocator; return s ; } static void #ifdef CAN_PROTOTYPE PostInitStream(di_stream * s, int flags, int bufsize) #else PostInitStream(s, flags, bufsize) di_stream *s ; int flags ; int bufsize; #endif { s->bufsize = bufsize; s->last_error = LZMA_OK ; s->flags = flags ; } bool setupFilters(di_stream* s, AV* filters, const char* properties) { dTHX; int i = 0; if (properties) { s->filters[0].id = LZMA_FILTER_LZMA1; if (lzma_properties_decode(&s->filters[0], s->stream.allocator, (const uint8_t*)properties, 5) != LZMA_OK) return FALSE; s->extraAddress = (void*)s->filters[0].options; ++i; } else { AV* f = filters; int count = av_len(f) ; for (i = 0; i <= count; ++i) { SV * fptr = (SV*) * av_fetch(f, i, FALSE) ; IV tmp = SvIV((SV*)SvRV(fptr)); di_filter* filter = INT2PTR(di_filter*, tmp); /* Keep a reference to the filter so it doesn't get destroyed */ s->sv_filters[i] = newSVsv(fptr) ; s->filters[i].id = filter->filter.id; s->filters[i].options = filter->filter.options; } } /* Terminate the filter list */ s->filters[i].id = LZMA_VLI_UNKNOWN ; return TRUE; } void destroyStream(di_stream * s) { dTHX; if (s) { int i; if (s->extraAddress) Safefree(s->extraAddress) ; if (s->stream.allocator) Safefree(s->stream.allocator); for (i = 0; i < LZMA_FILTERS_MAX; ++i) { if (s->sv_filters[i]) SvREFCNT_dec(s->sv_filters[i]); } Safefree(s) ; } } static SV* #ifdef CAN_PROTOTYPE deRef(SV * sv, char * string) #else deRef(sv, string) SV * sv ; char * string; #endif { dTHX; SvGETMAGIC(sv); if (SvROK(sv)) { sv = SvRV(sv) ; SvGETMAGIC(sv); switch(SvTYPE(sv)) { case SVt_PVAV: case SVt_PVHV: case SVt_PVCV: croak("%s: buffer parameter is not a SCALAR reference", string); default: break; } if (SvROK(sv)) croak("%s: buffer parameter is a reference to a reference", string) ; } if (!SvOK(sv)) { sv = sv_2mortal(newSVpv("", 0)); } return sv ; } static SV* #ifdef CAN_PROTOTYPE deRef_l(SV * sv, char * string) #else deRef_l(sv, string) SV * sv ; char * string ; #endif { dTHX; bool wipe = 0 ; STRLEN na; SvGETMAGIC(sv); wipe = ! SvOK(sv) ; if (SvROK(sv)) { sv = SvRV(sv) ; SvGETMAGIC(sv); wipe = ! SvOK(sv) ; switch(SvTYPE(sv)) { case SVt_PVAV: case SVt_PVHV: case SVt_PVCV: croak("%s: buffer parameter is not a SCALAR reference", string); default: break; } if (SvROK(sv)) croak("%s: buffer parameter is a reference to a reference", string) ; } if (SvREADONLY(sv) && PL_curcop != &PL_compiling) croak("%s: buffer parameter is read-only", string); SvUPGRADE(sv, SVt_PV); if (wipe) sv_setpv(sv, "") ; else (void)SvPVbyte_force(sv, na) ; return sv ; } #if 0 static lzma_filter all_filters[LZMA_FILTERS_MAX + 1]; //static lzma_options_filter lzma->filters[8]; static size_t filters_count = 0; static size_t preset_number = 6 ; static size_t opt_memory = 1024 * 1024 * 1000 ; #endif #if 0 static void set_compression_settings(lzma_data * lzma) { lzma->preset_default = lzma->filters_count == 0; size_t i; if (lzma->preset_default) { lzma->filters[0].id = LZMA_FILTER_LZMA1; lzma->filters[0].options = (lzma_options_lzma *)( lzma_preset_lzma + lzma->preset_number); lzma->filters_count = 1; } // Terminate the filter options array. lzma->filters[lzma->filters_count].id = UINT64_MAX; // Optimize the filter chain a little by removing all // Copy filters. for (i = 0; lzma->filters[i].id != UINT64_MAX; ++i) { while (lzma->filters[i].id == LZMA_FILTER_COPY) { size_t j = i; do { lzma->filters[j] = lzma->filters[j + 1]; } while (lzma->filters[++j].id != UINT64_MAX); } } const uint32_t memory_limit = opt_memory / (1024 * 1024) + 1; uint32_t memory_usage = lzma_memory_usage(lzma->filters, TRUE); // Don't go over the memory limits when the default // setting is used. if (preset_default) { while (memory_usage > memory_limit) { if (lzma->preset_number == 0) { croak("Memory usage limit is too " "small for any internal " "filter preset"); exit(-1); } --lzma->preset_number; lzma->filters[0].options = (lzma_options_lzma *)( lzma_preset_lzma + lzma->preset_number); memory_usage = lzma_memory_usage(lzma->filters, TRUE); } } else { if (memory_usage > memory_limit) { croak("Memory usage limit is too small " "for the given filter setup"); exit(-1); } } // Limit the number of worked threads so that memory usage // limit isn't exceeded. // FIXME: Probably should use bytes instead of mebibytes for // memory_usage and memory_limit. if (memory_usage == 0) memory_usage = 1; #if 0 size_t thread_limit = memory_limit / memory_usage; if (thread_limit == 0) thread_limit = 1; if (opt_threads > thread_limit) opt_threads = thread_limit; #endif return; } #endif lzma_ret #ifdef CAN_PROTOTYPE addZipProperties(di_stream* s, SV* output) #else addZipProperties(s, output) di_stream* s; SV* output ; #endif { dTHX; uint32_t size; int cur_length = SvCUR(output) ; lzma_ret status = lzma_properties_size(&size, &s->filters[0]); uint8_t *props ; if (status != LZMA_OK) return status; Sv_Grow(output, SvLEN(output) + size + 4) ; props = (uint8_t*) SvPVbyte_nolen(output) + cur_length; *props = (uint8_t)LZMA_VERSION_MAJOR ; ++ props; *props = (uint8_t)LZMA_VERSION_MINOR ; ++ props; *props = size ; ++ props; *props = 0 ; ++ props; status = lzma_properties_encode(&s->filters[0], props); SvCUR_set(output, cur_length + size + 4); s->forZip = FALSE ; return status ; } #include "constants.h" MODULE = Compress::Raw::Lzma PACKAGE = Compress::Raw::Lzma REQUIRE: 1.924 PROTOTYPES: DISABLE INCLUDE: constants.xs BOOT: { PERL_UNUSED_VAR(trace); } MODULE = Compress::Raw::Lzma PACKAGE = Compress::Raw::Lzma PREFIX = MY_ #define MY_LZMA_VERSION() LZMA_VERSION uint32_t MY_LZMA_VERSION() uint32_t lzma_version_number() const char * lzma_version_string() #define MY_LZMA_VERSION_STRING() LZMA_VERSION_STRING const char * MY_LZMA_VERSION_STRING() #define MY_LZMA_FILTER_LZMA1() LZMA_FILTER_LZMA1 uint64_t MY_LZMA_FILTER_LZMA1() #define MY_LZMA_BACKWARD_SIZE_MAX() LZMA_BACKWARD_SIZE_MAX uint64_t MY_LZMA_BACKWARD_SIZE_MAX() lzma_bool lzma_mf_is_supported(match_finder) lzma_match_finder match_finder lzma_bool lzma_mode_is_supported(mode) lzma_mode mode lzma_bool lzma_check_is_supported(check) lzma_check check uint32_t lzma_check_size(check) lzma_check check size_t lzma_stream_buffer_bound(uncompressed_size) size_t uncompressed_size lzma_bool lzma_filter_encoder_is_supported(id) lzma_vli id lzma_bool lzma_filter_decoder_is_supported(id) lzma_vli id uint64_t lzma_easy_encoder_memusage(preset) uint32_t preset uint64_t lzma_easy_decoder_memusage(preset) uint32_t preset void lzma_alone_encoder(Class, flags, bufsize, filters) const char * Class int flags uLong bufsize AV* filters PPCODE: { lzma_ret err = LZMA_OK; deflateStream s = NULL; if ((s = InitStream() )) { setupFilters(s, filters, NULL); err = lzma_alone_encoder ( &(s->stream), (const lzma_options_lzma*)s->filters[0].options ); if (err != LZMA_OK) { Safefree(s) ; s = NULL ; } else { PostInitStream(s, flags, bufsize) ; //s->is_tainted = is_tainted; } } else { err = LZMA_MEM_ERROR ; s = NULL; } { SV* obj = sv_setref_pv(sv_newmortal(), Class, (void*)s); //if (is_tainted) //setTainted(obj); XPUSHs(obj); } if (GIMME == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); //if (is_tainted) //setTainted(sv); XPUSHs(sv) ; } } void lzma_raw_encoder(Class, flags, bufsize, filters, forZip) const char * Class int flags uLong bufsize AV* filters bool forZip PPCODE: { lzma_ret err = LZMA_OK; deflateStream s = NULL; if ((s = InitStream() )) { setupFilters(s, filters, NULL); s->forZip = forZip ; err = lzma_raw_encoder ( &(s->stream), (const lzma_filter*)&s->filters ); if (err != LZMA_OK) { Safefree(s) ; s = NULL ; } else { PostInitStream(s, flags, bufsize) ; //s->is_tainted = is_tainted; } } else { err = LZMA_MEM_ERROR ; s = NULL; } { SV* obj = sv_setref_pv(sv_newmortal(), Class, (void*)s); //if (is_tainted) //setTainted(obj); XPUSHs(obj); } if (GIMME == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); //if (is_tainted) //setTainted(sv); XPUSHs(sv) ; } } void lzma_stream_encoder(Class, flags, bufsize, filters, check=LZMA_CHECK_CRC32) const char * Class int flags uLong bufsize AV* filters lzma_check check PPCODE: { lzma_ret err = LZMA_OK; deflateStream s = NULL; if ((s = InitStream() )) { setupFilters(s, filters, NULL); err = lzma_stream_encoder ( &(s->stream), (const lzma_filter*)&s->filters, check ); if (err != LZMA_OK) { Safefree(s) ; s = NULL ; } else { PostInitStream(s, flags, bufsize) ; //s->is_tainted = is_tainted; } } else { err = LZMA_MEM_ERROR ; s = NULL; } { SV* obj = sv_setref_pv(sv_newmortal(), Class, (void*)s); //if (is_tainted) //setTainted(obj); XPUSHs(obj); } if (GIMME == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); //if (is_tainted) //setTainted(sv); XPUSHs(sv) ; } } void lzma_easy_encoder(Class, flags, bufsize, preset=LZMA_PRESET_DEFAULT, check=LZMA_CHECK_CRC32) const char * Class int flags int preset lzma_check check uLong bufsize PPCODE: { lzma_ret err = LZMA_OK; deflateStream s = NULL; if ((s = InitStream())) { err = lzma_easy_encoder ( &(s->stream), preset, check); if (err != LZMA_OK) { Safefree(s) ; s = NULL ; } else { PostInitStream(s, flags, bufsize) ; //s->is_tainted = is_tainted; } } else { err = LZMA_MEM_ERROR ; s = NULL; } { SV* obj = sv_setref_pv(sv_newmortal(), Class, (void*)s); //if (is_tainted) //setTainted(obj); XPUSHs(obj); } if (GIMME == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); //if (is_tainted) //setTainted(sv); XPUSHs(sv) ; } } MODULE = Compress::Raw::Lzma::Encoder PACKAGE = Compress::Raw::Lzma::Encoder void DESTROY(s) Compress::Raw::Lzma::Encoder s CODE: lzma_end(&s->stream) ; destroyStream(s) ; DualType code (s, buf, output) Compress::Raw::Lzma::Encoder s SV * buf SV * output uInt cur_length = NO_INIT uInt increment = NO_INIT lzma_ret RETVAL = LZMA_OK; uInt bufinc = NO_INIT //bool is_tainted = getTaint3; STRLEN origlen = NO_INIT CODE: bufinc = s->bufsize; /* If the input buffer is a reference, dereference it */ buf = deRef(buf, (char*)"code") ; /* initialise the input buffer */ #ifdef UTF8_AVAILABLE if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1)) croak("Wide character in " COMPRESS_CLASS "::code input parameter"); #endif s->stream.next_in = (uint8_t*)SvPV_nomg(buf, origlen) ; s->stream.avail_in = origlen; //if (is_tainted) //setTainted(output); /* and retrieve the output buffer */ output = deRef_l(output, (char*)"code") ; #ifdef UTF8_AVAILABLE if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1)) croak("Wide character in " COMPRESS_CLASS "::code output parameter"); #endif if((s->flags & FLAG_APPEND_OUTPUT) == FLAG_APPEND_OUTPUT) { SvOOK_off(output); } else { SvCUR_set(output, 0); } if (s->forZip) addZipProperties(s, output) ; cur_length = SvCUR(output) ; s->stream.next_out = (uint8_t*) SvPVX(output) + cur_length; increment = SvLEN(output) - cur_length; s->stream.avail_out = increment; while (s->stream.avail_in != 0) { if (s->stream.avail_out == 0) { /* out of space in the output buffer so make it bigger */ s->stream.next_out = (uint8_t*)Sv_Grow(output, SvLEN(output) + bufinc) ; cur_length += increment ; s->stream.next_out += cur_length ; increment = bufinc ; s->stream.avail_out = increment; bufinc *= 2 ; } RETVAL = lzma_code(&(s->stream), LZMA_RUN); if (RETVAL == LZMA_STREAM_END) break; if (RETVAL != LZMA_OK) break; /* if (RETVAL == LZMA_BUF_ERROR) { */ if (s->stream.avail_out == 0) continue ; if (s->stream.avail_in == 0) { RETVAL = LZMA_OK ; break ; } if (RETVAL != LZMA_OK) break; } s->compressedBytes += cur_length + increment - s->stream.avail_out ; s->uncompressedBytes += origlen - s->stream.avail_in ; s->last_error = RETVAL ; if (RETVAL == LZMA_OK) { SvPOK_only(output); SvCUR_set(output, cur_length + increment - s->stream.avail_out) ; SvSETMAGIC(output); } OUTPUT: RETVAL DualType flush(s, output, f=LZMA_FINISH) Compress::Raw::Lzma::Encoder s SV * output uInt cur_length = NO_INIT uInt increment = NO_INIT uInt bufinc = NO_INIT lzma_ret RETVAL = LZMA_OK; lzma_action f //bool is_tainted = getTaint2; CODE: //if (is_tainted) //setTainted(output); bufinc = s->bufsize; s->stream.avail_in = 0; /* should be zero already anyway */ /* retrieve the output buffer */ output = deRef_l(output, (char*)"flush") ; #ifdef UTF8_AVAILABLE if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1)) croak("Wide character in " COMPRESS_CLASS "::flush input parameter"); #endif if((s->flags & FLAG_APPEND_OUTPUT) == FLAG_APPEND_OUTPUT) { SvOOK_off(output); } else { SvCUR_set(output, 0); } if (s->forZip) addZipProperties(s, output) ; cur_length = SvCUR(output) ; s->stream.next_out = (uint8_t*) SvPVX(output) + cur_length; increment = SvLEN(output) - cur_length; s->stream.avail_out = increment; for (;;) { if (s->stream.avail_out == 0) { /* consumed all the available output, so extend it */ s->stream.next_out = (uint8_t*)Sv_Grow(output, SvLEN(output) + bufinc) ; cur_length += increment ; s->stream.next_out += cur_length ; increment = bufinc ; s->stream.avail_out = increment; bufinc *= 2 ; } RETVAL = lzma_code(&(s->stream), f); /* deflate has finished flushing only when it hasn't used up * all the available space in the output buffer: */ /* if (s->stream.avail_out != 0 || RETVAL < 0 ) */ if (RETVAL != LZMA_OK) break; } /* TODO -- ??? */ /* RETVAL = (RETVAL == LZMA_STREAM_END ? LZMA_OK : RETVAL) ; */ s->last_error = RETVAL ; s->compressedBytes += cur_length + increment - s->stream.avail_out ; if (RETVAL == LZMA_STREAM_END) { SvPOK_only(output); SvCUR_set(output, cur_length + increment - s->stream.avail_out) ; SvSETMAGIC(output); } OUTPUT: RETVAL uLong compressedBytes(s) Compress::Raw::Lzma::Encoder s CODE: //bool is_tainted = getTaint1; RETVAL = s->compressedBytes; OUTPUT: RETVAL uLong uncompressedBytes(s) Compress::Raw::Lzma::Encoder s CODE: //bool is_tainted = getTaint1; RETVAL = s->uncompressedBytes; OUTPUT: RETVAL MODULE = Compress::Raw::Lzma PACKAGE = Compress::Raw::Lzma void lzma_auto_decoder(Class, flags, bufsize, memlimit=UINT64_MAX, fl=0) const char* Class int flags int fl uint64_t memlimit uLong bufsize ALIAS: lzma_stream_decoder = 1 lzma_alone_decoder = 2 PPCODE: { int err = LZMA_OK ; inflateStream s = NULL; if ((s = InitStream() )) { if (ix == 0) err = lzma_auto_decoder ( &(s->stream), memlimit, fl ); else if (ix == 1) err = lzma_stream_decoder ( &(s->stream), memlimit, fl ); else if (ix == 2) err = lzma_alone_decoder ( &(s->stream), memlimit ); if (err != LZMA_OK) { Safefree(s) ; s = NULL ; } if (s) { //s->is_tainted = is_tainted; PostInitStream(s, flags, bufsize) ; } } else err = LZMA_MEM_ERROR ; { SV* obj = sv_setref_pv(sv_newmortal(), Class, (void*)s); //if (is_tainted) //setTainted(obj); XPUSHs(obj); } if (GIMME == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); //if (is_tainted) //setTainted(sv); XPUSHs(sv) ; } } void lzma_raw_decoder(Class, flags, bufsize, filters, properties) const char* Class int flags uLong bufsize AV* filters const char* properties PPCODE: { int err = LZMA_OK ; inflateStream s = NULL; if ((s = InitStream() )) { if (! setupFilters(s, filters, properties)) { Safefree(s) ; s = NULL ; } err = lzma_raw_decoder ( &(s->stream), (const lzma_filter*)&s->filters ); if (err != LZMA_OK) { Safefree(s) ; s = NULL ; } if (s) { //s->is_tainted = is_tainted; PostInitStream(s, flags, bufsize) ; } } else err = LZMA_MEM_ERROR ; { SV* obj = sv_setref_pv(sv_newmortal(), Class, (void*)s); //if (is_tainted) //setTainted(obj); XPUSHs(obj); } if (GIMME == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); //if (is_tainted) //setTainted(sv); XPUSHs(sv) ; } } MODULE = Compress::Raw::Lzma::Decoder PACKAGE = Compress::Raw::Lzma::Decoder void DESTROY(s) Compress::Raw::Lzma::Decoder s CODE: lzma_end(&s->stream) ; destroyStream(s) ; DualType code (s, buf, output) Compress::Raw::Lzma::Decoder s SV * buf SV * output uInt cur_length = 0; uInt prefix_length = 0; uInt increment = 0; uInt bufinc = NO_INIT STRLEN na = NO_INIT ; STRLEN origlen = NO_INIT PREINIT: #ifdef UTF8_AVAILABLE bool out_utf8 = FALSE; #endif CODE: //bool is_tainted = getTaint3; //if (is_tainted) //setTainted(output); bufinc = s->bufsize; /* If the buffer is a reference, dereference it */ buf = deRef(buf, (char*)"inflate") ; if (s->flags & FLAG_CONSUME_INPUT) { if (SvREADONLY(buf)) croak(UNCOMPRESS_CLASS "::code input parameter cannot be read-only when ConsumeInput is specified"); SvPV_force(buf, na); } #ifdef UTF8_AVAILABLE if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1)) croak("Wide character in " UNCOMPRESS_CLASS "::code input parameter"); #endif /* initialise the input buffer */ s->stream.next_in = (uint8_t*)SvPV_nomg(buf, origlen) ; s->stream.avail_in = origlen; /* and retrieve the output buffer */ output = deRef_l(output, (char*)"inflate") ; #ifdef UTF8_AVAILABLE if (DO_UTF8(output)) out_utf8 = TRUE ; if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1)) croak("Wide character in " UNCOMPRESS_CLASS "::code output parameter"); #endif if((s->flags & FLAG_APPEND_OUTPUT) == FLAG_APPEND_OUTPUT) { SvOOK_off(output); } else { SvCUR_set(output, 0); } /* Assume no output buffer - the code below will update if there is any available */ s->stream.avail_out = 0; if (SvLEN(output)) { prefix_length = cur_length = SvCUR(output) ; if (s->flags & FLAG_LIMIT_OUTPUT && SvLEN(output) - cur_length - 1 < bufinc) { Sv_Grow(output, bufinc + cur_length + 1) ; } /* Only setup the stream output pointers if there is spare capacity in the outout SV */ if (SvLEN(output) > cur_length + 1) { s->stream.next_out = (uint8_t*) SvPVX(output) + cur_length; increment = SvLEN(output) - cur_length - 1; s->stream.avail_out = increment; } } s->bytesInflated = 0; while (1) { if (s->stream.avail_out == 0) { /* out of space in the output buffer so make it bigger */ s->stream.next_out = (uint8_t*)Sv_Grow(output, SvLEN(output) + bufinc + 1) ; cur_length += increment ; s->stream.next_out += cur_length ; increment = bufinc ; s->stream.avail_out = increment; bufinc *= 2 ; } RETVAL = lzma_code(&(s->stream), LZMA_RUN); if (s->flags & FLAG_LIMIT_OUTPUT) { if (RETVAL == LZMA_BUF_ERROR && s->stream.avail_in == 0) { RETVAL = LZMA_OK ; //continue; } break; } if (RETVAL == LZMA_BUF_ERROR) { if (s->stream.avail_out == 0) continue ; if (s->stream.avail_in == 0) { RETVAL = LZMA_OK ; break ; } } if (RETVAL != LZMA_OK) break; } s->last_error = RETVAL ; if (RETVAL == LZMA_OK || RETVAL == LZMA_STREAM_END || RETVAL == LZMA_BUF_ERROR) { unsigned in ; s->bytesInflated = cur_length + increment - s->stream.avail_out - prefix_length; s->uncompressedBytes += s->bytesInflated ; s->compressedBytes += origlen - s->stream.avail_in ; SvPOK_only(output); SvCUR_set(output, prefix_length + s->bytesInflated) ; *SvEND(output) = '\0'; #ifdef UTF8_AVAILABLE if (out_utf8) sv_utf8_upgrade(output); #endif SvSETMAGIC(output); /* fix the input buffer */ if (s->flags & FLAG_CONSUME_INPUT || s->flags & FLAG_LIMIT_OUTPUT) { in = s->stream.avail_in ; SvCUR_set(buf, in) ; if (in) Move(s->stream.next_in, SvPVX(buf), in, char) ; *SvEND(buf) = '\0'; //if (is_tainted) //setTainted(buf); SvSETMAGIC(buf); } } OUTPUT: RETVAL uLong compressedBytes(s) Compress::Raw::Lzma::Decoder s CODE: //bool is_tainted = getTaint1; RETVAL = s->compressedBytes; OUTPUT: RETVAL uLong uncompressedBytes(s) Compress::Raw::Lzma::Decoder s CODE: //bool is_tainted = getTaint1; RETVAL = s->uncompressedBytes; OUTPUT: RETVAL MODULE = Lzma::Filter PACKAGE = Lzma::Filter int id(filter) Lzma::Filter filter CODE: RETVAL = filter->filter.id; OUTPUT: RETVAL void DESTROY(s) Lzma::Filter s CODE: if (s->filter.options) Safefree(s->filter.options) ; if (s->dict) SvREFCNT_dec(s->dict); Safefree(s) ; MODULE = Lzma::Filter::Lzma PACKAGE = Lzma::Filter::Lzma Lzma::Filter::Lzma _mk(want_lzma2, dict_size, lc, lp, pb, mode, nice_len, mf, depth, preset_dict) bool want_lzma2 uint32_t dict_size uint32_t lc uint32_t lp uint32_t pb lzma_mode mode uint32_t nice_len lzma_match_finder mf uint32_t depth SV* preset_dict CODE: lzma_options_lzma* p; ZMALLOC(RETVAL, di_filter) ; RETVAL->filter.id = want_lzma2 ? LZMA_FILTER_LZMA2 : LZMA_FILTER_LZMA1 ; ZMALLOC(RETVAL->filter.options, lzma_options_lzma) ; p = (lzma_options_lzma*)RETVAL->filter.options; setDefaultOptions(p); RETVAL->dict = newSVsv( deRef(preset_dict, (char*)"preset dict") ); size_t preset_len = 0; p->preset_dict = (void *)SvPVbyte_force(RETVAL->dict,preset_len); p->preset_dict_size = preset_len; if ( p->preset_dict_size == 0 ) { SvREFCNT_dec(RETVAL->dict); p->preset_dict = NULL; RETVAL->dict = NULL; } p->dict_size = dict_size ; p->lc = lc ; p->lp = lp ; p->pb = pb ; p->mode = mode ; p->nice_len = nice_len ; p->mf = mf ; p->depth = depth ; OUTPUT: RETVAL Lzma::Filter::Lzma _mkPreset(want_lzma2, preset) bool want_lzma2 uint32_t preset CODE: lzma_options_lzma* p; ZMALLOC(RETVAL, di_filter) ; RETVAL->filter.id = want_lzma2 ? LZMA_FILTER_LZMA2 : LZMA_FILTER_LZMA1 ; ZMALLOC(RETVAL->filter.options, lzma_options_lzma) ; p = (lzma_options_lzma*)RETVAL->filter.options; lzma_lzma_preset(p, preset); OUTPUT: RETVAL MODULE = Lzma::Filter::BCJ PACKAGE = Lzma::Filter::BCJ Lzma::Filter::BCJ _mk(id, offset=0) int id int offset CODE: ZMALLOC(RETVAL, di_filter) ; ZMALLOC(RETVAL->filter.options, lzma_options_bcj) ; RETVAL->filter.id = id; ((lzma_options_bcj*)(RETVAL->filter.options))->start_offset = offset; OUTPUT: RETVAL MODULE = Lzma::Filter::Delta PACKAGE = Lzma::Filter::Delta Lzma::Filter::Delta _mk(type=LZMA_DELTA_TYPE_BYTE, dist=LZMA_DELTA_DIST_MIN) lzma_delta_type type uint32_t dist CODE: ZMALLOC(RETVAL, di_filter) ; ZMALLOC(RETVAL->filter.options, lzma_options_delta) ; RETVAL->filter.id = LZMA_FILTER_DELTA; ((lzma_options_delta*)(RETVAL->filter.options))->type = type; ((lzma_options_delta*)(RETVAL->filter.options))->dist = dist; OUTPUT: RETVAL MODULE = Compress::Raw::Lzma::Options PACKAGE = Compress::Raw::Lzma::Options Compress::Raw::Lzma::Options new() CODE: ZMALLOC(RETVAL, lzma_options_lzma) ; setDefaultOptions(RETVAL); OUTPUT: RETVAL lzma_bool lzma_lzma_preset(s, preset) Compress::Raw::Lzma::Options s uint32_t preset void DESTROY(s) Compress::Raw::Lzma::Options s CODE: Safefree(s) ; MODULE = Compress::Raw::Lzma PACKAGE = Compress::Raw::Lzma