�ɲɾ�����ӯ�����һ��ˣ��������С���˴��ͣ�������P���ҹ��ñ˽��ά�Բ��������˸߸ԣ�������ơ��ҹ��ñ�����ά�Բ���ˡ���˳^�ӣ������ӡ� ���ͯj�ӣ��ƺ���ӣ� ? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!PK…I1]GÕíz2z2soaknu„[µü¤#!/usr/bin/perl -w ################################################################################ # # soak -- Test Perl modules with multiple Perl releases. # # Original Author: Paul Marquess # ################################################################################ # # Version 3.x, Copyright (C) 2004-2013, 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. # ################################################################################ require 5.006001; use strict; use warnings; use ExtUtils::MakeMaker; use Getopt::Long; use Pod::Usage; use File::Find; use List::Util qw(max); use Config; my $VERSION = '3.36'; $| = 1; my %OPT = ( verbose => 0, make => $Config{make} || 'make', min => '5.000', color => 1, ); GetOptions(\%OPT, qw(verbose make=s min=s mmargs=s@ color!)) or pod2usage(2); $OPT{mmargs} = [''] unless exists $OPT{mmargs}; $OPT{min} = parse_version($OPT{min}) - 1e-10; sub cs($;$$) { my $x = shift; my($s, $p) = @_ ? @_ : ('', 's'); ($x, $x == 1 ? $s : $p) } my @GoodPerls = map { $_->[0] } sort { $a->[1] <=> $b->[1] or $a->[0] cmp $b->[0] } grep { $_->[1] >= $OPT{min} } map { [$_ => perl_version($_)] } @ARGV ? SearchPerls(@ARGV) : FindPerls(); unless (@GoodPerls) { print "Sorry, got no Perl binaries for testing.\n\n"; exit 0; } my $maxlen = max(map length, @GoodPerls) + 3; my $mmalen = max(map length, @{$OPT{mmargs}}); $maxlen += $mmalen+3 if $mmalen > 0; my $rep = Soak::Reporter->new( verbose => $OPT{verbose} , color => $OPT{color} , width => $maxlen ); $SIG{__WARN__} = sub { $rep->warn(@_) }; $SIG{__DIE__} = sub { $rep->die(@_) }; # prime the pump, so the first "make realclean" will work. runit("$^X Makefile.PL") && runit("$OPT{make} realclean") or $rep->die("Cannot run $^X Makefile.PL && $OPT{make} realclean\n"); my $tot = @GoodPerls*@{$OPT{mmargs}}; $rep->set(tests => $tot); $rep->status(sprintf("Testing %d version%s / %d configuration%s (%d combination%s)...\n", cs(@GoodPerls), cs(@{$OPT{mmargs}}), cs($tot))); for my $perl (@GoodPerls) { for my $mm (@{$OPT{mmargs}}) { $rep->set(perl => $perl, config => $mm); $rep->test; my @warn_mfpl; my @warn_make; my @warn_test; my $ok = runit("$perl Makefile.PL $mm", \@warn_mfpl) && runit("$OPT{make}", \@warn_make) && runit("$OPT{make} test", \@warn_test); $rep->warnings(['Makefile.PL' => \@warn_mfpl], ['make' => \@warn_make], ['make test' => \@warn_test]); if ($ok) { $rep->passed; } else { $rep->failed; } runit("$OPT{make} realclean"); } } exit $rep->finish; sub runit { # TODO -- portability alert!! my($cmd, $warn) = @_; $rep->vsay("\n Running [$cmd]"); my $output = `$cmd 2>&1`; $output = "\n" unless defined $output; $output =~ s/^/ > /gm; $rep->say("\n Output:\n$output") if $OPT{verbose} || $?; if ($?) { $rep->warn(" Running '$cmd' failed: $?\n"); return 0; } push @$warn, $output =~ /(warning: .*)/ig; return 1; } sub FindPerls { # TODO -- need to decide how far back we go. # TODO -- get list of user releases prior to 5.004 # TODO -- does not work on Windows (at least) # find versions of Perl that are available my @PerlBinaries = qw( 5.000 5.001 5.002 5.003 5.004 5.00401 5.00402 5.00403 5.00404 5.00405 5.005 5.00501 5.00502 5.00503 5.00504 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.7.2 5.7.3 5.8.0 5.8.1 5.8.2 5.8.3 5.8.4 5.8.5 5.8.6 5.8.7 5.8.8 5.9.0 5.9.1 5.9.2 5.9.3 ); print "Searching for Perl binaries...\n"; # find_perl will send a warning to STDOUT if it can't find # the requested perl, so need to temporarily silence STDOUT. tie *STDOUT, 'NoSTDOUT'; my $mm = MM->new( { NAME => 'dummy' }); my @path = $mm->path; my @GoodPerls; for my $perl (@PerlBinaries) { if (my $abs = $mm->find_perl($perl, ["perl$perl"], \@path, 0)) { push @GoodPerls, $abs; } } untie *STDOUT; print "\nFound:\n", (map " $_\n", @GoodPerls), "\n"; return @GoodPerls; } sub SearchPerls { my @args = @_; my @perls; for my $arg (@args) { if (-d $arg) { my @found; print "Searching for Perl binaries in '$arg'...\n"; find({ wanted => sub { $File::Find::name =~ m!perl5[\w._]+$! and -f $File::Find::name and -x $File::Find::name and perl_version($File::Find::name) and push @found, $File::Find::name; }, follow => 1 }, $arg); printf "Found %d Perl binar%s in '%s'.\n\n", cs(@found, 'y', 'ies'), $arg; push @perls, @found; } else { push @perls, $arg; } } return @perls; } sub perl_version { my $perl = shift; my $ver = `$perl -e 'print \$]' 2>&1`; return $? == 0 && $ver =~ /^\d+\.\d+/ && $ver >= 5 ? $ver : 0; } sub parse_version { my $ver = shift; if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { return $1 + 1e-3*$2 + 1e-6*$3; } elsif ($ver =~ /^\d+\.[\d_]+$/) { $ver =~ s/_//g; return $ver; } die "cannot parse version '$ver'\n"; } package NoSTDOUT; use Tie::Handle; our @ISA = qw(Tie::Handle); sub TIEHANDLE { bless \(my $s = ''), shift } sub PRINT {} sub WRITE {} package Soak::Reporter; use strict; sub cs($;$$) { my $x = shift; my($s, $p) = @_ ? @_ : ('', 's'); ($x, $x == 1 ? $s : $p) } sub new { my $class = shift; bless { tests => undef, color => 1, verbose => 0, @_, _cur => 0, _atbol => 1, _total => 0, _good => [], _bad => [], }, $class; } sub colored { my $self = shift; if ($self->{color}) { my $c = eval { require Term::ANSIColor; Term::ANSIColor::colored(@_); }; if ($@) { $self->{color} = 0; } else { return $c; } } return $_[0]; } sub _config { my $self = shift; return $self->{config} =~ /\S+/ ? " ($self->{config})" : ''; } sub _progress { my $self = shift; return '' unless defined $self->{tests}; my $tlen = length $self->{tests}; my $text = sprintf "[%${tlen}d/%${tlen}d] ", $self->{_cur}, $self->{tests}; return $self->colored($text, 'bold'); } sub _test { my $self = shift; return $self->_progress . "Testing " . $self->colored($self->{perl}, 'blue') . $self->colored($self->_config, 'green'); } sub _testlen { my $self = shift; return length("Testing " . $self->{perl} . $self->_config); } sub _dots { my $self = shift; return '.' x $self->_dotslen; } sub _dotslen { my $self = shift; return $self->{width} - length($self->{perl} . $self->_config); } sub _sep { my $self = shift; my $width = shift; $self->print($self->colored('-'x$width, 'bold'), "\n"); } sub _vsep { goto &_sep if $_[0]->{verbose}; } sub set { my $self = shift; while (@_) { my($k, $v) = splice @_, 0, 2; $self->{$k} = $v; } } sub test { my $self = shift; $self->{_cur}++; $self->_vsep($self->_testlen); $self->print($self->_test, $self->{verbose} ? "\n" : ' ' . $self->_dots . ' '); $self->_vsep($self->_testlen); } sub _warnings { my($self, $mode) = @_; my $warnings = 0; my $differ = 0; for my $w (@{$self->{_warnings}}) { if (@{$w->[1]}) { $warnings += @{$w->[1]}; $differ++; } } my $rv = ''; if ($warnings) { if ($mode eq 'summary') { $rv .= sprintf " (%d warning%s", cs($warnings); } else { $rv .= "\n"; } for my $w (@{$self->{_warnings}}) { if (@{$w->[1]}) { if ($mode eq 'detail') { $rv .= " Warnings during '$w->[0]':\n"; my $cnt = 1; for my $msg (@{$w->[1]}) { $rv .= sprintf " [%d] %s", $cnt++, $msg; } $rv .= "\n"; } else { unless ($self->{verbose}) { $rv .= $differ == 1 ? " during " . $w->[0] : sprintf(", %d during %s", scalar @{$w->[1]}, $w->[0]); } } } } if ($mode eq 'summary') { $rv .= ')'; } } return $rv; } sub _result { my($self, $text, $color) = @_; my $sum = $self->_warnings('summary'); my $len = $self->_testlen + $self->_dotslen + length($text) + length($sum) + 2; $self->_vsep($len); $self->print($self->_test, ' ', $self->_dots, ' ') if $self->{verbose} || $self->{_atbol}; $self->print($self->colored($text, $color)); $self->print($self->colored($sum, 'red')); $self->print("\n"); $self->_vsep($len); $self->print($self->_warnings('detail')) if $self->{verbose}; $self->{_total}++; } sub passed { my $self = shift; $self->_result(@_, 'ok', 'bold green'); push @{$self->{_good}}, [$self->{perl}, $self->{config}]; } sub failed { my $self = shift; $self->_result(@_, 'not ok', 'bold red'); push @{$self->{_bad}}, [$self->{perl}, $self->{config}]; } sub warnings { my $self = shift; $self->{_warnings} = \@_; } sub _tobol { my $self = shift; print "\n" unless $self->{_atbol}; $self->{_atbol} = 1; } sub print { my $self = shift; my $text = join '', @_; print $text; $self->{_atbol} = $text =~ /[\r\n]$/; } sub say { my $self = shift; $self->_tobol; $self->print(@_, "\n"); } sub vsay { goto &say if $_[0]->{verbose}; } sub warn { my $self = shift; $self->say($self->colored(join('', @_), 'red')); } sub die { my $self = shift; $self->say($self->colored(join('', 'FATAL: ', @_), 'bold red')); exit -1; } sub status { my($self, $text) = @_; $self->_tobol; $self->print($self->colored($text, 'bold'), "\n"); } sub finish { my $self = shift; if (@{$self->{_bad}}) { $self->status("\nFailed with:"); for my $fail (@{$self->{_bad}}) { my($perl, $cfg) = @$fail; $self->set(config => $cfg); $self->say(" ", $self->colored($perl, 'blue'), $self->colored($self->_config, 'green')); } } $self->status(sprintf("\nPassed with %d of %d combination%s.\n", scalar @{$self->{_good}}, cs($self->{_total}))); return scalar @{$self->{_bad}}; } __END__ =head1 NAME soak - Test Perl modules with multiple Perl releases =head1 SYNOPSIS soak [options] [perl ...] --make=program override name of make program ($Config{make}) --min=version use at least this version of perl --mmargs=options pass options to Makefile.PL (multiple --mmargs possible) --verbose be verbose --nocolor don't use colored output =head1 DESCRIPTION The F utility can be used to test Perl modules with multiple Perl releases or build options. It automates the task of running F and the modules test suite. It is not primarily intended for cross-platform checking, so don't expect it to work on all platforms. =head1 EXAMPLES To test your favourite module, just change to its root directory (where the F is located) and run: soak This will automatically look for Perl binaries installed on your system. Alternatively, you can explicitly pass F a list of Perl binaries: soak perl5.8.6 perl5.9.2 Last but not least, you can pass it a list of directories to recursively search for Perl binaries, for example: soak /tmp/perl/install /usr/bin All of the above examples will run perl Makefile.PL make make test for your module and report success or failure. If your F can take arguments, you may also want to test different configurations for your module. You can do so with the I<--mmargs> option: soak --mmargs=' ' --mmargs='CCFLAGS=-Wextra' --mmargs='enable-debug' This will run perl Makefile.PL make make test perl Makefile.PL CCFLAGS=-Wextra make make test perl Makefile.PL enable-debug make make test for each Perl binary. If you have a directory full of different Perl binaries, but your module isn't expected to work with ancient perls, you can use the I<--min> option to specify the minimum version a Perl binary must have to be chosen for testing: soak --min=5.8.1 Usually, the output of F is rather terse, to give you a good overview. If you'd like to see more of what's going on, use the I<--verbose> option: soak --verbose =head1 COPYRIGHT Version 3.x, Copyright (c) 2004-2013, 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 PK…I1]n‚y†ááREADMEnu„[µü¤ ------------------------------------------------------ Devel::PPPort - Perl/Pollution/Portability Version 3 ------------------------------------------------------ CONTENTS 1. DESCRIPTION 2. INSTALLATION 3. DOCUMENTATION 4. BUGS 5. COPYRIGHT -------------- 1. DESCRIPTION -------------- Perl's API has changed over time, gaining new features, new functions, increasing its flexibility, and reducing the impact on the C namespace environment (reduced pollution). The header file written by this module, typically F, attempts to bring some of the newer Perl API features to older versions of Perl, so that you can worry less about keeping track of old releases, but users can still reap the benefit. --------------- 2. INSTALLATION --------------- Installation of the Devel::PPPort module follows the standard Perl Way and should not be harder than: perl Makefile.PL make make test make install Note that you may need to become superuser to 'make install'. If you're building the module under Windows, you may need to use a different make program, such as 'nmake', instead of 'make'. ---------------- 3. DOCUMENTATION ---------------- To see the documentation, use the perldoc command: perldoc Devel::PPPort You can also visit CPAN Search and see the documentation online as pretty nice HTML. This is also where you will find the most recent version of this module: http://search.cpan.org/~mhx/Devel-PPPort/ ------- 4. BUGS ------- If you find any bugs, Devel::PPPort doesn't seem to build on your system, or any of its tests fail, please file an issue here: https://github.com/mhx/Devel-PPPort/issues/ to create a ticket for the module. ------------ 5. COPYRIGHT ------------ Version 3.x, Copyright (C) 2004-2013, 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. PK…I1]‰†Ä¥·'·'HACKERSnu„[µü¤=head1 NAME HACKERS - Devel::PPPort internals for hackers =head1 SYNOPSIS So you probably want to hack C? Well, here's some information to get you started with what's lying around in this distribution. =head1 DESCRIPTION =head2 How to build 366 versions of Perl C supports Perl versions between 5.003 and bleadperl. To guarantee this support, I need some of these versions on my machine. I currently have 366 different Perl version/configuration combinations installed on my laptop. As many of the old Perl distributions need patching to compile cleanly on newer systems (and because building 366 Perls by hand just isn't fun), I wrote a tool to build all the different versions and configurations. You can find it in F. It can currently build the following Perl releases: 5.003 5.004 - 5.004_05 5.005 - 5.005_04 5.6.x 5.7.x 5.8.x 5.9.x 5.1x.x =head2 Fully automatic API checks Knowing which parts of the API are not backwards compatible and probably need C support is another problem that's not easy to deal with manually. If you run perl Makefile.PL --with-apicheck a C file is generated by F that is compiled and linked with C. This C file has the purpose of using each of the public API functions/macros once. The required information is derived from C (just a copy of bleadperl's C), C (which is generated by F and simply collects the rest of the apidoc entries spread over the Perl source code) and C (which lists all API provided purely by Devel::PPPort). The generated C file C is currently about 500k in size and takes quite a while to compile. Usually, C won't compile with older perls. And even if it compiles, there's still a good chance of the dynamic linker failing at C time. But that's on purpose! We can use these failures to find changes in the API automatically. The two Perl scripts F and F repeatedly run C with the apicheck code through all different versions of perl. Scanning the output of the compiler and the dynamic linker for errors, the files in F are generated. These files list all parts of the public API that don't work with less than a certain version of Perl. This information is in turn used by F to mask API calls in the generated C file for these versions, so the process can be stopped by the time F compiles cleanly and the dynamic linker is happy. (Actually, this process may generate false positives, so by default each API call is checked once more afterwards.) Running C takes about an hour, depending of course on the machine you're running it on. If you run it with the C<--nocheck> option, it won't recheck the API calls that failed in the compilation stage and it'll take significantly less time. Running with C<--nocheck> should usually be safe. When running C with the C<--base> option, it will generate the I todo files by disabling all functionality provided by C. These are required for implementing the C<--compat-version> option of the C script. The baseline todo files hold the information about which version of Perl lacks a certain part of the API. However, only the documented public API can be checked this way. And since C provides more macros, these would not be affected by C<--compat-version>. It's the job of F to figure out the baseline information for all remaining provided macros by scanning the include files in the F directory of various Perl versions. The whole process isn't platform independent. It has currently been tested only under Linux, and it definitely requires at least C and the C utility. It's not very often that one has to regenerate the baseline and todo files. If you have to, you can either run F or just execute the following steps by hand: =over 4 =item * You need a whole bunch of different Perls. The more, the better. You can use F to build them. I keep my perls in F, so most of the tools take this as a default. =item * You also need a freshly built bleadperl that is in the path under exactly this name. (The name of the executable is currently hardcoded in F and F.) =item * Remove all existing todo files in the F and F directories. =item * Update the API information. Copy the latest F file from bleadperl to the F directory and run F to collect the remaining information in F. =item * Build the new baseline by running perl devel/mktodo --base in the root directory of the distribution. When it's finished, move all files from the F directory to F. =item * Build the new todo files by running perl devel/mktodo in the root directory of the distribution. =item * Finally, add the remaining baseline information by running perl Makefile.PL && make perl devel/scanprov --mode=write =back =head2 Implementation Residing in F is the "heart" of C. Each of the files implements a part of the supported API, along with hints, dependency information, XS code and tests. The files are in a POD-like format that is parsed using the functions in F. The scripts F, F and F all use the information in F to generate the main module F, the XS code in F and various test files in F. All of these files could be generated on the fly while building C, but not having the tests in C will confuse TEST/harness in the core. Not having F will be bad for viewing the docs on C. So unfortunately, it's unavoidable to put some redundancy into the package. =head2 Adding stuff to Devel::PPPort First, check if the code you plan to add fits into one of the existing files in F. If not, just start a new one and remember to include it from within F. Each file holds all relevant data for implementing a certain part of the API: =over 2 =item * A list of the provided API in the C<=provides> section. =item * The implementation to add to F in the C<=implementation> section. =item * The code required to add to PPPort.xs for testing the implementation. This code goes into the C<=xshead>, C<=xsinit>, C<=xsmisc>, C<=xsboot> and C<=xsubs> section. Have a look at the template at the bottom of F to see where the code ends up. =item * The tests in the C<=tests> section. Remember not to use any fancy modules or syntax elements, as the test code should be able to run with Perl 5.003, which, for example, doesn't support C in C-loops: for my $x (1, 2, 3) { } # won't work with 5.003 You can use C to report success or failure: ok($got == 42); ok($got, $expected); Regular expressions are not supported as the second argument to C, because older perls do not support the C operator. =back It's usually the best approach to just copy an existing file and use it as a template. =head2 Implementation Hints In the C<=implementation> section, you can use __UNDEFINED__ macro some definition instead of #ifndef macro # define macro some definition #endif The macro can have optional arguments and the definition can even span multiple lines, like in __UNDEFINED__ SvMAGIC_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END This usually makes the code more compact and readable. And you only have to add C<__UNDEFINED__> to the C<=provided> section. Version checking can be tricky if you want to do it correct. You can use #if { VERSION < 5.9.3 } instead of #if ((PERL_VERSION < 9) || (PERL_VERSION == 9 && PERL_SUBVERSION < 3)) The version number can be either of the new form C<5.x.x> or of the older form C<5.00x_yy>. Both are translated into the correct preprocessor statements. It is also possible to combine this with other statements: #if { VERSION >= 5.004 } && !defined(sv_vcatpvf) /* a */ #elif { VERSION < 5.004_63 } && { VERSION != 5.004_05 } /* b */ #endif This not only works in the C<=implementation> section, but also in the C<=xsubs>, C<=xsinit>, C<=xsmisc>, C<=xshead> and C<=xsboot> sections. =head2 Testing To automatically test C with lots of different Perl versions, you can use the F script. Just pass it a list of all Perl binaries you want to test. =head2 Special Makefile targets You can use make regen to regenerate all of the autogenerated files. To get rid of all generated files (except for F and F), use make purge_all That's it. =head2 Submitting Patches If you've added some functionality to C, please consider submitting a patch with your work to GitHub here: L, or by sending a Pull Request. When submitting patches, please only add the relevant changes and don't include the differences of the generated files. You can use the C target to delete all autogenerated files. =head2 Integrating into the Perl core When integrating this module into the Perl core, be sure to remove the following files from the distribution. They are either not needed or generated on the fly when building this module in the core: MANIFEST META.yml PPPort.pm =head1 COPYRIGHT Version 3.x, Copyright (C) 2004-2013, 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 and L. =cut PK…I1]¹å}õ»»TODOnu„[µü¤TODO: * > 3. In several cases, "perl ppport.h --copy=.new" output a new file in > which the only change was the addition of "#include "ppport.h"". In each > case, that actually wasn't necessary because the source file in question > already #included another source file which #included ppport.h itself. > Would it be possible for the analyzer to follow #include directives to > spot cases like this? Uh, well, I guess it would be possible. But I have some concerns: 1. ppport.h is already too big. :-) 2. There is code in ppport.h to actually remove an #include "ppport.h" if it appears not to be needed. If it's not needed in your included file, it might be dropped from there and moved to the other file that included the first one. This would make the logic much more complicated. 3. As ppport.h is configurable, it's not (always) a good idea to put it into a file that's included from another file. I guess I'll have to think about this a little more. Maybe I can come up with a fancy solution that doesn't increase the code size too much. * On 14/12/06, Nicholas Clark wrote: > On Thu, Dec 14, 2006 at 05:03:24AM +0100, Andreas J. Koenig wrote: > > > Params::Validate and Clone suffer from the same cold: > > The same patch will make both compile and pass tests. > I'm wondering if it might be better to totally drop SVt_PBVM and let source > code fail to compile. I don't think so. Because : 1. your redefinition of SVt_PBVM is probably what most XS modules want 2. anyway, if we remove it from the core, it might appear in Devel::PPPort :) * maybe backport bytes_from_utf8() for 5.6.0 (or even before)? * check which of the following we need to support: amagic_generation AMG_names an Argv argvgv argvoutgv basetime beginav block_type bodytarget bufend bufptr check chopset Cmd compcv compiling comppad comppad_name comppad_name_fill copline cop_seqmax cryptseen cshlen cshname curcop curinterp curpad curpm curstash curstname dbargs DBgv DBline DBsignal DBsingle DBsub DBtrace debstash debug defgv defoutgv defstash delaymagic diehook dirty doextract doswitches do_undump dowarn egid encoding endav envgv errgv error_count errors euid eval_root evalseq eval_start expect fdpid filemode firstgv fold forkprocess formfeed formtarget freq generation gensym gid hexdigit hints incgv in_eval in_my inplace lastfd last_in_gv last_lop last_lop_op lastscream laststatval laststype last_uni lex_brackets lex_brackstack lex_casemods lex_casestack lex_defer lex_dojoin lex_expect lex_formbrack lex_inpat lex_inwhat lex_op lex_repl lex_starts lex_state lex_stuff lineary linestr localizing main_cv main_root mainstack main_start markstack markstack_max markstack_ptr max_intro_pending maxo maxscream maxsysfd min_intro_pending minus_a minus_c minus_F minus_l minus_n minus_p multi_close multi_end multi_open multi_start na nexttoke nexttype nextval nice_chunk nice_chunk_size No no_aelem no_dir_func no_func no_mem nomemok no_modify no_myglob no_security no_sock_func no_symref no_usym no_wrongref nrs oldbufptr oldname oldoldbufptr op opargs op_desc op_mask op_name op_seq origalen origargc origargv origenviron origfilename osname padix padix_floor pad_reset_pending patchlevel patleave perldb perl_destruct_level pidstatus ppaddr preambleav preambled preprocess profiledata regdummy regendp regeol reginput regkind reglastparen regsize regstartp restartop rs rsfp rsfp_filters runops savestack savestack_ix savestack_max sawampersand scopestack scopestack_ix scopestack_max screamfirst screamnext secondgv signals sig_name sig_num simple sortcop sortstash splitstr stack_base stack_max stack_sp statbuf statcache statgv statname statusvalue stdingv sub_generation subline subname Sv sv_arenaroot sv_count sv_no sv_objcount sv_root sv_undef sv_yes tainted tainting timesbuf tmps_floor tmps_ix tmps_max tmps_stack tokenbuf top_env toptarget uid unsafe varies vtbl_amagic vtbl_amagicelem vtbl_arylen vtbl_bm vtbl_dbline vtbl_env vtbl_envelem vtbl_glob vtbl_isa vtbl_isaelem vtbl_mglob vtbl_pack vtbl_packelem vtbl_pos vtbl_sig vtbl_sigelem vtbl_substr vtbl_sv vtbl_taint vtbl_uvar vtbl_vec warnhook warn_nl warn_nosemi warn_reserved warn_uninit watchaddr watchok Xpv Yes * have an --env option for soak to set env variable combinations * only overwrite generated files if they actually changed * try to make parts/apicheck.pl automatically find NEED_ #defines * add support for my_vsnprintf? * try to perform some core consistency checks: - check if 'd' flag in embed.fnc matches with supplied documentation - check if all public API is documented * check (during make regen?) if MAX_PERL in PPPort_pm.PL needs to be updated * see if we can implement sv_catpvf() for < 5.004 * MULTICALL ? * improve apicheck (things like utf8_mg_pos_init() are not currently checked) * more documentation, more tests * Resolve dependencies in Makefile.PL and remind of running 'make regen' PK…I1]d&£po^o^Changesnu„[µü¤3.36 - 2017-05-14 * Support Perl 5.26.* which no longer has '.' in @INC 3.35 - 2016-06-17 * Fix compilation in bleadperl by removing a bad test. 3.34 - 2016-06-04 * Fix compilation on Windows with certain compilers. (__attribute__ not recognized. (#GH 36)) 3.33 - 2016-06-03 * Add PERL_OP_PARENT related macros, and cBOOL * Add SvRXOK/SvRX/PERL_MAGIC_qr (Thanks to arc) * sort files from all_files_in_dir (GH #28, https://bugs.debian.org/801523 (Thanks to ntyni) * Fix coverity finding in test (GH #25) (Thanks to jhi) * Add PERL_UNUSED_RESULT and a test (GH #20) * Don't redefine MUTABLE_PTR if it's already there (GH #23) * Add C_ARRAY_LENGTH and C_ARRAY_END (GH #16) * Fix gv_fetchpvn_flags and add init_gv_pvn (#GH 32) (Thanks to leont) * Fix compiler warnings (Thanks to Dave M.) 3.32 - 2015-09-30 * Lexical topic no longer works as of perl 5.23 3.31 - 2015-03-12 * Regen todo files to sync with blead 3.30 - 2015-03-05 * Update typemap to account for STRLEN added in 3.29, which prevented compiling on older Perls 3.29 - 2015-03-05 * Fix issue found by Coverity (Thanks to Dave M. for patch) 3.28 - 2015-01-16 * Update MANIFEST for regened base/todo files 3.27 - 2015-01-13 * Regen base and todo files. * Fix isASCII and isCNTRL for <5.6.0 * Other minor fixups. (Thanks to mhx for all of the work on this release) 3.26 - 2015-01-07 * Silence some warnings on compilation in perl core (Thanks to Dave M. for patches) 3.25 - 2014-12-02 * Add caller_cx (works back to Perl 5.6.0) (Thanks to Ben Morrow for patch) * Silence compiler and coverity warnings (Thanks to jhi for patches) 3.24 - 2014-05-08 * Remove SvREFCNT_dec_NN until it can be implemented properly. (Thanks to bulk88 for reporting GH #10) * Fix GH #11 - compiler warning under clang (Thanks to jhi for reporting it) * Fix GH #12 - compiler warnings (Thanks to jhi for reporting it) 3.23 - 2014-04-12 * Add support for HeUTF8 * Add GetFileContents() to retrieve the contents of the ppport.h file * Update MAX_VER to be 5.20 * Update issue tracker to GitHub 3.22 - 2014-03-19 * Add support for the following API SvREFCNT_dec_NN mg_findext sv_unmagicext * Update META Move bug tracker to github Provide link to repository * Avoid syntax disallowed by C++11 (Thanks to Tony C for the patch) 3.21 - 2013-08-17 * Fix cpan #87870: Merge core perl commit 90b0dc0e2e (Thanks to Father Chrysostomos for the original patch and to Steve Hay for forwarding it) * Fix cpan #86975: Deterministically order API elements in POD (Thanks to Karl Williamson for providing a patch.) * Fix cpan #81796: my $_ is deprecated (Thanks to Nicholas Clark for providing a patch) * Fix cpan #81484: fix isASCII and isCNTRL for inputs > 255 (Thanks to Karl Williamson for providing a patch) * Fix cpan #80314: make use of PERL_NO_GET_CONTEXT the default * Fix cpan #79814: Install to 'site' for perl 5.11+ (Thanks to Robert Sedlacek for providing a patch) * Fix cpan #78271: Need SvPV_nomg_nolen * Adapt buildperl.pl for newer Perl releases * Update masked_versions regex for 5.005 thread builds * Some tweaks needed to support 5.003 on 64-bit platforms 3.20 - 2011-09-10 * fix CPAN #56749: isASCII and isCNTRL macros are buggy (thanks to Karl Williamson for providing a patch and patiently waiting almost two years for me to integrate it) * fix CPAN #70427: RealPPPort.xs:1587: error: lvalue required as unary ‘&’ operand 3.19_03 - 2011-04-13 * keep up with latest core changes 3.19_02 - 2010-03-07 * fix a warning emitted by the test suite with older perls * added support for the following API newSVpvs_share get_cvn_flags get_cvs (thanks to Goro Fuji for providing a patch to implement all of these, fixes CPAN #47174) 3.19_01 - 2010-02-20 * fix CPAN #50763: mistaken use of $[ (thanks to Zefram for spotting this) * remove spurious PUSHMARK from Perl_ppaddr_t (thanks to Gerard Goossen for providing a patch) * improved support for newer compilers in buildperl.pl (thanks to Philippe Bruhat (BooK) for providing a patch) * added support for the following API memEQs memNEs * lots of small toolchain updates 3.19 - 2009-06-14 * updated base/todo files 3.18_01 - 2009-06-12 * fix CPAN #44614: Please support XSBODY * fix CPAN #44655: Please support SVfARG * added support for the following API gv_fetchpvn_flags gv_fetchpvs gv_stashpvs GvSVn HvNAME_get HvNAMELEN_get isGV_with_GP newSV_type PL_error_count PL_in_my PL_in_my_stash SVfARG XSPROTO (thanks to Goro Fuji for providing a patch to implement almost all of these, fixes CPAN #44087) 3.18 - 2009-06-12 * remove MAN3PODS option from Makefile.PL, which is no longer needed (thanks to Nicholas Clark for providing a patch) * adapt mktests.PL for new layout of ext modules in the core 3.17 - 2009-03-15 * rework PTR macros, fixing PTR2ul for 5.6.1 (fixes CPAN #39802, thanks to CHOCOLATE for reporting and providing a patch) * added support for the following API PTR2nat (second part of fix for CPAN #39802) 3.16 - 2009-01-23 * fix DEFSV_set() for threaded 5.005 perls * add G_METHOD support to call_sv() 3.15 - 2009-01-18 * added support for the following API DEFSV_set * fix --unstrip for development versions 3.14_05 - 2008-10-31 * fix stupid bugs in pv_pretty tests (only the tests were broken, ppport.h was find) 3.14_04 - 2008-10-30 * added support for the following API isALNUMC [depend] isASCII isBLANK isCNTRL isGRAPH isPRINT isPSXSPC isPUNCT isXDIGIT PERL_PV_ESCAPE_ALL PERL_PV_ESCAPE_FIRSTCHAR PERL_PV_ESCAPE_NOBACKSLASH PERL_PV_ESCAPE_NOCLEAR PERL_PV_ESCAPE_QUOTE PERL_PV_ESCAPE_RE PERL_PV_ESCAPE_UNI PERL_PV_ESCAPE_UNI_DETECT PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES PERL_PV_PRETTY_LTGT PERL_PV_PRETTY_NOCLEAR PERL_PV_PRETTY_QUOTE PERL_PV_PRETTY_REGPROP pv_display pv_escape pv_pretty 3.14_03 - 2008-10-21 * fix C++ compilation issue with last release (spotted by Nicholas Clark) * added support for the following API Perl_ppaddr_t Perl_check_t CPERLscope (fixes CPAN #40078) 3.14_02 - 2008-10-12 * added support for the following API my_sprintf PL_linestr PL_bufptr PL_bufend PL_lex_state PL_lex_stuff PL_tokenbuf SvPV_renew (fixes CPAN #39809 and CPAN #39808) * add read/write support for PL_expect PL_copline PL_rsfp PL_rsfp_filters (fixes CPAN #39802) * sync my_snprintf implementation with bleadperl 3.14_01 - 2008-07-11 * resolve CPAN #37451: add PERLIO_FUNCS_DECL and PERLIO_FUNCS_CAST * update API info 3.14 - 2008-06-01 * fix CPAN #36197: filename nit in parse_partspec (thanks to Craig A. Berry for providing a patch) 3.13_03 - 2008-05-13 * fix CPAN #35835: SvPV_flags_const_nolen segfaults prior to perl 5.8.8 3.13_02 - 2008-04-13 * fix NV[efg]f format string macros for perl-5.6.0 built using -Duselongdouble (thanks to Zefram for figuring this out and to Jarkko Hietaniemi for keeping me in sync) * add --patch and --oneshot options to devel/buildperl.pl 3.13_01 - 2008-01-04 * fix dependency detection algorithm for functions * fix some potential memory leaks in the test suite * no need to use *_mg functions for mX?PUSH macros * added support for the following API mPUSHs mXPUSHs newSVpvn_flags newSVpvn_utf8 newSVpvs_flags SVf_UTF8 * make sure soak works with cromfs 3.13 - 2007-10-04 * fix cpan #29748: ppport.h problems with perl5.005_05 (spotted by Slaven Rezić) * fix a compiler warning 3.12 - 2007-09-22 [released without changes] 3.11_06 - 2007-09-11 * fix cpan #29302: Perl_croak_nocontext doesn't need aTHX_ (spotted by Jerry D. Hedden) * fix a Win32 VC++ compiler warning (thanks to Steve Hay for providing a patch) * don't generate redundant specs for provided Perl_ functions * fun with const and casts to avoid compiler warnings * bump max supported version to 5.10.0 3.11_05 - 2007-08-20 * fix: PERL_HASH() was emitting a warning when passed in a const char pointer * fix: sv_magic_portable() was emitting a warning when passed in a const char pointer * fix: make sure arguments to sv_magic_portable() are only evaluated once 3.11_04 - 2007-08-20 * fix: ignore strings and XS comments when scanning and patching files * added support for the following API newSVpvn_share PERL_HASH SvSHARED_HASH * use PERL_BCDREVISION for version checking to save some bytes in ppport.h * improve the --strip option - strip all C comments - strip most superfluous whitespace with these changes, the stripped ppport.h is now almost 30% smaller: 3.11_03 3.11_04 delta ------------------------------------------ uncompressed 87988 62573 -28.9% gzip'd 17985 12725 -29.2% 3.11_03 - 2007-08-14 * fix an infinite recursion in ppport.h that could be triggered by circular dependencies * fix PERL_BCDREVISION, which wasn't BCD but simply shifted decimal (just in time for 5.10) * fix detection of macros that are not listed in the implementation/dontwarn sections 3.11_02 - 2007-08-13 * fix cpan #25372: special case sv_magic(sv, obj, how, name, 0) * fix cpan #27906: [PATCH] add UTF8_MAXBYTES (thanks to Steve Peters for providing a patch) * added support for the following API sv_2pv_flags sv_2pvbyte_nolen SV_CONST_RETURN SV_COW_DROP_PV SV_COW_SHARED_HASH_KEYS SV_GMAGIC SV_HAS_TRAILING_NUL SV_IMMEDIATE_UNREF sv_magic_portable SV_MUTABLE_RETURN SV_NOSTEAL sv_pvn_force_flags SV_SMAGIC SV_UTF8_NO_ENCODING SvPV_const SvPV_flags SvPV_flags_const SvPV_flags_const_nolen SvPV_flags_mutable SvPV_force SvPV_force_flags SvPV_force_flags_mutable SvPV_force_flags_nolen SvPV_force_mutable SvPV_force_nolen SvPV_force_nomg_nolen SvPV_mutable SvPV_nolen_const SvPV_nomg_const SvPV_nomg_const_nolen SvUOK UTF8_MAXBYTES * provide compatibility macros for vanished variables PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters * add warnings support to ppport.h * update ppport.h file searching logic * add -c.inc and -xs.inc to the list of supported extensions * document that --copy doesn't include the dot * improve soak script and devel/buildperl.pl 3.11_01 - 2007-03-23 * added support for the following API PL_expect load_module vload_module (thanks to Nicholas Clark for providing a patch) 3.11 - 2007-02-14 * happy new year! 3.10_02 - 2006-12-02 * add two missing files 3.10_01 - 2006-12-02 * fix cpan #21239: Signals safe in Perl 5.8.0 * fix PL_ppaddr and PL_no_modify support 5.005 perls * added dTHXR, aTHXR and aTHXR_ for API that need the context argument in pre-5.6.0 perls * added support for the following API PL_DBsignal PL_DBtrace PL_laststatval PL_statcache * added tests for all PL_* variables * added progress indicator to soak script * added --test-archives option to buildperl.pl script * added comments to all autogenerated files that clearly indicate their purpose and origin 3.10 - 2006-08-14 * remove timestamp from generated ppport.h 3.09_02 - 2006-07-25 * added support for the following API my_strlcat my_strlcpy (thanks to Steve Peters for providing a patch) 3.09_01 - 2006-07-21 * avoid using 'glob' when running under miniperl 3.09 - 2006-07-08 * fix Makefile.PL's c_o override * update API info * improve soak script - now counts warnings emitted during testing - output is colored (can be turned off) * add a section on integrating this module into the core to the HACKERS file 3.08_07 - 2006-07-03 * fix cpan #20179: Licensing information for PPPort is unclear * only --unstrip a stripped ppport.h if an appropriate version of Devel::PPPort is installed * add a --version option to ppport.h 3.08_06 - 2006-06-25 * fix breakage on MSWin32, where generating XS files on the fly doesn't seem to work the same way as under Linux (thanks to Sadahiro Tomoyuki for providing a patch) * load the shared files only when testing the module * remove PPPort.xs from CPAN distribution 3.08_05 - 2006-06-23 * when in the core, generate PPPort.pm and PPPort.xs automatically * PPPort.pm can now be loaded by miniperl 3.08_04 - 2006-05-29 * update API info * fix a bug in the automated API info generator that caused slightly wrong output * improve the speed of the automated API info generator; we're now down from several hours to a few minutes 3.08_03 - 2006-05-25 * update API info * add devel/regenerate script to regenerate API info * improve and speed up the development tools 3.08_02 - 2006-05-22 * fix a POD error * added POD test * changed hv_stores() to omit the hash parameter * improve soak script - can now search directories for perl executables - can use only perl binaries of at least a certain revision using the --min option - sorts tests by perl version - shows a summary of failed versions * added support for the following API PERL_USE_GCC_BRACE_GROUPS PoisonFree PoisonNew PoisonWith SvREFCNT_inc SvREFCNT_inc_NN SvREFCNT_inc_simple SvREFCNT_inc_simple_NN SvREFCNT_inc_simple_void SvREFCNT_inc_simple_void_NN SvREFCNT_inc_void SvREFCNT_inc_void_NN 3.08_01 - 2006-05-20 * update NOOP and dNOOP to include lint directives * update API info (for 5.8.8 and 5.9.3) * added support for the following API ckWARN dVAR hv_fetchs hv_stores my_snprintf newSVpvs packWARN PERL_ABS PERL_UNUSED_ARG PERL_UNUSED_CONTEXT PERL_UNUSED_VAR STR_WITH_LEN sv_catpvs sv_setpvs SVf SvVSTRING_mg warner 3.08 - 2006-01-19 * thanks to Craig Berry for fixing my broken ppphtest * add AUTHOR and ABSTRACT_FROM to Makefile.PL 3.07 - 2006-01-16 * improve internals documentation in HACKERS * minor internal cleanups * thanks to Steve Peters for adding support for the following API SvMAGIC_set SvPVX_const SvPVX_mutable SvRV_set SvSTASH_set SvUV_set 3.06_04 - 2005-10-30 * add --strip / --unstrip options * added support for the following API Newx Newxc Newxz XSRETURN 3.06_03 - 2005-10-18 * fix extra ')' in PPPort_pm.PL * fix compiler warnings * fix test for PL_signals * fix API listing * more tests 3.06_02 - 2005-10-18 * improve devel/buildperl.pl utility * added support for the following API dAXMARK PL_signals PERL_SIGNALS_UNSAFE_FLAG XSprePUSH 3.06_01 - 2005-06-25 * fix --compat-version argument checking * filter files passed on the command line by default to make sure 'perl ppport.h *' does something useful * add --nofilter option to override the filtering * testsuite now hopefully supports MacOS Classic * check definedness of PERL_UNUSED_DECL * update API info 3.06 - 2005-02-02 * fix cpan #11327: make fails with syntax error * fix XCPT_* macros 3.05 - 2005-01-31 * fix a test for SvPV_nolen * add more examples to tht documentation * improve wording baseline information * added support for the following API dXCPT dXSTARG XCPT_CATCH XCPT_RETHROW XCPT_TRY_END XCPT_TRY_START 3.04 - 2004-12-29 * fix a hint for sv_pvn_force * fix VMS problem with unquoted command line arguments not preserving case (perl change #23367) * add --api-info switch for ppport.h 3.03 - 2004-09-08 * MY_CXT_CLONE was broken 3.02 - 2004-09-08 * added support for the following API: END_EXTERN_C EXTERN_C MY_CXT_CLONE PERL_GCC_BRACE_GROUPS_FORBIDDEN START_EXTERN_C STMT_END STMT_START 3.01 - 2004-08-23 * patchlevel.h tweak 3.00_03 - 2004-08-20 * make sure the @INC path is kept up-to-date when changing directories while running in the core test suite 3.00_02 - 2004-08-19 * remove PPPort.pm and PPPort.xs dependencies from Makefile.PL, as they can be rebuilt with a "make regen" when neccessary 3.00_01 - 2004-08-17 * fixed problems with $^X in t/ppphtest.t when building in the core on OpenBSD * fixed a "duplicate dependencies" bug that could lead to global NEED_'s where static NEED_'s are sufficient * added support for the following API: PL_DBsingle PL_DBsub PL_debstash PL_diehook PL_errgv PL_no_modify PL_perl_destruct_level PL_ppaddr PL_stack_sp PL_sv_arenaroot PL_tainted PL_tainting PUSHu sv_catpvf_mg sv_catpvf_mg_nocontext sv_setpvf_mg sv_setpvf_mg_nocontext sv_vcatpvf sv_vcatpvf_mg sv_vsetpvf sv_vsetpvf_mg vnewSVpvf XPUSHu 3.00 - 2004-08-16 * added support for dAX and dITEMS, which got lost while working on the 3.00 internals 2.99_07 - 2004-08-13 * improve/check documentation * add tests for CopFILE and CopSTASHPV * add file headers * some code cleanups 2.99_06 - 2004-08-11 * --compat-version now considers all macros/functions provided by Devel::PPPort, not only the documented API * fixed: PL_rsfp was PL_rsfpv * turn __PPPORT_NAME__ back to ppport.h, because the former looks ugly on search.cpan.org 2.99_05 - 2004-08-10 * --compat-version now also hides compatibility warnings for unsupported API calls 2.99_04 - 2004-08-10 * added code to check for correct INSTALLDIRS * added --compat-version option to ppport.h script to only check for compatibility with at least the given Perl version * some small adjustments 2.99_03 - 2004-08-09 * remove useless dependency from Makefile.PL (spotted by Craig A. Berry) * added checking for and replacement of C++ comments as well as --cplusplus option to suppress it to ppport.h script * added more diagnostic output to ppport.h script * added a hint for gv_stashpvn * fixed the thread tests (spotted by Craig A. Berry) * added more tests * renamed and documented DPPP_NAMESPACE * renamed some files 2.99_02 - 2004-08-08 * second beta * feature complete for 3.00 * implemented missing functionality for ppport.h script: - can now perform global (i.e. multi-file) NEED_ checks - checks source for missing aTHX arguments - checks source for unsupported API calls - can now lists provided and unsupported API - can use Text::Diff on platforms without diff utility - can use custom diff utility / options - can write one patch against the module - can write single copies with changes applied * updated the documentation for Devel::PPPort and ppport.h * added lots of tests for the ppport.h script * merged tests for call_* eval_* from XS::APItest * added HACKERS file to document internals * now includes PPPort.pm, so you can read the full docs using search.cpan.org 2.99_01 - 2004-08-07 * first beta towards 3.00 * complete rework of internals * autogenerated API-checks * autogenerated .pm, .xs and .t files * ppport.h changes: - no static/global functions without explicit NEED_ - can now be run without -x - now shows hints and dependencies - now has POD documentation, so perldoc ppport.h works - now has options - now uses File::Find when available * tested with multi-threaded (ithreads and 5.005-threads) perls from 5.005 and single-threaded perls from 5.003 up to 5.9.x * added support for the following API: CopFILE CopFILEAV CopFILEGV CopFILEGV_set CopFILE_set CopFILESV CopSTASH CopSTASH_eq CopSTASHPV CopSTASHPV_set CopSTASH_set CopyD dUNDERBAR IN_PERL_COMPILETIME IV_MAX IV_MIN IVTYPE memEQ memNE MoveD mPUSHi mPUSHn mPUSHp mPUSHu mXPUSHi mXPUSHn mXPUSHp mXPUSHu newCONSTSUB newSVuv PERL_INT_MAX PERL_INT_MIN PERL_LONG_MAX PERL_LONG_MIN PERL_QUAD_MAX PERL_QUAD_MIN PERL_SHORT_MAX PERL_SHORT_MIN PERL_UCHAR_MAX PERL_UCHAR_MIN PERL_UINT_MAX PERL_UINT_MIN PERL_ULONG_MAX PERL_ULONG_MIN PERL_UQUAD_MAX PERL_UQUAD_MIN PERL_USHORT_MAX PERL_USHORT_MIN PL_hexdigit PL_rsfp Poison PUSHmortal sv_2pvbyte sv_2pvbyte_nolen sv_2pv_nolen sv_2uv sv_catpv_mg sv_catpvn_mg sv_catpvn_nomg sv_catsv_mg sv_catsv_nomg SvGETMAGIC SvIV_nomg SvPV_force_nomg sv_pvn sv_pvn_force sv_pvn_nomg SvPV_nomg sv_setiv_mg sv_setnv_mg sv_setpv_mg sv_setpvn_mg sv_setsv_mg sv_setsv_nomg sv_setuv sv_setuv_mg sv_usepvn_mg sv_uv SvUV SvUV_nomg SvUVx SvUVX SvUVXx UNDERBAR UV_MAX UV_MIN UVTYPE XPUSHmortal XSRETURN_UV XST_mUV ZeroD 2.008 - 20th October 2003 * eval_(pv|sv) added * PERL_MAGIC_* added 2.007 - 18th September 2003 * small fix in grok_numeric_radix: variable was used uninitialized 2.006 - 8th September 2003 * call_(pv|sv|method|argv) added * still compiler-warnings for grok_??? and 5.6.x, fixed 2.005 - 2nd September 2003 * Some tweaks to grok_(hex|oct|bin) to make compiler warnings go away for older perls * grok_number and grok_numeric_radix added 2.004 - 22th August 2003 * Added grok_(hex|oct|bin) and related constants 2.003 - 8th May 2003 * Added get_av, get_cv, get_hv and get_sv 2.002 - 2nd December 2001 * More portability issues in Makefile.PL addresed. * Merged the Harness sub-module into Devel::PPPort * More documentation in PPPort.pm 2.001 * Some portability issues in Makefile.PL addresed. 2.000 * Initial port to the perl core. 1.007 * Original version of the module by Kenneth Albanowski. PK…I1]GÕíz2z2soaknu„[µü¤PK…I1]n‚y†áá®2READMEnu„[µü¤PK…I1]‰†Ä¥·'·'Å:HACKERSnu„[µü¤PK…I1]¹å}õ»»³bTODOnu„[µü¤PK…I1]d&£po^o^¢zChangesnu„[µü¤PK\HÙ