This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
authorNicholas Clark <nick@ccl4.org>
Fri, 13 Jan 2006 21:52:38 +0000 (21:52 +0000)
committerNicholas Clark <nick@ccl4.org>
Fri, 13 Jan 2006 21:52:38 +0000 (21:52 +0000)
[ 26809]
Upgrade to Devel::PPPort 3.06_01
p4raw-link: @26809 on //depot/perl: 4a5826852ee095d233fab172b67097a331a21e42

p4raw-id: //depot/maint-5.8/perl@26839
p4raw-integrated: from //depot/perl@26837 'copy in'
ext/Devel/PPPort/parts/apidoc.fnc
ext/Devel/PPPort/parts/todo/5004040
ext/Devel/PPPort/parts/todo/5005000 (@23222..)
ext/Devel/PPPort/parts/todo/5006000 (@23223..)
ext/Devel/PPPort/t/newCONSTSUB.t (@23280..)
ext/Devel/PPPort/t/ppphtest.t (@23367..)
ext/Devel/PPPort/HACKERS ext/Devel/PPPort/devel/buildperl.pl
ext/Devel/PPPort/devel/mkapidoc.sh ext/Devel/PPPort/mktests.PL
ext/Devel/PPPort/parts/apicheck.pl
ext/Devel/PPPort/parts/base/5006000
ext/Devel/PPPort/parts/base/5009002
ext/Devel/PPPort/parts/inc/MY_CXT
ext/Devel/PPPort/parts/inc/SvPV
ext/Devel/PPPort/parts/inc/format
ext/Devel/PPPort/parts/inc/grok
ext/Devel/PPPort/parts/inc/newCONSTSUB
ext/Devel/PPPort/parts/inc/ppphbin
ext/Devel/PPPort/parts/inc/ppphdoc
ext/Devel/PPPort/parts/inc/ppphtest
ext/Devel/PPPort/parts/inc/version
ext/Devel/PPPort/parts/ppptools.pl ext/Devel/PPPort/ppport_h.PL
ext/Devel/PPPort/soak (@23912..) ext/Devel/PPPort/Changes
ext/Devel/PPPort/META.yml ext/Devel/PPPort/PPPort.xs
ext/Devel/PPPort/PPPort_pm.PL (@23926..)
ext/Devel/PPPort/PPPort.pm ext/Devel/PPPort/parts/inc/misc
(@24519..) 'merge in' ext/Devel/PPPort/parts/embed.fnc
(@24755..)

32 files changed:
ext/Devel/PPPort/Changes
ext/Devel/PPPort/HACKERS
ext/Devel/PPPort/META.yml
ext/Devel/PPPort/PPPort.pm
ext/Devel/PPPort/PPPort.xs
ext/Devel/PPPort/PPPort_pm.PL
ext/Devel/PPPort/devel/buildperl.pl
ext/Devel/PPPort/devel/mkapidoc.sh
ext/Devel/PPPort/mktests.PL
ext/Devel/PPPort/parts/apicheck.pl
ext/Devel/PPPort/parts/apidoc.fnc
ext/Devel/PPPort/parts/base/5006000
ext/Devel/PPPort/parts/base/5009002
ext/Devel/PPPort/parts/embed.fnc
ext/Devel/PPPort/parts/inc/MY_CXT
ext/Devel/PPPort/parts/inc/SvPV
ext/Devel/PPPort/parts/inc/format
ext/Devel/PPPort/parts/inc/grok
ext/Devel/PPPort/parts/inc/misc
ext/Devel/PPPort/parts/inc/newCONSTSUB
ext/Devel/PPPort/parts/inc/ppphbin
ext/Devel/PPPort/parts/inc/ppphdoc
ext/Devel/PPPort/parts/inc/ppphtest
ext/Devel/PPPort/parts/inc/version
ext/Devel/PPPort/parts/ppptools.pl
ext/Devel/PPPort/parts/todo/5004040
ext/Devel/PPPort/parts/todo/5005000
ext/Devel/PPPort/parts/todo/5006000
ext/Devel/PPPort/ppport_h.PL
ext/Devel/PPPort/soak
ext/Devel/PPPort/t/newCONSTSUB.t
ext/Devel/PPPort/t/ppphtest.t

index 8eb53f6..30e6f68 100755 (executable)
@@ -1,3 +1,13 @@
+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
index 8aa9c57..7e386bd 100644 (file)
@@ -11,15 +11,15 @@ lying around in this distribution.
 
 =head1 DESCRIPTION
 
-=head2 How to build 87 versions of Perl
+=head2 How to build 98 versions of Perl
 
 C<Devel::PPPort> supports Perl versions between 5.003 and bleadperl.
 To guarantee this support, I need some of these versions on my
-machine. I currently have 87 different Perl version/configuration
+machine. I currently have 98 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 87 Perls by hand
+cleanly on newer systems (and because building 98 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<devel/buildperl.pl>.
 It can currently build the following Perl releases:
@@ -129,7 +129,8 @@ in the root directory of the distribution.
 
 Finally, add the remaining baseline information by running
 
-    perl devel/scanprov
+    perl Makefile.PL && make
+    perl devel/scanprov write
 
 =back
 
@@ -204,12 +205,13 @@ all Perl binaries you want to test.
 
 =head2 Special Makefile targets
 
-You can use 
+You can use
 
     make regen
 
-to regenerate all of the autogenerated files. To get rid of
-all generated files (except for parts/todo/*), use
+to regenerate all of the autogenerated files. To get rid of all
+generated files (except for F<parts/todo/*> and F<parts/base/*>),
+use
 
     make purge_all
 
index ba52479..f238de4 100644 (file)
@@ -1,7 +1,7 @@
 # http://module-build.sourceforge.net/META-spec.html
 #XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
 name:         Devel-PPPort
-version:      3.06
+version:      3.06_01
 version_from: PPPort_pm.PL
 installdirs:  perl
 requires:
index 8aebac5..133799d 100644 (file)
@@ -8,9 +8,9 @@
 #
 ################################################################################
 #
-#  $Revision: 33 $
+#  $Revision: 36 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:55 +0100 $
+#  $Date: 2005/06/25 17:56:28 +0200 $
 #
 ################################################################################
 #
@@ -45,12 +45,12 @@ C<Devel::PPPort> contains a single function, called C<WriteFile>. Its
 only purpose is to write the F<ppport.h> C header file. This file
 contains a series of macros and, if explicitly requested, functions that
 allow XS modules to be built using older versions of Perl. Currently,
-Perl versions from 5.003 to 5.9.2 are supported.
+Perl versions from 5.003 to 5.9.3 are supported.
 
-This module is used by C<h2xs> to write the file F<ppport.h>. 
+This module is used by C<h2xs> to write the file F<ppport.h>.
 
 =head2 Why use ppport.h?
+
 You should use F<ppport.h> in modern code so that your code will work
 with the widest range of Perl interpreters possible, without significant
 additional work.
@@ -69,7 +69,7 @@ They are most probably no XS writers. Also, don't make F<ppport.h>
 optional. Rather, just take the most recent copy of F<ppport.h> that
 you can find (e.g. by generating it with the latest C<Devel::PPPort>
 release from CPAN), copy it into your project, adjust your project to
-use it, and distribute the header along with your module. 
+use it, and distribute the header along with your module.
 
 =head2 Running ppport.h
 
@@ -99,7 +99,7 @@ Otherwise it returns a false value.
 
 =head1 COMPATIBILITY
 
-F<ppport.h> supports Perl versions from 5.003 to 5.9.2
+F<ppport.h> supports Perl versions from 5.003 to 5.9.3
 in threaded and non-threaded configurations.
 
 =head2 Provided Perl compatibility API
@@ -384,6 +384,27 @@ Perl below which it is unsupported:
 
 =over 4
 
+=item perl 5.9.3
+
+  SvMAGIC_set
+  SvRV_set
+  SvSTASH_set
+  SvUV_set
+  av_arylen_p
+  dAXMARK
+  hv_eiter_p
+  hv_eiter_set
+  hv_name_set
+  hv_placeholders_get
+  hv_placeholders_p
+  hv_placeholders_set
+  hv_riter_p
+  hv_riter_set
+  is_utf8_string_loclen
+  newSVhek
+  newWHILEOP
+  stashpv_hvname_match
+
 =item perl 5.9.2
 
   SvPVbyte_force
@@ -764,10 +785,6 @@ Perl below which it is unsupported:
   save_aelem
   save_helem
 
-=item perl 5.004_04
-
-  newWHILEOP
-
 =item perl 5.004
 
   GIMME_V
@@ -884,12 +901,13 @@ require DynaLoader;
 use strict;
 use vars qw($VERSION @ISA $data);
 
-$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.06 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.06_01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
 
 @ISA = qw(DynaLoader);
 
 bootstrap Devel::PPPort;
 
+sub _init_data
 {
   $data = do { local $/; <DATA> };
   my $now = localtime;
@@ -898,12 +916,13 @@ bootstrap Devel::PPPort;
   $data =~ s/__VERSION__/$VERSION/g;
   $data =~ s/__DATE__/$now/g;
   $data =~ s/__PKG__/$pkg/g;
-  $data =~ s/^POD\s//gm;
+  $data =~ s/^\|>//gm;
 }
 
 sub WriteFile
 {
   my $file = shift || 'ppport.h';
+  defined $data or _init_data();
   my $copy = $data;
   $copy =~ s/\bppport\.h\b/$file/g;
 
@@ -923,317 +942,325 @@ __DATA__
 /*
 ----------------------------------------------------------------------
 
-    ppport.h -- Perl/Pollution/Portability Version __VERSION__ 
-   
+    ppport.h -- Perl/Pollution/Portability Version __VERSION__
+
     Automatically created by __PKG__ running under
     perl __PERL_VERSION__ on __DATE__.
-    
+
     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 =pod
-POD 
-POD =head1 NAME
-POD 
-POD ppport.h - Perl/Pollution/Portability version __VERSION__
-POD 
-POD =head1 SYNOPSIS
-POD 
-POD   perl ppport.h [options] [files]
-POD 
-POD   --help                      show short help
-POD 
-POD   --patch=file                write one patch file with changes
-POD   --copy=suffix               write changed copies with suffix
-POD   --diff=program              use diff program and options
-POD 
-POD   --compat-version=version    provide compatibility with Perl version
-POD   --cplusplus                 accept C++ comments
-POD 
-POD   --quiet                     don't output anything except fatal errors
-POD   --nodiag                    don't show diagnostics
-POD   --nohints                   don't show hints
-POD   --nochanges                 don't suggest changes
-POD 
-POD   --list-provided             list provided API
-POD   --list-unsupported          list unsupported API
-POD   --api-info=name             show Perl API portability information
-POD 
-POD =head1 COMPATIBILITY
-POD 
-POD This version of F<ppport.h> is designed to support operation with Perl
-POD installations back to 5.003, and has been tested up to 5.9.2.
-POD 
-POD =head1 OPTIONS
-POD 
-POD =head2 --help
-POD 
-POD Display a brief usage summary.
-POD 
-POD =head2 --patch=I<file>
-POD 
-POD If this option is given, a single patch file will be created if
-POD any changes are suggested. This requires a working diff program
-POD to be installed on your system.
-POD 
-POD =head2 --copy=I<suffix>
-POD 
-POD If this option is given, a copy of each file will be saved with
-POD the given suffix that contains the suggested changes. This does
-POD not require any external programs.
-POD 
-POD If neither C<--patch> or C<--copy> are given, the default is to
-POD simply print the diffs for each file. This requires either
-POD C<Text::Diff> or a C<diff> program to be installed.
-POD 
-POD =head2 --diff=I<program>
-POD 
-POD Manually set the diff program and options to use. The default
-POD is to use C<Text::Diff>, when installed, and output unified
-POD context diffs.
-POD 
-POD =head2 --compat-version=I<version>
-POD 
-POD Tell F<ppport.h> to check for compatibility with the given
-POD Perl version. The default is to check for compatibility with Perl
-POD version 5.003. You can use this option to reduce the output
-POD of F<ppport.h> if you intend to be backward compatible only
-POD up to a certain Perl version.
-POD 
-POD =head2 --cplusplus
-POD 
-POD Usually, F<ppport.h> will detect C++ style comments and
-POD replace them with C style comments for portability reasons.
-POD Using this option instructs F<ppport.h> to leave C++
-POD comments untouched.
-POD 
-POD =head2 --quiet
-POD 
-POD Be quiet. Don't print anything except fatal errors.
-POD 
-POD =head2 --nodiag
-POD 
-POD Don't output any diagnostic messages. Only portability
-POD alerts will be printed.
-POD 
-POD =head2 --nohints
-POD 
-POD Don't output any hints. Hints often contain useful portability
-POD notes.
-POD 
-POD =head2 --nochanges
-POD 
-POD Don't suggest any changes. Only give diagnostic output and hints
-POD unless these are also deactivated.
-POD 
-POD =head2 --list-provided
-POD 
-POD Lists the API elements for which compatibility is provided by
-POD F<ppport.h>. Also lists if it must be explicitly requested,
-POD if it has dependencies, and if there are hints for it.
-POD 
-POD =head2 --list-unsupported
-POD 
-POD Lists the API elements that are known not to be supported by
-POD F<ppport.h> and below which version of Perl they probably
-POD won't be available or work.
-POD 
-POD =head2 --api-info=I<name>
-POD 
-POD Show portability information for API elements matching I<name>.
-POD If I<name> is surrounded by slashes, it is interpreted as a regular
-POD expression.
-POD 
-POD =head1 DESCRIPTION
-POD 
-POD In order for a Perl extension (XS) module to be as portable as possible
-POD across differing versions of Perl itself, certain steps need to be taken.
-POD 
-POD =over 4
-POD 
-POD =item *
-POD 
-POD Including this header is the first major one. This alone will give you
-POD access to a large part of the Perl API that hasn't been available in
-POD earlier Perl releases. Use
-POD 
-POD     perl ppport.h --list-provided
-POD 
-POD to see which API elements are provided by ppport.h.
-POD 
-POD =item *
-POD 
-POD You should avoid using deprecated parts of the API. For example, using
-POD global Perl variables without the C<PL_> prefix is deprecated. Also,
-POD some API functions used to have a C<perl_> prefix. Using this form is
-POD also deprecated. You can safely use the supported API, as F<ppport.h>
-POD will provide wrappers for older Perl versions.
-POD 
-POD =item *
-POD 
-POD If you use one of a few functions that were not present in earlier
-POD versions of Perl, and that can't be provided using a macro, you have
-POD to explicitly request support for these functions by adding one or
-POD more C<#define>s in your source code before the inclusion of F<ppport.h>.
-POD 
-POD These functions will be marked C<explicit> in the list shown by
-POD C<--list-provided>.
-POD 
-POD Depending on whether you module has a single or multiple files that
-POD use such functions, you want either C<static> or global variants.
-POD 
-POD For a C<static> function, use:
-POD 
-POD     #define NEED_function
-POD 
-POD For a global function, use:
-POD 
-POD     #define NEED_function_GLOBAL
-POD 
-POD Note that you mustn't have more than one global request for one
-POD function in your project.
-POD 
-POD     Function                  Static Request               Global Request                    
-POD     -----------------------------------------------------------------------------------------
-POD     eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL               
-POD     grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL              
-POD     grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL              
-POD     grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL           
-POD     grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL    
-POD     grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL              
-POD     newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL           
-POD     newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL           
-POD     sv_2pv_nolen()            NEED_sv_2pv_nolen            NEED_sv_2pv_nolen_GLOBAL          
-POD     sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL            
-POD     sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL          
-POD     sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
-POD     sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL          
-POD     sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
-POD     vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL             
-POD 
-POD To avoid namespace conflicts, you can change the namespace of the
-POD explicitly exported functions using the C<DPPP_NAMESPACE> macro.
-POD Just C<#define> the macro before including C<ppport.h>:
-POD 
-POD     #define DPPP_NAMESPACE MyOwnNamespace_
-POD     #include "ppport.h"
-POD 
-POD The default namespace is C<DPPP_>.
-POD 
-POD =back
-POD 
-POD The good thing is that most of the above can be checked by running
-POD F<ppport.h> on your source code. See the next section for
-POD details.
-POD 
-POD =head1 EXAMPLES
-POD 
-POD To verify whether F<ppport.h> is needed for your module, whether you
-POD should make any changes to your code, and whether any special defines
-POD should be used, F<ppport.h> can be run as a Perl script to check your
-POD source code. Simply say:
-POD 
-POD     perl ppport.h
-POD 
-POD The result will usually be a list of patches suggesting changes
-POD that should at least be acceptable, if not necessarily the most
-POD efficient solution, or a fix for all possible problems.
-POD 
-POD If you know that your XS module uses features only available in
-POD newer Perl releases, if you're aware that it uses C++ comments,
-POD and if you want all suggestions as a single patch file, you could
-POD use something like this:
-POD 
-POD     perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
-POD 
-POD If you only want your code to be scanned without any suggestions
-POD for changes, use:
-POD 
-POD     perl ppport.h --nochanges
-POD 
-POD You can specify a different C<diff> program or options, using
-POD the C<--diff> option:
-POD 
-POD     perl ppport.h --diff='diff -C 10'
-POD 
-POD This would output context diffs with 10 lines of context.
-POD 
-POD To display portability information for the C<newSVpvn> function,
-POD use:
-POD 
-POD     perl ppport.h --api-info=newSVpvn
-POD 
-POD Since the argument to C<--api-info> can be a regular expression,
-POD you can use
-POD 
-POD     perl ppport.h --api-info=/_nomg$/
-POD 
-POD to display portability information for all C<_nomg> functions or
-POD 
-POD     perl ppport.h --api-info=/./
-POD 
-POD to display information for all known API elements.
-POD 
-POD =head1 BUGS
-POD 
-POD If this version of F<ppport.h> is causing failure during
-POD the compilation of this module, please check if newer versions
-POD of either this module or C<Devel::PPPort> are available on CPAN
-POD before sending a bug report.
-POD 
-POD If F<ppport.h> was generated using the latest version of
-POD C<Devel::PPPort> and is causing failure of this module, please
-POD file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
-POD 
-POD Please include the following information:
-POD 
-POD =over 4
-POD 
-POD =item 1.
-POD 
-POD The complete output from running "perl -V"
-POD 
-POD =item 2.
-POD 
-POD This file.
-POD 
-POD =item 3.
-POD 
-POD The name and version of the module you were trying to build.
-POD 
-POD =item 4.
-POD 
-POD A full log of the build that failed.
-POD 
-POD =item 5.
-POD 
-POD Any other information that you think could be relevant.
-POD 
-POD =back
-POD 
-POD For the latest version of this code, please get the C<Devel::PPPort>
-POD module from CPAN.
-POD 
-POD =head1 COPYRIGHT
-POD 
-POD Version 3.x, Copyright (c) 2004-2005, Marcus Holland-Moritz.
-POD 
-POD Version 2.x, Copyright (C) 2001, Paul Marquess.
-POD 
-POD Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
-POD 
-POD This program is free software; you can redistribute it and/or
-POD modify it under the same terms as Perl itself.
-POD 
-POD =head1 SEE ALSO
-POD 
-POD See L<Devel::PPPort>.
+|>=pod
+|>
+|>=head1 NAME
+|>
+|>ppport.h - Perl/Pollution/Portability version __VERSION__
+|>
+|>=head1 SYNOPSIS
+|>
+|>  perl ppport.h [options] [source files]
+|>
+|>  Searches current directory for files if no [source files] are given
+|>
+|>  --help                      show short help
+|>
+|>  --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
+|>
+|>  --list-provided             list provided API
+|>  --list-unsupported          list unsupported API
+|>  --api-info=name             show Perl API portability information
+|>
+|>=head1 COMPATIBILITY
+|>
+|>This version of F<ppport.h> is designed to support operation with Perl
+|>installations back to 5.003, and has been tested up to 5.9.3.
+|>
+|>=head1 OPTIONS
+|>
+|>=head2 --help
+|>
+|>Display a brief usage summary.
+|>
+|>=head2 --patch=I<file>
+|>
+|>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<suffix>
+|>
+|>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.
+|>
+|>If neither C<--patch> or C<--copy> are given, the default is to
+|>simply print the diffs for each file. This requires either
+|>C<Text::Diff> or a C<diff> program to be installed.
+|>
+|>=head2 --diff=I<program>
+|>
+|>Manually set the diff program and options to use. The default
+|>is to use C<Text::Diff>, when installed, and output unified
+|>context diffs.
+|>
+|>=head2 --compat-version=I<version>
+|>
+|>Tell F<ppport.h> 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<ppport.h> if you intend to be backward compatible only
+|>up to a certain Perl version.
+|>
+|>=head2 --cplusplus
+|>
+|>Usually, F<ppport.h> will detect C++ style comments and
+|>replace them with C style comments for portability reasons.
+|>Using this option instructs F<ppport.h> 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.
+|>
+|>=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 --list-provided
+|>
+|>Lists the API elements for which compatibility is provided by
+|>F<ppport.h>. Also lists if it must be explicitly requested,
+|>if it has dependencies, and if there are hints for it.
+|>
+|>=head2 --list-unsupported
+|>
+|>Lists the API elements that are known not to be supported by
+|>F<ppport.h> and below which version of Perl they probably
+|>won't be available or work.
+|>
+|>=head2 --api-info=I<name>
+|>
+|>Show portability information for API elements matching I<name>.
+|>If I<name> 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<PL_> prefix is deprecated. Also,
+|>some API functions used to have a C<perl_> prefix. Using this form is
+|>also deprecated. You can safely use the supported API, as F<ppport.h>
+|>will provide wrappers for older Perl versions.
+|>
+|>=item *
+|>
+|>If you use one of a few functions 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<ppport.h>.
+|>
+|>These functions will be marked C<explicit> in the list shown by
+|>C<--list-provided>.
+|>
+|>Depending on whether you module has a single or multiple files that
+|>use such functions, you want either C<static> or global variants.
+|>
+|>For a C<static> function, use:
+|>
+|>    #define NEED_function
+|>
+|>For a global function, use:
+|>
+|>    #define NEED_function_GLOBAL
+|>
+|>Note that you mustn't have more than one global request for one
+|>function in your project.
+|>
+|>    Function                  Static Request               Global Request
+|>    -----------------------------------------------------------------------------------------
+|>    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
+|>    newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
+|>    newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
+|>    sv_2pv_nolen()            NEED_sv_2pv_nolen            NEED_sv_2pv_nolen_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_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
+|>    vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
+|>
+|>To avoid namespace conflicts, you can change the namespace of the
+|>explicitly exported functions using the C<DPPP_NAMESPACE> macro.
+|>Just C<#define> the macro before including C<ppport.h>:
+|>
+|>    #define DPPP_NAMESPACE MyOwnNamespace_
+|>    #include "ppport.h"
+|>
+|>The default namespace is C<DPPP_>.
+|>
+|>=back
+|>
+|>The good thing is that most of the above can be checked by running
+|>F<ppport.h> on your source code. See the next section for
+|>details.
+|>
+|>=head1 EXAMPLES
+|>
+|>To verify whether F<ppport.h> is needed for your module, whether you
+|>should make any changes to your code, and whether any special defines
+|>should be used, F<ppport.h> 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<diff> 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.
+|>
+|>To display portability information for the C<newSVpvn> 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<ppport.h> is causing failure during
+|>the compilation of this module, please check if newer versions
+|>of either this module or C<Devel::PPPort> are available on CPAN
+|>before sending a bug report.
+|>
+|>If F<ppport.h> was generated using the latest version of
+|>C<Devel::PPPort> and is causing failure of this module, please
+|>file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+|>
+|>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<Devel::PPPort>
+|>module from CPAN.
+|>
+|>=head1 COPYRIGHT
+|>
+|>Version 3.x, Copyright (c) 2004-2005, 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<Devel::PPPort>.
 
 =cut
 
@@ -1245,6 +1272,7 @@ my %opt = (
   hints     => 1,
   changes   => 1,
   cplusplus => 0,
+  filter    => 1,
 );
 
 my($ppport) = $0 =~ /([\w.]+)$/;
@@ -1254,7 +1282,7 @@ my $HS = "[ \t]";             # horizontal whitespace
 eval {
   require Getopt::Long;
   Getopt::Long::GetOptions(\%opt, qw(
-    help quiet diag! hints! changes! cplusplus
+    help quiet diag! filter! hints! changes! cplusplus
     patch=s copy=s diff=s compat-version=s
     list-provided list-unsupported api-info=s
   )) or usage();
@@ -1273,7 +1301,7 @@ if (exists $opt{'compat-version'}) {
     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 || $v >= 1000;
+  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
   $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
 }
 else {
@@ -1286,32 +1314,8 @@ my $cce  = '*'.'/';
 my $rccs = quotemeta $ccs;
 my $rcce = quotemeta $cce;
 
-my @files;
-
-if (@ARGV) {
-  @files = map { glob $_ } @ARGV;
-}
-else {
-  eval {
-    require File::Find;
-    File::Find::find(sub {
-      $File::Find::name =~ /\.(xs|c|h|cc)$/i
-          and push @files, $File::Find::name;
-    }, '.');
-  };
-  if ($@) {
-    @files = map { glob $_ } qw(*.xs *.c *.h *.cc);
-  }
-  my %filter = map { /(.*)\.xs$/ ? ("$1.c" => 1) : () } @files;
-  @files = grep { !/\b\Q$ppport\E$/i && !exists $filter{$_} } @files;
-}
-
-unless (@files) {
-  die "No input files given!\n";
-}
-
 my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
-                ? ( $1 => { 
+                ? ( $1 => {
                       ($2                  ? ( base     => $2 ) : ()),
                       ($3                  ? ( todo     => $3 ) : ()),
                       (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
@@ -1410,6 +1414,7 @@ ORIGMARK|||
 PAD_BASE_SV|||
 PAD_CLONE_VARS|||
 PAD_COMPNAME_FLAGS|||
+PAD_COMPNAME_GEN_set|||
 PAD_COMPNAME_GEN|||
 PAD_COMPNAME_OURSTASH|||
 PAD_COMPNAME_PV|||
@@ -1422,7 +1427,7 @@ PAD_SET_CUR_NOSAVE|||
 PAD_SET_CUR|||
 PAD_SVl|||
 PAD_SV|||
-PERL_BCDVERSION|5.009002||p
+PERL_BCDVERSION|5.009003||p
 PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
 PERL_INT_MAX|5.004000||p
 PERL_INT_MIN|5.004000||p
@@ -1609,12 +1614,15 @@ 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|
 SvNIOK_off|||
 SvNIOKp|||
 SvNIOK|||
@@ -1624,6 +1632,7 @@ SvNOK_on|||
 SvNOKp|||
 SvNOK|||
 SvNVX|||
+SvNV_set|||
 SvNVx|||
 SvNV|||
 SvOK|||
@@ -1639,6 +1648,7 @@ SvPV_force_nomg|5.007002||p
 SvPV_force|||
 SvPV_nolen|5.006000||p
 SvPV_nomg|5.007002||p
+SvPV_set|||
 SvPVbyte_force||5.009002|
 SvPVbyte_nolen||5.006000|
 SvPVbytex_force||5.006000|
@@ -1657,9 +1667,11 @@ SvREFCNT|||
 SvROK_off|||
 SvROK_on|||
 SvROK|||
+SvRV_set||5.009003|
 SvRV|||
 SvSETMAGIC|||
 SvSHARE||5.007003|
+SvSTASH_set||5.009003|
 SvSTASH|||
 SvSetMagicSV_nosteal||5.004000|
 SvSetMagicSV||5.004000|
@@ -1680,6 +1692,7 @@ SvUTF8||5.006000|
 SvUVXx|5.004000||p
 SvUVX|5.004000||p
 SvUV_nomg|5.009001||p
+SvUV_set||5.009003|
 SvUVx|5.004000||p
 SvUV|5.004000||p
 SvVOK||5.008001|
@@ -1743,6 +1756,7 @@ asIV|||
 asUV|||
 atfork_lock||5.007003|n
 atfork_unlock||5.007003|n
+av_arylen_p||5.009003|
 av_clear|||
 av_delete||5.006000|
 av_exists||5.006000|
@@ -1789,6 +1803,47 @@ cast_uv||5.006000|
 check_uni|||
 checkcomma|||
 checkposixcc|||
+ck_anoncode|||
+ck_bitop|||
+ck_concat|||
+ck_defined|||
+ck_delete|||
+ck_die|||
+ck_eof|||
+ck_eval|||
+ck_exec|||
+ck_exists|||
+ck_exit|||
+ck_ftst|||
+ck_fun|||
+ck_glob|||
+ck_grep|||
+ck_index|||
+ck_join|||
+ck_lengthconst|||
+ck_lfun|||
+ck_listiob|||
+ck_match|||
+ck_method|||
+ck_null|||
+ck_open|||
+ck_repeat|||
+ck_require|||
+ck_retarget|||
+ck_return|||
+ck_rfun|||
+ck_rvconst|||
+ck_sassign|||
+ck_select|||
+ck_shift|||
+ck_sort|||
+ck_spair|||
+ck_split|||
+ck_subr|||
+ck_substr|||
+ck_svconst|||
+ck_trunc|||
+ck_unpack|||
 cl_and|||
 cl_anything|||
 cl_init_zero|||
@@ -1812,6 +1867,7 @@ cv_undef|||
 cx_dump||5.005000|
 cx_dup|||
 cxinc|||
+dAXMARK||5.009003|
 dAX|5.007002||p
 dITEMS|5.007002||p
 dMARK|||
@@ -1841,18 +1897,6 @@ debstack||5.007003|
 deb||5.007003|v
 del_he|||
 del_sv|||
-del_xiv|||
-del_xnv|||
-del_xpvav|||
-del_xpvbm|||
-del_xpvcv|||
-del_xpvhv|||
-del_xpviv|||
-del_xpvlv|||
-del_xpvmg|||
-del_xpvnv|||
-del_xpv|||
-del_xrv|||
 delimcpy||5.004000|
 depcom|||
 deprecate_old|||
@@ -1916,7 +1960,6 @@ do_vecset|||
 do_vop|||
 docatch_body|||
 docatch|||
-doencodes|||
 doeval|||
 dofile|||
 dofindlabel|||
@@ -1972,6 +2015,7 @@ form_nocontext|||vn
 form||5.004000|v
 fp_dup|||
 fprintf_nocontext|||vn
+free_global_struct|||
 free_tied_hv_pool|||
 free_tmps|||
 gen_constant_list|||
@@ -2031,15 +2075,19 @@ gv_stashpvn|5.006000||p
 gv_stashpv|||
 gv_stashsv|||
 he_dup|||
+hek_dup|||
 hfreeentries|||
 hsplit|||
 hv_assert||5.009001|
+hv_auxinit|||
 hv_clear_placeholders||5.009001|
 hv_clear|||
 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_exists_ent||5.004000|
 hv_exists|||
 hv_fetch_common|||
@@ -2056,7 +2104,13 @@ hv_iterval|||
 hv_ksplit||5.004000|
 hv_magic_check|||
 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|
@@ -2071,6 +2125,7 @@ incpush|||
 ingroup|||
 init_argv_symbols|||
 init_debugger|||
+init_global_struct|||
 init_i18nl10n||5.006000|
 init_i18nl14n||5.006000|
 init_ids|||
@@ -2098,6 +2153,7 @@ is_an_int|||
 is_gv_magical_sv|||
 is_gv_magical|||
 is_handle_constructor|||
+is_list_assignment|||
 is_lvalue_sub||5.007001|
 is_uni_alnum_lc||5.006000|
 is_uni_alnumc_lc||5.006000|
@@ -2131,6 +2187,7 @@ is_utf8_alnumc||5.006000|
 is_utf8_alnum||5.006000|
 is_utf8_alpha||5.006000|
 is_utf8_ascii||5.006000|
+is_utf8_char_slow|||
 is_utf8_char||5.006000|
 is_utf8_cntrl||5.006000|
 is_utf8_digit||5.006000|
@@ -2142,6 +2199,7 @@ is_utf8_mark||5.006000|
 is_utf8_print||5.006000|
 is_utf8_punct||5.006000|
 is_utf8_space||5.006000|
+is_utf8_string_loclen||5.009003|
 is_utf8_string_loc||5.008001|
 is_utf8_string||5.006001|
 is_utf8_upper||5.006000|
@@ -2155,7 +2213,6 @@ leave_scope|||
 lex_end|||
 lex_start|||
 linklist|||
-list_assignment|||
 listkids|||
 list|||
 load_module_nocontext|||vn
@@ -2177,6 +2234,7 @@ magic_clearpack|||
 magic_clearsig|||
 magic_dump||5.006000|
 magic_existspack|||
+magic_freearylen_p|||
 magic_freeovrld|||
 magic_freeregexp|||
 magic_getarylen|||
@@ -2226,6 +2284,7 @@ magic_set|||
 magic_sizepack|||
 magic_wipepack|||
 magicname|||
+make_trie|||
 malloced_size|||n
 malloc||5.007002|n
 markstack_grow|||
@@ -2245,6 +2304,7 @@ mg_find|||
 mg_free|||
 mg_get|||
 mg_length||5.005000|
+mg_localize|||
 mg_magical|||
 mg_set|||
 mg_size||5.005000|
@@ -2253,20 +2313,6 @@ missingterm|||
 mode_from_discipline|||
 modkids|||
 mod|||
-more_he|||
-more_sv|||
-more_xiv|||
-more_xnv|||
-more_xpvav|||
-more_xpvbm|||
-more_xpvcv|||
-more_xpvhv|||
-more_xpviv|||
-more_xpvlv|||
-more_xpvmg|||
-more_xpvnv|||
-more_xpv|||
-more_xrv|||
 moreswitches|||
 mul128|||
 mulexp10|||n
@@ -2364,6 +2410,7 @@ newSTATEOP|||
 newSUB|||
 newSVOP|||
 newSVREF|||
+newSVhek||5.009003|
 newSViv|||
 newSVnv|||
 newSVpvf_nocontext|||vn
@@ -2376,7 +2423,7 @@ newSVsv|||
 newSVuv|5.006000||p
 newSV|||
 newUNOP|||
-newWHILEOP||5.004040|
+newWHILEOP||5.009003|
 newXSproto||5.006000|
 newXS||5.006000|
 new_collate||5.006000|
@@ -2387,18 +2434,6 @@ new_logop|||
 new_numeric||5.006000|
 new_stackinfo||5.005000|
 new_version||5.009000|
-new_xiv|||
-new_xnv|||
-new_xpvav|||
-new_xpvbm|||
-new_xpvcv|||
-new_xpvhv|||
-new_xpviv|||
-new_xpvlv|||
-new_xpvmg|||
-new_xpvnv|||
-new_xpv|||
-new_xrv|||
 next_symbol|||
 nextargv|||
 nextchar|||
@@ -2434,6 +2469,7 @@ pad_add_name|||
 pad_alloc|||
 pad_block_start|||
 pad_check_dup|||
+pad_compname_type|||
 pad_findlex|||
 pad_findmy|||
 pad_fixup_inner_anons|||
@@ -2540,6 +2576,7 @@ rsignal||5.004000|
 run_body|||
 runops_debug||5.005000|
 runops_standard||5.005000|
+rvpv_dup|||
 rxres_free|||
 rxres_restore|||
 rxres_save|||
@@ -2643,6 +2680,7 @@ ss_dup|||
 stack_grow|||
 start_glob|||
 start_subparse||5.004000|
+stashpv_hvname_match||5.009003|
 stdize_locale|||
 strEQ|||
 strGE|||
@@ -2863,6 +2901,7 @@ uvchr_to_utf8||5.007001|
 uvuni_to_utf8_flags||5.007003|
 uvuni_to_utf8||5.007001|
 validate_suid|||
+varname|||
 vcmp||5.009000|
 vcroak||5.006000|
 vdeb||5.007003|
@@ -2981,6 +3020,44 @@ if (exists $opt{'list-provided'}) {
   exit 0;
 }
 
+my @files;
+my @srcext = qw( xs c h cc cpp );
+my $srcext = join '|', @srcext;
+
+if (@ARGV) {
+  my %seen;
+  @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
+}
+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;
+}
+
+unless (@files) {
+  die "No input files given!\n";
+}
+
 my(%files, %global, %revreplace);
 %revreplace = reverse %replace;
 my $filename;
@@ -3515,7 +3592,7 @@ __DATA__
 
 #define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
 
-/* It is very unlikely that anyone will try to use this with Perl 6 
+/* It is very unlikely that anyone will try to use this with Perl 6
    (or greater), but who knows.
  */
 #if PERL_REVISION != 5
@@ -4001,7 +4078,7 @@ typedef NVTYPE NV;
 #  if PTRSIZE == LONGSIZE
 #    define PTR2ul(p)     (unsigned long)(p)
 #  else
-#    define PTR2ul(p)     INT2PTR(unsigned long,p)        
+#    define PTR2ul(p)     INT2PTR(unsigned long,p)
 #  endif
 
 #endif /* !INT2PTR */
@@ -4167,15 +4244,15 @@ typedef NVTYPE NV;
 #endif
 
 #ifndef pTHX_
-#  define pTHX_                          
+#  define pTHX_
 #endif
 
 #ifndef aTHX
-#  define aTHX                           
+#  define aTHX
 #endif
 
 #ifndef aTHX_
-#  define aTHX_                          
+#  define aTHX_
 #endif
 #ifndef dTHXoa
 #  define dTHXoa(x)                      dTHXa(x)
@@ -4493,7 +4570,7 @@ DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
 
 #ifndef NVef
 #  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
-      defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */ 
+      defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
 #    define NVef          PERL_PRIeldbl
 #    define NVff          PERL_PRIfldbl
 #    define NVgf          PERL_PRIgldbl
@@ -4523,7 +4600,7 @@ extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
 
 char *
 DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
-{   
+{
   STRLEN n_a;
   return sv_2pv(sv, &n_a);
 }
@@ -4567,7 +4644,7 @@ extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
 
 char *
 DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
-{   
+{
   sv_utf8_downgrade(sv,0);
   return SvPV(sv,*lp);
 }
@@ -5245,12 +5322,12 @@ 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) { 
+    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; 
+            return TRUE;
         }
     }
 #else
@@ -5261,11 +5338,11 @@ DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
     dTHR;  /* needed for older threaded perls */
     struct lconv *lc = localeconv();
     char *radix = lc->decimal_point;
-    if (radix && IN_LOCALE) { 
+    if (radix && IN_LOCALE) {
         STRLEN len = strlen(radix);
         if (*sp + len <= send && memEQ(*sp, radix, len)) {
             *sp += len;
-            return TRUE; 
+            return TRUE;
         }
     }
 #endif /* PERL_VERSION */
@@ -5578,7 +5655,7 @@ DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
             warn("Illegal binary digit '%c' ignored", *s);
         break;
     }
-    
+
     if (   ( overflowed && value_nv > 4294967295.0)
 #if UVSIZE > 4
        || (!overflowed && value > 0xffffffff  )
@@ -5680,7 +5757,7 @@ DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
             warn("Illegal hexadecimal digit '%c' ignored", *s);
         break;
     }
-    
+
     if (   ( overflowed && value_nv > 4294967295.0)
 #if UVSIZE > 4
        || (!overflowed && value > 0xffffffff  )
@@ -5773,7 +5850,7 @@ DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
         }
         break;
     }
-    
+
     if (   ( overflowed && value_nv > 4294967295.0)
 #if UVSIZE > 4
        || (!overflowed && value > 0xffffffff  )
index 731741b..dd6465f 100644 (file)
@@ -87,13 +87,13 @@ XS(XS_Devel__PPPort_dXSTARG)
 
 /* ---- from parts/inc/MY_CXT ---- */
 #define MY_CXT_KEY "Devel::PPPort::_guts" XS_VERSION
+
 typedef struct {
   /* Put Global Data in here */
-  int dummy;          
+  int dummy;
 } my_cxt_t;
-START_MY_CXT     
+
+START_MY_CXT
 
 /* ---- from parts/inc/newCONSTSUB ---- */
 void call_newCONSTSUB_1(void)
index e992230..61ac6b2 100644 (file)
@@ -4,9 +4,9 @@
 #
 ################################################################################
 #
-#  $Revision: 33 $
+#  $Revision: 36 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:55 +0100 $
+#  $Date: 2005/06/25 17:56:28 +0200 $
 #
 ################################################################################
 #
@@ -47,7 +47,7 @@ $data =~ s{^(.*)__PROVIDED_API__(\s*?)^}
   for (keys %explicit) {
     length > $len and $len = length;
   }
-  my $format = sprintf "%%-%ds  %%-%ds  %%-%ds", $len+2, $len+5, $len+12;
+  my $format = sprintf '%%-%ds  %%-%ds  %%s', $len+2, $len+5;
   $len = 3*$len + 23;
 
 $data =~ s/^(.*)__EXPLICIT_API__(\s*?)^/
@@ -125,7 +125,7 @@ $data =~ s{^__UNSUPPORTED_API__(\s*?)^}
           {join "\n", @todo}gem;
 
 $data =~ s{__MIN_PERL__}{5.003}g;
-$data =~ s{__MAX_PERL__}{5.9.2}g;
+$data =~ s{__MAX_PERL__}{5.9.3}g;
 
 open FH, ">PPPort.pm" or die "PPPort.pm: $!\n";
 print FH $data;
@@ -196,7 +196,7 @@ sub expand_undefined
   my($macro, $withargs, $def) = @_;
   my $rv = "#ifndef $macro\n#  define ";
 
-  if (defined $def) {
+  if (defined $def && $def =~ /\S/) {
     $rv .= sprintf "%-30s %s", $withargs, $def;
   }
   else {
@@ -309,9 +309,9 @@ __DATA__
 #
 ################################################################################
 #
-#  $Revision: 33 $
+#  $Revision: 36 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:55 +0100 $
+#  $Date: 2005/06/25 17:56:28 +0200 $
 #
 ################################################################################
 #
@@ -348,10 +348,10 @@ contains a series of macros and, if explicitly requested, functions that
 allow XS modules to be built using older versions of Perl. Currently,
 Perl versions from __MIN_PERL__ to __MAX_PERL__ are supported.
 
-This module is used by C<h2xs> to write the file F<ppport.h>. 
+This module is used by C<h2xs> to write the file F<ppport.h>.
 
 =head2 Why use ppport.h?
+
 You should use F<ppport.h> in modern code so that your code will work
 with the widest range of Perl interpreters possible, without significant
 additional work.
@@ -370,7 +370,7 @@ They are most probably no XS writers. Also, don't make F<ppport.h>
 optional. Rather, just take the most recent copy of F<ppport.h> that
 you can find (e.g. by generating it with the latest C<Devel::PPPort>
 release from CPAN), copy it into your project, adjust your project to
-use it, and distribute the header along with your module. 
+use it, and distribute the header along with your module.
 
 =head2 Running ppport.h
 
@@ -473,12 +473,13 @@ require DynaLoader;
 use strict;
 use vars qw($VERSION @ISA $data);
 
-$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.06 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.06_01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
 
 @ISA = qw(DynaLoader);
 
 bootstrap Devel::PPPort;
 
+sub _init_data
 {
   $data = do { local $/; <DATA> };
   my $now = localtime;
@@ -487,12 +488,13 @@ bootstrap Devel::PPPort;
   $data =~ s/__VERSION__/$VERSION/g;
   $data =~ s/__DATE__/$now/g;
   $data =~ s/__PKG__/$pkg/g;
-  $data =~ s/^POD\s//gm;
+  $data =~ s/^\|>//gm;
 }
 
 sub WriteFile
 {
   my $file = shift || 'ppport.h';
+  defined $data or _init_data();
   my $copy = $data;
   $copy =~ s/\bppport\.h\b/$file/g;
 
@@ -512,21 +514,21 @@ __DATA__
 /*
 ----------------------------------------------------------------------
 
-    ppport.h -- Perl/Pollution/Portability Version __VERSION__ 
-   
+    ppport.h -- Perl/Pollution/Portability Version __VERSION__
+
     Automatically created by __PKG__ running under
     perl __PERL_VERSION__ on __DATE__.
-    
+
     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
 
-%include ppphdoc { indent => 'POD ' }
+%include ppphdoc { indent => '|>' }
 
 %include ppphbin
 
index b26a3e9..5a1c13b 100644 (file)
@@ -5,9 +5,9 @@
 #
 ################################################################################
 #
-#  $Revision: 4 $
+#  $Revision: 6 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:49 +0100 $
+#  $Date: 2005/03/10 18:10:17 +0100 $
 #
 ################################################################################
 #
@@ -37,18 +37,18 @@ my %opt = (
 );
 
 my %config = (
-  default     => { 
+  default     => {
                   config_args => '-des',
                  },
-  thread      => { 
+  thread      => {
                   config_args     => '-des -Dusethreads',
                   masked_versions => [ qr/^perl5\.00[01234]/ ],
                  },
-  thread5005  => { 
+  thread5005  => {
                   config_args     => '-des -Duse5005threads',
                   masked_versions => [ qr/^perl5\.00[012345]|^perl-5.(9|\d\d)/ ],
                  },
-  debug       => { 
+  debug       => {
                   config_args => '-des -Doptimize=-g',
                  },
 );
@@ -173,7 +173,7 @@ sub expand
 sub is
 {
   my($s1, $s2) = @_;
-  
+
   defined $s1 != defined $s2 and return 0;
 
   ref $s2 and ($s1, $s2) = ($s2, $s1);
@@ -270,7 +270,7 @@ sub patch_doio
 @@ -75,6 +75,16 @@
  #  endif
  #endif
+
 +#if _SEM_SEMUN_UNDEFINED
 +union semun
 +{
index 74da36f..c0dccac 100644 (file)
@@ -5,9 +5,9 @@
 #
 ################################################################################
 #
-#  $Revision: 6 $
+#  $Revision: 7 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:49 +0100 $
+#  $Date: 2005/03/10 18:21:59 +0100 $
 #
 ################################################################################
 #
@@ -64,7 +64,7 @@ fi
 if isperlroot $PERLROOT; then
   grep -hr '^=for apidoc' $PERLROOT | sed -e 's/=for apidoc //' | grep '|' | sort | uniq \
      | perl -e'$f=pop;open(F,$f)||die"$f:$!";while(<F>){(split/\|/)[2]=~/(\w+)/;$h{$1}++}
-               while(<>){(split/\|/)[2]=~/(\w+)/;$h{$1}||print}' $EMBED >$OUTPUT
+               while(<>){s/[ \t]+$//;(split/\|/)[2]=~/(\w+)/;$h{$1}||print}' $EMBED >$OUTPUT
 else
   usage
 fi
index 684a5ca..cb8a874 100644 (file)
@@ -4,9 +4,9 @@
 #
 ################################################################################
 #
-#  $Revision: 19 $
+#  $Revision: 20 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:50 +0100 $
+#  $Date: 2005/03/10 18:45:54 +0100 $
 #
 ################################################################################
 #
@@ -44,7 +44,7 @@ for $file (glob 'parts/inc/*') {
     $tmpl =~ s/__SOURCE__/$file/mg;
     $tmpl =~ s/__PLAN__/$spec->{OPTIONS}{tests}{plan}/mg;
     $tmpl =~ s/^__TESTS__$/$spec->{tests}/mg;
-    
+
     open FH, ">$testfile" or die "$testfile: $!\n";
     print FH $tmpl;
     close FH;
index b4b668f..d737afe 100644 (file)
@@ -5,9 +5,9 @@
 #
 ################################################################################
 #
-#  $Revision: 11 $
+#  $Revision: 13 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:51 +0100 $
+#  $Date: 2005/06/25 16:47:31 +0200 $
 #
 ################################################################################
 #
@@ -85,18 +85,22 @@ my %ignorerv = (
 );
 
 my %stack = (
-  ORIGMARK  => ['dORIGMARK;'],
-  POPpx     => ['STRLEN n_a;'],
-  POPpbytex => ['STRLEN n_a;'],
-  PUSHp     => ['dTARG;'],
-  PUSHn     => ['dTARG;'],
-  PUSHi     => ['dTARG;'],
-  PUSHu     => ['dTARG;'],
-  XPUSHp    => ['dTARG;'],
-  XPUSHn    => ['dTARG;'],
-  XPUSHi    => ['dTARG;'],
-  XPUSHu    => ['dTARG;'],
-  UNDERBAR  => ['dUNDERBAR;'],
+  ORIGMARK       => ['dORIGMARK;'],
+  POPpx          => ['STRLEN n_a;'],
+  POPpbytex      => ['STRLEN n_a;'],
+  PUSHp          => ['dTARG;'],
+  PUSHn          => ['dTARG;'],
+  PUSHi          => ['dTARG;'],
+  PUSHu          => ['dTARG;'],
+  XPUSHp         => ['dTARG;'],
+  XPUSHn         => ['dTARG;'],
+  XPUSHi         => ['dTARG;'],
+  XPUSHu         => ['dTARG;'],
+  UNDERBAR       => ['dUNDERBAR;'],
+  XCPT_TRY_START => ['dXCPT;'],
+  XCPT_TRY_END   => ['dXCPT;'],
+  XCPT_CATCH     => ['dXCPT;'],
+  XCPT_RETHROW   => ['dXCPT;'],
 );
 
 my %postcode = (
@@ -136,6 +140,8 @@ print OUT <<HEAD;
 
 #include "EXTERN.h"
 #include "perl.h"
+
+#define NO_XSLOCKS
 #include "XSUB.h"
 
 #ifndef DPPP_APICHECK_NO_PPPORT_H
@@ -192,7 +198,11 @@ for $f (@f) {
       push @arg, qw(VARarg1 VARarg2 VARarg3);
       last;
     }
-    my($n, $p, $d) = $a =~ /^(\w+(?:\s+\w+)*)\s*(\**)((?:\[[^\]]*\])*)$/ or die;
+    my($n, $p, $d) = $a =~ /^ (\w+(?:\s+\w+)*)\s*  # type name  => $n
+                              (\**)                # pointer    => $p
+                              ((?:\[[^\]]*\])*)    # dimension  => $d
+                            $/x
+                     or die "$0 - cannot parse argument: [$a]\n";
     if (exists $amap{$n}) {
       push @arg, $amap{$n};
       next;
index 0e67f04..0f82489 100644 (file)
@@ -85,11 +85,13 @@ Am|NV|SvNVX|SV* sv
 Amn|(whatever)|RETVAL
 Amn|(whatever)|THIS
 Ams||dAX
+Ams||dAXMARK
 Ams||dITEMS
 Ams||dMARK
 Ams||dORIGMARK
 Ams||dSP
 Ams||dUNDERBAR
+Ams||dXCPT
 Ams||dXSARGS
 Ams||dXSI32
 Ams||ENTER
@@ -112,6 +114,7 @@ Am|SV*|ST|int ix
 Am|SV*|SvREFCNT_inc|SV* sv
 Am|SV*|SvRV|SV* sv
 Am|svtype|SvTYPE|SV* sv
+Ams||XCPT_RETHROW
 Ams||XSRETURN_EMPTY
 Ams||XSRETURN_NO
 Ams||XSRETURN_UNDEF
@@ -129,7 +132,7 @@ AmU||HEf_SVKEY
 AmU||MARK
 AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
 AmU||Nullav
-AmU||Nullch 
+AmU||Nullch
 AmU||Nullcv
 AmU||Nullhv
 AmU||Nullsv
@@ -148,6 +151,9 @@ Am|UV|SvUV_nomg|SV* sv
 Am|UV|SvUV|SV* sv
 Am|UV|SvUVx|SV* sv
 Am|UV|SvUVX|SV* sv
+AmU||XCPT_CATCH
+AmU||XCPT_TRY_END
+AmU||XCPT_TRY_START
 AmU||XS
 AmU||XS_VERSION
 Am|void *|CopyD|void* src|void* dest|int nitems|type
@@ -187,18 +193,24 @@ Am|void|SvIOK_off|SV* sv
 Am|void|SvIOK_only|SV* sv
 Am|void|SvIOK_only_UV|SV* sv
 Am|void|SvIOK_on|SV* sv
+Am|void|SvIV_set|SV* sv|IV val
+Am|void|SvLEN_set|SV* sv|STRLEN len
 Am|void|SvLOCK|SV* sv
+Am|void|SvMAGIC_set|SV* sv|MAGIC* val
 Am|void|SvNIOK_off|SV* sv
 Am|void|SvNOK_off|SV* sv
 Am|void|SvNOK_only|SV* sv
 Am|void|SvNOK_on|SV* sv
+Am|void|SvNV_set|SV* sv|NV val
 Am|void|SvPOK_off|SV* sv
 Am|void|SvPOK_only|SV* sv
 Am|void|SvPOK_only_UTF8|SV* sv
 Am|void|SvPOK_on|SV* sv
+Am|void|SvPV_set|SV* sv|char* val
 Am|void|SvREFCNT_dec|SV* sv
 Am|void|SvROK_off|SV* sv
 Am|void|SvROK_on|SV* sv
+Am|void|SvRV_set|SV* sv|SV* val
 Am|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv
 Am|void|SvSETMAGIC|SV* sv
 Am|void|SvSetMagicSV|SV* dsb|SV* ssv
@@ -206,6 +218,7 @@ Am|void|sv_setsv_nomg|SV* dsv|SV* ssv
 Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv
 Am|void|SvSetSV|SV* dsb|SV* ssv
 Am|void|SvSHARE|SV* sv
+Am|void|SvSTASH_set|SV* sv|STASH* val
 Am|void|SvTAINTED_off|SV* sv
 Am|void|SvTAINTED_on|SV* sv
 Am|void|SvTAINT|SV* sv
@@ -214,6 +227,7 @@ Am|void|SvUOK|SV* sv
 Am|void|SvUPGRADE|SV* sv|svtype type
 Am|void|SvUTF8_off|SV *sv
 Am|void|SvUTF8_on|SV *sv
+Am|void|SvUV_set|SV* sv|UV val
 Am|void|XPUSHi|IV iv
 Am|void|XPUSHmortal
 Am|void|XPUSHn|NV nv
@@ -247,6 +261,7 @@ mn|SV*|PL_ofs_sv
 mn|SV*|PL_rs
 ms||djSP
 m|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po
+m|STRLEN|PAD_COMPNAME_GEN_set|PADOFFSET po|int gen
 m|SV *|CX_CURPAD_SV|struct context|PADOFFSET po
 m|SV *|PAD_BASE_SV     |PADLIST padlist|PADOFFSET po
 m|SV *|PAD_SETSV       |PADOFFSET po|SV* sv
index f26d172..1a7dd17 100644 (file)
@@ -7,6 +7,7 @@ SvIOK_notUV                    # U
 SvIOK_only_UV                  # U
 SvNV                           # E
 SvNVX                          # E
+SvNV_set                       # E
 SvNVx                          # E
 SvPOK_only_UTF8                # U
 SvPV_nolen                     # E
@@ -263,7 +264,6 @@ newSVrv                        # E (Perl_newSVrv)
 newSVsv                        # E (Perl_newSVsv)
 newSVuv                        # E
 newUNOP                        # E (Perl_newUNOP)
-newWHILEOP                     # E (Perl_newWHILEOP)
 newXS                          # E (Perl_newXS)
 newXSproto                     # E
 new_collate                    # E (perl_new_collate)
index 69a4526..ffc0ffc 100644 (file)
@@ -4,9 +4,14 @@ MoveD                          # E
 PUSHmortal                     # E
 SvPVbyte_force                 # E
 UNDERBAR                       # E
+XCPT_CATCH                     # E
+XCPT_RETHROW                   # E
+XCPT_TRY_END                   # E
+XCPT_TRY_START                 # E
 XPUSHmortal                    # E
 ZeroD                          # E
 dUNDERBAR                      # E
+dXCPT                          # E
 find_rundefsvoffset            # U
 gv_fetchpvn_flags              # E
 gv_fetchsv                     # E
@@ -23,9 +28,3 @@ op_refcnt_unlock               # U
 savesvpv                       # E
 vnormal                        # E
 MY_CXT_CLONE                   # added by devel/scanprov
-PERL_BCDVERSION                # added by devel/scanprov
-XCPT_CATCH                     # added by devel/scanprov
-XCPT_RETHROW                   # added by devel/scanprov
-XCPT_TRY_END                   # added by devel/scanprov
-XCPT_TRY_START                 # added by devel/scanprov
-dXCPT                          # added by devel/scanprov
index 795f3fe..5be7013 100644 (file)
 :      b               binary backward compatibility; function is a macro
 :                      but has also Perl_ implementation (which is exported)
 :      U               suppress usage example in autogenerated documentation
+:      a               allocates memory a la malloc/calloc.  Is also "R".
+:      R               Return value must not be ignored.
+:      P               pure function: no effects except the return value;
+:                      return value depends only on parms and/or globals
+:
+: Pointer parameters that must not be passed NULLs should be prefixed with NN.
+:
+: Pointer parameters that may be NULL should be prefixed with NULLOK.  This has
+: no effect on output yet.  It's a notation for the maintainers to know "I have
+: defined whether NULL is OK or not" rather than having neither NULL or NULLOK,
+: which is ambiguous.
 :
 : Individual flags may be separated by whitespace.
 :
@@ -41,13 +52,13 @@ Ano |PerlInterpreter*       |perl_alloc_using \
                                |struct IPerlProc* p
 #endif
 Anod   |PerlInterpreter*       |perl_alloc
-Anod   |void   |perl_construct |PerlInterpreter* interp
-Anod   |int    |perl_destruct  |PerlInterpreter* interp
-Anod   |void   |perl_free      |PerlInterpreter* interp
-Anod   |int    |perl_run       |PerlInterpreter* interp
+Anod   |void   |perl_construct |NN PerlInterpreter* interp
+Anod   |int    |perl_destruct  |NN PerlInterpreter* interp
+Anod   |void   |perl_free      |NN PerlInterpreter* interp
+Anod   |int    |perl_run       |NN PerlInterpreter* interp
 Anod   |int    |perl_parse     |PerlInterpreter* interp|XSINIT_t xsinit \
                                |int argc|char** argv|char** env
-Anp    |bool   |doing_taint    |int argc|char** argv|char** env
+AnpR   |bool   |doing_taint    |int argc|char** argv|char** env
 #if defined(USE_ITHREADS)
 Anod   |PerlInterpreter*|perl_clone|PerlInterpreter* interp|UV flags
 #  if defined(PERL_IMPLICIT_SYS)
@@ -60,12 +71,12 @@ Ano |PerlInterpreter*|perl_clone_using|PerlInterpreter *interp|UV flags \
 #  endif
 #endif
 
-Anop   |Malloc_t|malloc        |MEM_SIZE nbytes
-Anop   |Malloc_t|calloc        |MEM_SIZE elements|MEM_SIZE size
-Anop   |Malloc_t|realloc       |Malloc_t where|MEM_SIZE nbytes
+Aanop  |Malloc_t|malloc        |MEM_SIZE nbytes
+Aanop  |Malloc_t|calloc        |MEM_SIZE elements|MEM_SIZE size
+Aanop  |Malloc_t|realloc       |Malloc_t where|MEM_SIZE nbytes
 Anop   |Free_t |mfree          |Malloc_t where
 #if defined(MYMALLOC)
-np     |MEM_SIZE|malloced_size |void *p
+npR    |MEM_SIZE|malloced_size |void *p
 #endif
 
 Anp    |void*  |get_context
@@ -82,39 +93,40 @@ Ap  |CV*    |gv_handler     |HV* stash|I32 id
 p      |OP*    |append_elem    |I32 optype|OP* head|OP* tail
 p      |OP*    |append_list    |I32 optype|LISTOP* first|LISTOP* last
 p      |I32    |apply          |I32 type|SV** mark|SV** sp
-ApM    |void   |apply_attrs_string|char *stashpv|CV *cv|char *attrstr|STRLEN len
+ApM    |void   |apply_attrs_string|const char *stashpv|CV *cv|const char *attrstr|STRLEN len
 Apd    |void   |av_clear       |AV* ar
 Apd    |SV*    |av_delete      |AV* ar|I32 key|I32 flags
-Apd    |bool   |av_exists      |AV* ar|I32 key
-Apd    |void   |av_extend      |AV* ar|I32 key
-p      |AV*    |av_fake        |I32 size|SV** svp
-Apd    |SV**   |av_fetch       |AV* ar|I32 key|I32 lval
+ApdR   |bool   |av_exists      |AV* ar|I32 key
+Apd    |void   |av_extend      |NN AV* ar|I32 key
+pR     |AV*    |av_fake        |I32 size|NN SV** svp
+ApdR   |SV**   |av_fetch       |AV* ar|I32 key|I32 lval
 Apd    |void   |av_fill        |AV* ar|I32 fill
-Apd    |I32    |av_len         |AV* ar
-Apd    |AV*    |av_make        |I32 size|SV** svp
+ApdR   |I32    |av_len         |const AV* ar
+ApdR   |AV*    |av_make        |I32 size|NN SV** svp
 Apd    |SV*    |av_pop         |AV* ar
 Apd    |void   |av_push        |AV* ar|SV* val
 p      |void   |av_reify       |AV* ar
-Apd    |SV*    |av_shift       |AV* ar
+ApdR   |SV*    |av_shift       |AV* ar
 Apd    |SV**   |av_store       |AV* ar|I32 key|SV* val
 Apd    |void   |av_undef       |AV* ar
 Apd    |void   |av_unshift     |AV* ar|I32 num
-p      |OP*    |bind_match     |I32 type|OP* left|OP* pat
-p      |OP*    |block_end      |I32 floor|OP* seq
-Ap     |I32    |block_gimme
-p      |int    |block_start    |int full
+Apo    |SV**   |av_arylen_p    |AV* av
+pR     |OP*    |bind_match     |I32 type|NN OP* left|NN OP* pat
+pR     |OP*    |block_end      |I32 floor|OP* seq
+ApR    |I32    |block_gimme
+pR     |int    |block_start    |int full
 p      |void   |boot_core_UNIVERSAL
 p      |void   |boot_core_PerlIO
-Ap     |void   |call_list      |I32 oldscope|AV* av_list
-p      |bool   |cando          |Mode_t mode|Uid_t effective|Stat_t* statbufp
-Ap     |U32    |cast_ulong     |NV f
-Ap     |I32    |cast_i32       |NV f
-Ap     |IV     |cast_iv        |NV f
-Ap     |UV     |cast_uv        |NV f
+Ap     |void   |call_list      |I32 oldscope|NN AV* av_list
+pR     |bool   |cando          |Mode_t mode|Uid_t effective|NN const Stat_t* statbufp
+ApR    |U32    |cast_ulong     |NV f
+ApR    |I32    |cast_i32       |NV f
+ApR    |IV     |cast_iv        |NV f
+ApR    |UV     |cast_uv        |NV f
 #if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
-Ap     |I32    |my_chsize      |int fd|Off_t length
+ApR    |I32    |my_chsize      |int fd|Off_t length
 #endif
-p      |OP*    |convert        |I32 optype|I32 flags|OP* o
+pR     |OP*    |convert        |I32 optype|I32 flags|OP* o
 Afprd  |void   |croak          |const char* pat|...
 Apr    |void   |vcroak         |const char* pat|va_list* args
 #if defined(PERL_IMPLICIT_CONTEXT)
@@ -134,43 +146,43 @@ Afnp      |void   |sv_setpvf_mg_nocontext|SV* sv|const char* pat|...
 Afnp   |int    |fprintf_nocontext|PerlIO* stream|const char* fmt|...
 Afnp   |int    |printf_nocontext|const char* fmt|...
 #endif
-p      |void   |cv_ckproto     |CV* cv|GV* gv|char* p
-pd     |CV*    |cv_clone       |CV* proto
+p      |void   |cv_ckproto     |NN const CV* cv|const GV* gv|const char* p
+pd     |CV*    |cv_clone       |NN CV* proto
 Apd    |SV*    |cv_const_sv    |CV* cv
-p      |SV*    |op_const_sv    |OP* o|CV* cv
+p      |SV*    |op_const_sv    |const OP* o|CV* cv
 Apd    |void   |cv_undef       |CV* cv
 Ap     |void   |cx_dump        |PERL_CONTEXT* cs
 Ap     |SV*    |filter_add     |filter_t funcp|SV* datasv
 Ap     |void   |filter_del     |filter_t funcp
 Ap     |I32    |filter_read    |int idx|SV* buffer|int maxlen
-Ap     |char** |get_op_descs
-Ap     |char** |get_op_names
-p      |char*  |get_no_modify
-p      |U32*   |get_opargs
-Ap     |PPADDR_t*|get_ppaddr
-Ep     |I32    |cxinc
+ApPR   |char** |get_op_descs
+ApPR   |char** |get_op_names
+pPR    |const char*    |get_no_modify
+pPR    |U32*   |get_opargs
+ApPR   |PPADDR_t*|get_ppaddr
+EpR    |I32    |cxinc
 Afp    |void   |deb            |const char* pat|...
 Ap     |void   |vdeb           |const char* pat|va_list* args
 Ap     |void   |debprofdump
-Ap     |I32    |debop          |OP* o
+Ap     |I32    |debop          |NN const OP* o
 Ap     |I32    |debstack
 Ap     |I32    |debstackptrs
-Ap     |char*  |delimcpy       |char* to|char* toend|char* from \
-                               |char* fromend|int delim|I32* retlen
-p      |void   |deprecate      |char* s
-p      |void   |deprecate_old  |char* s
+Ap     |char*  |delimcpy       |NN char* to|NN const char* toend|NN const char* from \
+                               |NN const char* fromend|int delim|NN I32* retlen
+p      |void   |deprecate      |NN const char* s
+p      |void   |deprecate_old  |NN const char* s
 Afp    |OP*    |die            |const char* pat|...
 p      |OP*    |vdie           |const char* pat|va_list* args
-p      |OP*    |die_where      |char* message|STRLEN msglen
+p      |OP*    |die_where      |const char* message|STRLEN msglen
 Ap     |void   |dounwind       |I32 cxix
 p      |bool   |do_aexec       |SV* really|SV** mark|SV** sp
 p      |bool   |do_aexec5      |SV* really|SV** mark|SV** sp|int fd|int flag
-Ap     |int    |do_binmode     |PerlIO *fp|int iotype|int mode
-p      |void   |do_chop        |SV* asv|SV* sv
-Ap     |bool   |do_close       |GV* gv|bool not_implicit
-p      |bool   |do_eof         |GV* gv
-p      |bool   |do_exec        |char* cmd
-#if defined(WIN32)
+Ap     |int    |do_binmode     |NN PerlIO *fp|int iotype|int mode
+p      |void   |do_chop        |NN SV* asv|NN SV* sv
+Ap     |bool   |do_close       |NN GV* gv|bool not_implicit
+p      |bool   |do_eof         |NN GV* gv
+p      |bool   |do_exec        |NN char* cmd
+#if defined(WIN32) || defined(SYMBIAN)
 Ap     |int    |do_aspawn      |SV* really|SV** mark|SV** sp
 Ap     |int    |do_spawn       |char* cmd
 Ap     |int    |do_spawn_nowait|char* cmd
@@ -187,7 +199,7 @@ p   |I32    |do_msgsnd      |SV** mark|SV** sp
 p      |I32    |do_semop       |SV** mark|SV** sp
 p      |I32    |do_shmio       |I32 optype|SV** mark|SV** sp
 #endif
-Ap     |void   |do_join        |SV* sv|SV* del|SV** mark|SV** sp
+Ap     |void   |do_join        |NN SV* sv|NN SV* del|NN SV** mark|NN SV** sp
 p      |OP*    |do_kv
 Ap     |bool   |do_open        |GV* gv|char* name|I32 len|int as_raw \
                                |int rawmode|int rawperm|PerlIO* supplied_fp
@@ -206,8 +218,8 @@ Ap  |void   |do_sprintf     |SV* sv|I32 len|SV** sarg
 p      |Off_t  |do_sysseek     |GV* gv|Off_t pos|int whence
 p      |Off_t  |do_tell        |GV* gv
 p      |I32    |do_trans       |SV* sv
-p      |UV     |do_vecget      |SV* sv|I32 offset|I32 size
-p      |void   |do_vecset      |SV* sv
+p      |UV     |do_vecget      |NN SV* sv|I32 offset|I32 size
+p      |void   |do_vecset      |NN SV* sv
 p      |void   |do_vop         |I32 optype|SV* sv|SV* left|SV* right
 p      |OP*    |dofile         |OP* term
 Ap     |I32    |dowantarray
@@ -216,19 +228,19 @@ Ap        |void   |dump_eval
 #if defined(DUMP_FDS)
 Ap     |void   |dump_fds       |char* s
 #endif
-Ap     |void   |dump_form      |GV* gv
+Ap     |void   |dump_form      |const GV* gv
 Ap     |void   |gv_dump        |GV* gv
-Ap     |void   |op_dump        |OP* arg
+Ap     |void   |op_dump        |const OP* arg
 Ap     |void   |pmop_dump      |PMOP* pm
-Ap     |void   |dump_packsubs  |HV* stash
-Ap     |void   |dump_sub       |GV* gv
+Ap     |void   |dump_packsubs  |const HV* stash
+Ap     |void   |dump_sub       |NN const GV* gv
 Apd    |void   |fbm_compile    |SV* sv|U32 flags
 Apd    |char*  |fbm_instr      |unsigned char* big|unsigned char* bigend \
                                |SV* littlesv|U32 flags
-p      |char*  |find_script    |char *scriptname|bool dosearch \
-                               |char **search_ext|I32 flags
-p      |OP*    |force_list     |OP* arg
-p      |OP*    |fold_constants |OP* arg
+p      |char*  |find_script    |const char *scriptname|bool dosearch \
+                               |const char **search_ext|I32 flags
+p      |OP*    |force_list     |NN OP* arg
+p      |OP*    |fold_constants |NN OP* arg
 Afpd   |char*  |form           |const char* pat|...
 Ap     |char*  |vform          |const char* pat|va_list* args
 Ap     |void   |free_tmps
@@ -238,16 +250,15 @@ p |char*  |getenv_len     |const char* key|unsigned long *len
 #endif
 Ap     |void   |gp_free        |GV* gv
 Ap     |GP*    |gp_ref         |GP* gp
-Ap     |GV*    |gv_AVadd       |GV* gv
-Ap     |GV*    |gv_HVadd       |GV* gv
-Ap     |GV*    |gv_IOadd       |GV* gv
-Ap     |GV*    |gv_autoload4   |HV* stash|const char* name|STRLEN len \
-                               |I32 method
+Ap     |GV*    |gv_AVadd       |NN GV* gv
+Ap     |GV*    |gv_HVadd       |NN GV* gv
+Ap     |GV*    |gv_IOadd       |NN GV* gv
+ApR    |GV*    |gv_autoload4   |HV* stash|NN const char* name|STRLEN len|I32 method
 Ap     |void   |gv_check       |HV* stash
-Ap     |void   |gv_efullname   |SV* sv|GV* gv
-Amb    |void   |gv_efullname3  |SV* sv|GV* gv|const char* prefix
-Ap     |void   |gv_efullname4  |SV* sv|GV* gv|const char* prefix|bool keepmain
-Ap     |GV*    |gv_fetchfile   |const char* name
+Ap     |void   |gv_efullname   |SV* sv|const GV* gv
+Apmb   |void   |gv_efullname3  |SV* sv|const GV* gv|const char* prefix
+Ap     |void   |gv_efullname4  |SV* sv|const GV* gv|const char* prefix|bool keepmain
+Ap     |GV*    |gv_fetchfile   |NN const char* name
 Apd    |GV*    |gv_fetchmeth   |HV* stash|const char* name|STRLEN len \
                                |I32 level
 Apd    |GV*    |gv_fetchmeth_autoload  |HV* stash|const char* name|STRLEN len \
@@ -256,11 +267,10 @@ Apd       |GV*    |gv_fetchmethod |HV* stash|const char* name
 Apd    |GV*    |gv_fetchmethod_autoload|HV* stash|const char* name \
                                |I32 autoload
 Ap     |GV*    |gv_fetchpv     |const char* name|I32 add|I32 sv_type
-Ap     |void   |gv_fullname    |SV* sv|GV* gv
-Amb    |void   |gv_fullname3   |SV* sv|GV* gv|const char* prefix
-Ap     |void   |gv_fullname4   |SV* sv|GV* gv|const char* prefix|bool keepmain
-Ap     |void   |gv_init        |GV* gv|HV* stash|const char* name \
-                               |STRLEN len|int multi
+Ap     |void   |gv_fullname    |SV* sv|const GV* gv
+Apmb   |void   |gv_fullname3   |SV* sv|const GV* gv|const char* prefix
+Ap     |void   |gv_fullname4   |SV* sv|const GV* gv|const char* prefix|bool keepmain
+Ap     |void   |gv_init        |NN GV* gv|HV* stash|NN const char* name|STRLEN len|int multi
 Apd    |HV*    |gv_stashpv     |const char* name|I32 create
 Apd    |HV*    |gv_stashpvn    |const char* name|U32 namelen|I32 create
 Apd    |HV*    |gv_stashsv     |SV* sv|I32 create
@@ -268,19 +278,19 @@ Apd       |void   |hv_clear       |HV* tb
 Ap     |void   |hv_delayfree_ent|HV* hv|HE* entry
 Apd    |SV*    |hv_delete      |HV* tb|const char* key|I32 klen|I32 flags
 Apd    |SV*    |hv_delete_ent  |HV* tb|SV* key|I32 flags|U32 hash
-Apd    |bool   |hv_exists      |HV* tb|const char* key|I32 klen
-Apd    |bool   |hv_exists_ent  |HV* tb|SV* key|U32 hash
+ApdR   |bool   |hv_exists      |HV* tb|const char* key|I32 klen
+ApdR   |bool   |hv_exists_ent  |HV* tb|SV* key|U32 hash
 Apd    |SV**   |hv_fetch       |HV* tb|const char* key|I32 klen|I32 lval
 Apd    |HE*    |hv_fetch_ent   |HV* tb|SV* key|I32 lval|U32 hash
-Ap     |void   |hv_free_ent    |HV* hv|HE* entry
-Apd    |I32    |hv_iterinit    |HV* tb
-Apd    |char*  |hv_iterkey     |HE* entry|I32* retlen
-Apd    |SV*    |hv_iterkeysv   |HE* entry
-Apd    |HE*    |hv_iternext    |HV* tb
-Apd    |SV*    |hv_iternextsv  |HV* hv|char** key|I32* retlen
-ApMd   |HE*    |hv_iternext_flags|HV* tb|I32 flags
-Apd    |SV*    |hv_iterval     |HV* tb|HE* entry
-Ap     |void   |hv_ksplit      |HV* hv|IV newmax
+Ap     |void   |hv_free_ent    |NN HV* hv|HE* entry
+Apd    |I32    |hv_iterinit    |NN HV* tb
+ApdR   |char*  |hv_iterkey     |NN HE* entry|NN I32* retlen
+ApdR   |SV*    |hv_iterkeysv   |NN HE* entry
+ApdR   |HE*    |hv_iternext    |NN HV* tb
+ApdR   |SV*    |hv_iternextsv  |NN HV* hv|NN char** key|NN I32* retlen
+ApMdR  |HE*    |hv_iternext_flags|NN HV* tb|I32 flags
+ApdR   |SV*    |hv_iterval     |NN HV* tb|NN HE* entry
+Ap     |void   |hv_ksplit      |NN HV* hv|IV newmax
 Apd    |void   |hv_magic       |HV* hv|GV* gv|int how
 Apd    |SV**   |hv_store       |HV* tb|const char* key|I32 klen|SV* val \
                                |U32 hash
@@ -288,76 +298,77 @@ Apd       |HE*    |hv_store_ent   |HV* tb|SV* key|SV* val|U32 hash
 ApM    |SV**   |hv_store_flags |HV* tb|const char* key|I32 klen|SV* val \
                                |U32 hash|int flags
 Apd    |void   |hv_undef       |HV* tb
-Ap     |I32    |ibcmp          |const char* a|const char* b|I32 len
-Ap     |I32    |ibcmp_locale   |const char* a|const char* b|I32 len
-Apd    |I32    |ibcmp_utf8     |const char* a|char **pe1|UV l1|bool u1|const char* b|char **pe2|UV l2|bool u2
-p      |bool   |ingroup        |Gid_t testgid|Uid_t effective
-p      |void   |init_argv_symbols|int|char **
+ApP    |I32    |ibcmp          |NN const char* a|NN const char* b|I32 len
+ApP    |I32    |ibcmp_locale   |NN const char* a|NN const char* b|I32 len
+Apd    |I32    |ibcmp_utf8     |NN const char* a|char **pe1|UV l1|bool u1|NN const char* b|char **pe2|UV l2|bool u2
+pR     |bool   |ingroup        |Gid_t testgid|Uid_t effective
+p      |void   |init_argv_symbols|int argc|NN char **argv
 p      |void   |init_debugger
 Ap     |void   |init_stacks
 Ap     |void   |init_tm        |struct tm *ptm
 pd     |U32    |intro_my
-Ap     |char*  |instr          |const char* big|const char* little
-p      |bool   |io_close       |IO* io|bool not_implicit
-p      |OP*    |invert         |OP* cmd
-dp     |bool   |is_gv_magical  |char *name|STRLEN len|U32 flags
-Ap     |I32    |is_lvalue_sub
-Ap     |U32    |to_uni_upper_lc|U32 c
-Ap     |U32    |to_uni_title_lc|U32 c
-Ap     |U32    |to_uni_lower_lc|U32 c
-Ap     |bool   |is_uni_alnum   |UV c
-Ap     |bool   |is_uni_alnumc  |UV c
-Ap     |bool   |is_uni_idfirst |UV c
-Ap     |bool   |is_uni_alpha   |UV c
-Ap     |bool   |is_uni_ascii   |UV c
-Ap     |bool   |is_uni_space   |UV c
-Ap     |bool   |is_uni_cntrl   |UV c
-Ap     |bool   |is_uni_graph   |UV c
-Ap     |bool   |is_uni_digit   |UV c
-Ap     |bool   |is_uni_upper   |UV c
-Ap     |bool   |is_uni_lower   |UV c
-Ap     |bool   |is_uni_print   |UV c
-Ap     |bool   |is_uni_punct   |UV c
-Ap     |bool   |is_uni_xdigit  |UV c
-Ap     |UV     |to_uni_upper   |UV c|U8 *p|STRLEN *lenp
-Ap     |UV     |to_uni_title   |UV c|U8 *p|STRLEN *lenp
-Ap     |UV     |to_uni_lower   |UV c|U8 *p|STRLEN *lenp
-Ap     |UV     |to_uni_fold    |UV c|U8 *p|STRLEN *lenp
-Ap     |bool   |is_uni_alnum_lc|UV c
-Ap     |bool   |is_uni_alnumc_lc|UV c
-Ap     |bool   |is_uni_idfirst_lc|UV c
-Ap     |bool   |is_uni_alpha_lc|UV c
-Ap     |bool   |is_uni_ascii_lc|UV c
-Ap     |bool   |is_uni_space_lc|UV c
-Ap     |bool   |is_uni_cntrl_lc|UV c
-Ap     |bool   |is_uni_graph_lc|UV c
-Ap     |bool   |is_uni_digit_lc|UV c
-Ap     |bool   |is_uni_upper_lc|UV c
-Ap     |bool   |is_uni_lower_lc|UV c
-Ap     |bool   |is_uni_print_lc|UV c
-Ap     |bool   |is_uni_punct_lc|UV c
-Ap     |bool   |is_uni_xdigit_lc|UV c
-Apd    |STRLEN |is_utf8_char   |U8 *p
-Apd    |bool   |is_utf8_string |U8 *s|STRLEN len
-Apd    |bool   |is_utf8_string_loc|U8 *s|STRLEN len|U8 **p
-Ap     |bool   |is_utf8_alnum  |U8 *p
-Ap     |bool   |is_utf8_alnumc |U8 *p
-Ap     |bool   |is_utf8_idfirst|U8 *p
-Ap     |bool   |is_utf8_idcont |U8 *p
-Ap     |bool   |is_utf8_alpha  |U8 *p
-Ap     |bool   |is_utf8_ascii  |U8 *p
-Ap     |bool   |is_utf8_space  |U8 *p
-Ap     |bool   |is_utf8_cntrl  |U8 *p
-Ap     |bool   |is_utf8_digit  |U8 *p
-Ap     |bool   |is_utf8_graph  |U8 *p
-Ap     |bool   |is_utf8_upper  |U8 *p
-Ap     |bool   |is_utf8_lower  |U8 *p
-Ap     |bool   |is_utf8_print  |U8 *p
-Ap     |bool   |is_utf8_punct  |U8 *p
-Ap     |bool   |is_utf8_xdigit |U8 *p
-Ap     |bool   |is_utf8_mark   |U8 *p
-p      |OP*    |jmaybe         |OP* arg
-p      |I32    |keyword        |char* d|I32 len
+ApPR   |char*  |instr          |NN const char* big|NN const char* little
+pR     |bool   |io_close       |NN IO* io|bool not_implicit
+pR     |OP*    |invert         |OP* cmd
+dpR    |bool   |is_gv_magical  |const char *name|STRLEN len|U32 flags
+ApR    |I32    |is_lvalue_sub
+ApPR   |U32    |to_uni_upper_lc|U32 c
+ApPR   |U32    |to_uni_title_lc|U32 c
+ApPR   |U32    |to_uni_lower_lc|U32 c
+ApPR   |bool   |is_uni_alnum   |UV c
+ApPR   |bool   |is_uni_alnumc  |UV c
+ApPR   |bool   |is_uni_idfirst |UV c
+ApPR   |bool   |is_uni_alpha   |UV c
+ApPR   |bool   |is_uni_ascii   |UV c
+ApPR   |bool   |is_uni_space   |UV c
+ApPR   |bool   |is_uni_cntrl   |UV c
+ApPR   |bool   |is_uni_graph   |UV c
+ApPR   |bool   |is_uni_digit   |UV c
+ApPR   |bool   |is_uni_upper   |UV c
+ApPR   |bool   |is_uni_lower   |UV c
+ApPR   |bool   |is_uni_print   |UV c
+ApPR   |bool   |is_uni_punct   |UV c
+ApPR   |bool   |is_uni_xdigit  |UV c
+Ap     |UV     |to_uni_upper   |UV c|NN U8 *p|NN STRLEN *lenp
+Ap     |UV     |to_uni_title   |UV c|NN U8 *p|NN STRLEN *lenp
+Ap     |UV     |to_uni_lower   |UV c|NN U8 *p|NN STRLEN *lenp
+Ap     |UV     |to_uni_fold    |UV c|NN U8 *p|NN STRLEN *lenp
+ApPR   |bool   |is_uni_alnum_lc|UV c
+ApPR   |bool   |is_uni_alnumc_lc|UV c
+ApPR   |bool   |is_uni_idfirst_lc|UV c
+ApPR   |bool   |is_uni_alpha_lc|UV c
+ApPR   |bool   |is_uni_ascii_lc|UV c
+ApPR   |bool   |is_uni_space_lc|UV c
+ApPR   |bool   |is_uni_cntrl_lc|UV c
+ApPR   |bool   |is_uni_graph_lc|UV c
+ApPR   |bool   |is_uni_digit_lc|UV c
+ApPR   |bool   |is_uni_upper_lc|UV c
+ApPR   |bool   |is_uni_lower_lc|UV c
+ApPR   |bool   |is_uni_print_lc|UV c
+ApPR   |bool   |is_uni_punct_lc|UV c
+ApPR   |bool   |is_uni_xdigit_lc|UV c
+Apd    |STRLEN |is_utf8_char   |NN const U8 *p
+Apd    |bool   |is_utf8_string |NN const U8 *s|STRLEN len
+Apd    |bool   |is_utf8_string_loc|NN const U8 *s|STRLEN len|const U8 **p
+Apd    |bool   |is_utf8_string_loclen|NN const U8 *s|STRLEN len|const U8 **ep|STRLEN *el
+ApR    |bool   |is_utf8_alnum  |NN const U8 *p
+ApR    |bool   |is_utf8_alnumc |NN const U8 *p
+ApR    |bool   |is_utf8_idfirst|NN const U8 *p
+ApR    |bool   |is_utf8_idcont |NN const U8 *p
+ApR    |bool   |is_utf8_alpha  |NN const U8 *p
+ApR    |bool   |is_utf8_ascii  |NN const U8 *p
+ApR    |bool   |is_utf8_space  |NN const U8 *p
+ApR    |bool   |is_utf8_cntrl  |NN const U8 *p
+ApR    |bool   |is_utf8_digit  |NN const U8 *p
+ApR    |bool   |is_utf8_graph  |NN const U8 *p
+ApR    |bool   |is_utf8_upper  |NN const U8 *p
+ApR    |bool   |is_utf8_lower  |NN const U8 *p
+ApR    |bool   |is_utf8_print  |NN const U8 *p
+ApR    |bool   |is_utf8_punct  |NN const U8 *p
+ApR    |bool   |is_utf8_xdigit |NN const U8 *p
+ApR    |bool   |is_utf8_mark   |NN const U8 *p
+p      |OP*    |jmaybe         |NN OP* arg
+pP     |I32    |keyword        |NN const char* d|I32 len
 Ap     |void   |leave_scope    |I32 base
 p      |void   |lex_end
 p      |void   |lex_start      |SV* line
@@ -371,12 +382,12 @@ p |OP*    |listkids       |OP* o
 Apd    |void   |load_module|U32 flags|SV* name|SV* ver|...
 Ap     |void   |vload_module|U32 flags|SV* name|SV* ver|va_list* args
 p      |OP*    |localize       |OP* arg|I32 lexical
-Apd    |I32    |looks_like_number|SV* sv
-Apd    |UV     |grok_bin       |char* start|STRLEN* len|I32* flags|NV *result
-Apd    |UV     |grok_hex       |char* start|STRLEN* len|I32* flags|NV *result
-Apd    |int    |grok_number    |const char *pv|STRLEN len|UV *valuep
-Apd    |bool   |grok_numeric_radix|const char **sp|const char *send
-Apd    |UV     |grok_oct       |char* start|STRLEN* len|I32* flags|NV *result
+ApdR   |I32    |looks_like_number|NN SV* sv
+Apd    |UV     |grok_bin       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NV *result
+Apd    |UV     |grok_hex       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NV *result
+Apd    |int    |grok_number    |NN const char *pv|STRLEN len|UV *valuep
+ApdR   |bool   |grok_numeric_radix|const char **sp|const char *send
+Apd    |UV     |grok_oct       |const char* start|STRLEN* len_p|I32* flags|NV *result
 p      |int    |magic_clearenv |SV* sv|MAGIC* mg
 p      |int    |magic_clear_all_env|SV* sv|MAGIC* mg
 p      |int    |magic_clearpack|SV* sv|MAGIC* mg
@@ -400,15 +411,13 @@ p |U32    |magic_len      |SV* sv|MAGIC* mg
 p      |int    |magic_nextpack |SV* sv|MAGIC* mg|SV* key
 p      |U32    |magic_regdata_cnt|SV* sv|MAGIC* mg
 p      |int    |magic_regdatum_get|SV* sv|MAGIC* mg
-p      |int    |magic_regdatum_set|SV* sv|MAGIC* mg
+pr     |int    |magic_regdatum_set|SV* sv|MAGIC* mg
 p      |int    |magic_set      |SV* sv|MAGIC* mg
 p      |int    |magic_setamagic|SV* sv|MAGIC* mg
 p      |int    |magic_setarylen|SV* sv|MAGIC* mg
+p      |int    |magic_freearylen_p|SV* sv|MAGIC* mg
 p      |int    |magic_setbm    |SV* sv|MAGIC* mg
 p      |int    |magic_setdbline|SV* sv|MAGIC* mg
-#if defined(USE_LOCALE_COLLATE)
-p      |int    |magic_setcollxfrm|SV* sv|MAGIC* mg
-#endif
 p      |int    |magic_setdefelem|SV* sv|MAGIC* mg
 p      |int    |magic_setenv   |SV* sv|MAGIC* mg
 p      |int    |magic_setfm    |SV* sv|MAGIC* mg
@@ -428,9 +437,10 @@ p  |int    |magic_setutf8  |SV* sv|MAGIC* mg
 p      |int    |magic_set_all_env|SV* sv|MAGIC* mg
 p      |U32    |magic_sizepack |SV* sv|MAGIC* mg
 p      |int    |magic_wipepack |SV* sv|MAGIC* mg
-p      |void   |magicname      |char* sym|char* name|I32 namlen
+p      |void   |magicname      |const char* sym|const char* name|I32 namlen
 Ap     |void   |markstack_grow
 #if defined(USE_LOCALE_COLLATE)
+p      |int    |magic_setcollxfrm|SV* sv|MAGIC* mg
 p      |char*  |mem_collxfrm   |const char* s|STRLEN len|STRLEN* xlen
 #endif
 Afp    |SV*    |mess           |const char* pat|...
@@ -439,7 +449,8 @@ p   |void   |qerror         |SV* err
 Apd     |void   |sortsv         |SV ** array|size_t num_elts|SVCOMPARE_t cmp
 Apd    |int    |mg_clear       |SV* sv
 Apd    |int    |mg_copy        |SV* sv|SV* nsv|const char* key|I32 klen
-Apd    |MAGIC* |mg_find        |SV* sv|int type
+pd     |void   |mg_localize    |SV* sv|SV* nsv
+Apd    |MAGIC* |mg_find        |const SV* sv|int type
 Apd    |int    |mg_free        |SV* sv
 Apd    |int    |mg_get         |SV* sv
 Apd    |U32    |mg_length      |SV* sv
@@ -450,13 +461,13 @@ Ap        |void   |mini_mktime    |struct tm *pm
 p      |OP*    |mod            |OP* o|I32 type
 p      |int    |mode_from_discipline|SV* discp
 Ap     |char*  |moreswitches   |char* s
-p      |OP*    |my             |OP* o
-Ap     |NV     |my_atof        |const char *s
+p      |OP*    |my             |NN OP* o
+Ap     |NV     |my_atof        |NN const char *s
 #if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
-Anp    |char*  |my_bcopy       |const char* from|char* to|I32 len
+Anp    |char*  |my_bcopy       |NN const char* from|NN char* to|I32 len
 #endif
 #if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
-Anp    |char*  |my_bzero       |char* loc|I32 len
+Anp    |char*  |my_bzero       |NN char* loc|I32 len
 #endif
 Apr    |void   |my_exit        |U32 status
 Apr    |void   |my_failure_exit
@@ -466,98 +477,99 @@ Anp       |void   |atfork_lock
 Anp    |void   |atfork_unlock
 Ap     |I32    |my_lstat
 #if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
-Anp    |I32    |my_memcmp      |const char* s1|const char* s2|I32 len
+AnpP   |I32    |my_memcmp      |NN const char* s1|NN const char* s2|I32 len
 #endif
 #if !defined(HAS_MEMSET)
-Anp    |void*  |my_memset      |char* loc|I32 ch|I32 len
+Anp    |void*  |my_memset      |NN char* loc|I32 ch|I32 len
 #endif
 Ap     |I32    |my_pclose      |PerlIO* ptr
 Ap     |PerlIO*|my_popen       |char* cmd|char* mode
 Ap     |PerlIO*|my_popen_list  |char* mode|int n|SV ** args
-Ap     |void   |my_setenv      |char* nam|char* val
+Ap     |void   |my_setenv      |const char* nam|const char* val
 Ap     |I32    |my_stat
-Ap     |char * |my_strftime    |char *fmt|int sec|int min|int hour|int mday|int mon|int year|int wday|int yday|int isdst
+Ap     |char * |my_strftime    |const char *fmt|int sec|int min|int hour|int mday|int mon|int year|int wday|int yday|int isdst
 #if defined(MYSWAP)
-Ap     |short  |my_swap        |short s
-Ap     |long   |my_htonl       |long l
-Ap     |long   |my_ntohl       |long l
+ApPa   |short  |my_swap        |short s
+ApPa   |long   |my_htonl       |long l
+ApPa   |long   |my_ntohl       |long l
 #endif
 p      |void   |my_unexec
-Ap     |OP*    |newANONLIST    |OP* o
-Ap     |OP*    |newANONHASH    |OP* o
+Apa    |OP*    |newANONLIST    |OP* o
+Apa    |OP*    |newANONHASH    |OP* o
 Ap     |OP*    |newANONSUB     |I32 floor|OP* proto|OP* block
-Ap     |OP*    |newASSIGNOP    |I32 flags|OP* left|I32 optype|OP* right
-Ap     |OP*    |newCONDOP      |I32 flags|OP* expr|OP* trueop|OP* falseop
-Apd    |CV*    |newCONSTSUB    |HV* stash|char* name|SV* sv
+Apa    |OP*    |newASSIGNOP    |I32 flags|OP* left|I32 optype|OP* right
+Apa    |OP*    |newCONDOP      |I32 flags|OP* expr|OP* trueop|OP* falseop
+Apd    |CV*    |newCONSTSUB    |HV* stash|const char* name|SV* sv
 Ap     |void   |newFORM        |I32 floor|OP* o|OP* block
-Ap     |OP*    |newFOROP       |I32 flags|char* label|line_t forline \
+Apa    |OP*    |newFOROP       |I32 flags|char* label|line_t forline \
                                |OP* sclr|OP* expr|OP*block|OP*cont
-Ap     |OP*    |newLOGOP       |I32 optype|I32 flags|OP* left|OP* right
-Ap     |OP*    |newLOOPEX      |I32 type|OP* label
-Ap     |OP*    |newLOOPOP      |I32 flags|I32 debuggable|OP* expr|OP* block
-Ap     |OP*    |newNULLLIST
-Ap     |OP*    |newOP          |I32 optype|I32 flags
-Ap     |void   |newPROG        |OP* o
-Ap     |OP*    |newRANGE       |I32 flags|OP* left|OP* right
-Ap     |OP*    |newSLICEOP     |I32 flags|OP* subscript|OP* listop
-Ap     |OP*    |newSTATEOP     |I32 flags|char* label|OP* o
+Apa    |OP*    |newLOGOP       |I32 optype|I32 flags|OP* left|OP* right
+Apa    |OP*    |newLOOPEX      |I32 type|OP* label
+Apa    |OP*    |newLOOPOP      |I32 flags|I32 debuggable|OP* expr|OP* block
+Apa    |OP*    |newNULLLIST
+Apa    |OP*    |newOP          |I32 optype|I32 flags
+Ap     |void   |newPROG        |NN OP* o
+Apa    |OP*    |newRANGE       |I32 flags|OP* left|OP* right
+Apa    |OP*    |newSLICEOP     |I32 flags|OP* subscript|OP* listop
+Apa    |OP*    |newSTATEOP     |I32 flags|char* label|OP* o
 Ap     |CV*    |newSUB         |I32 floor|OP* o|OP* proto|OP* block
-Apd    |CV*    |newXS          |char* name|XSUBADDR_t f|char* filename
-Apd    |AV*    |newAV
-Ap     |OP*    |newAVREF       |OP* o
-Ap     |OP*    |newBINOP       |I32 type|I32 flags|OP* first|OP* last
-Ap     |OP*    |newCVREF       |I32 flags|OP* o
-Ap     |OP*    |newGVOP        |I32 type|I32 flags|GV* gv
-Ap     |GV*    |newGVgen       |char* pack
-Ap     |OP*    |newGVREF       |I32 type|OP* o
-Ap     |OP*    |newHVREF       |OP* o
-Apd    |HV*    |newHV
-Ap     |HV*    |newHVhv        |HV* hv
-Ap     |IO*    |newIO
-Ap     |OP*    |newLISTOP      |I32 type|I32 flags|OP* first|OP* last
-Ap     |OP*    |newPADOP       |I32 type|I32 flags|SV* sv
-Ap     |OP*    |newPMOP        |I32 type|I32 flags
-Ap     |OP*    |newPVOP        |I32 type|I32 flags|char* pv
-Ap     |SV*    |newRV          |SV* pref
-Apd    |SV*    |newRV_noinc    |SV *sv
-Apd    |SV*    |newSV          |STRLEN len
-Ap     |OP*    |newSVREF       |OP* o
-Ap     |OP*    |newSVOP        |I32 type|I32 flags|SV* sv
-Apd    |SV*    |newSViv        |IV i
-Apd    |SV*    |newSVuv        |UV u
-Apd    |SV*    |newSVnv        |NV n
-Apd    |SV*    |newSVpv        |const char* s|STRLEN len
-Apd    |SV*    |newSVpvn       |const char* s|STRLEN len
-Apd    |SV*    |newSVpvn_share |const char* s|I32 len|U32 hash
-Afpd   |SV*    |newSVpvf       |const char* pat|...
+Apd    |CV*    |newXS          |NN const char* name|XSUBADDR_t f|NN const char* filename
+Apda   |AV*    |newAV
+Apa    |OP*    |newAVREF       |NN OP* o
+Apa    |OP*    |newBINOP       |I32 type|I32 flags|OP* first|OP* last
+Apa    |OP*    |newCVREF       |I32 flags|OP* o
+Apa    |OP*    |newGVOP        |I32 type|I32 flags|GV* gv
+Apa    |GV*    |newGVgen       |const char* pack
+Apa    |OP*    |newGVREF       |I32 type|OP* o
+ApaR   |OP*    |newHVREF       |NN OP* o
+ApdaR  |HV*    |newHV
+ApaR   |HV*    |newHVhv        |HV* hv
+Apa    |IO*    |newIO
+Apa    |OP*    |newLISTOP      |I32 type|I32 flags|OP* first|OP* last
+Apa    |OP*    |newPADOP       |I32 type|I32 flags|SV* sv
+Apa    |OP*    |newPMOP        |I32 type|I32 flags
+Apa    |OP*    |newPVOP        |I32 type|I32 flags|char* pv
+Apa    |SV*    |newRV          |NN SV* pref
+Apda   |SV*    |newRV_noinc    |NN SV *sv
+Apda   |SV*    |newSV          |STRLEN len
+Apa    |OP*    |newSVREF       |NN OP* o
+Apa    |OP*    |newSVOP        |I32 type|I32 flags|NN SV* sv
+Apda   |SV*    |newSViv        |IV i
+Apda   |SV*    |newSVuv        |UV u
+Apda   |SV*    |newSVnv        |NV n
+Apda   |SV*    |newSVpv        |const char* s|STRLEN len
+Apda   |SV*    |newSVpvn       |const char* s|STRLEN len
+Apda   |SV*    |newSVhek       |const HEK *hek
+Apda   |SV*    |newSVpvn_share |const char* s|I32 len|U32 hash
+Afpda  |SV*    |newSVpvf       |const char* pat|...
 Ap     |SV*    |vnewSVpvf      |const char* pat|va_list* args
-Apd    |SV*    |newSVrv        |SV* rv|const char* classname
-Apd    |SV*    |newSVsv        |SV* old
-Ap     |OP*    |newUNOP        |I32 type|I32 flags|OP* first
-Ap     |OP*    |newWHILEOP     |I32 flags|I32 debuggable|LOOP* loop \
-                               |I32 whileline|OP* expr|OP* block|OP* cont
-
-Ap     |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
-Ap     |char*  |scan_vstring   |char *vstr|SV *sv
-Apd    |char*  |scan_version   |char *vstr|SV *sv|bool qv
+Apda   |SV*    |newSVrv        |NN SV* rv|NULLOK const char* classname
+Apda   |SV*    |newSVsv        |NULLOK SV* old
+Apa    |OP*    |newUNOP        |I32 type|I32 flags|OP* first
+Apa    |OP*    |newWHILEOP     |I32 flags|I32 debuggable|LOOP* loop \
+                               |I32 whileline|OP* expr|OP* block|OP* cont \
+                               |I32 has_my
+Apa    |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
+Ap     |char*  |scan_vstring   |NN const char *vstr|NN SV *sv
+Apd    |const char*    |scan_version   |NN const char *vstr|NN SV *sv|bool qv
 Apd    |SV*    |new_version    |SV *ver
 Apd    |SV*    |upg_version    |SV *ver
 Apd    |SV*    |vnumify        |SV *vs
 Apd    |SV*    |vnormal        |SV *vs
 Apd    |SV*    |vstringify     |SV *vs
-Apd    |int    |vcmp           |SV *lvs|SV *rvs
+Apd    |int    |vcmp           |NN SV *lvs|NN SV *rvs
 p      |PerlIO*|nextargv       |GV* gv
-Ap     |char*  |ninstr         |const char* big|const char* bigend \
+ApP    |char*  |ninstr         |const char* big|const char* bigend \
                                |const char* little|const char* lend
-p      |OP*    |oopsCV         |OP* o
+pr     |OP*    |oopsCV         |OP* o
 Ap     |void   |op_free        |OP* arg
 p      |void   |package        |OP* o
 pd     |PADOFFSET|pad_alloc    |I32 optype|U32 tmptype
-p      |PADOFFSET|allocmy      |char* name
-pd     |PADOFFSET|pad_findmy   |char* name
+p      |PADOFFSET|allocmy      |NN char* name
+pd     |PADOFFSET|pad_findmy   |NN const char* name
 Ap     |PADOFFSET|find_rundefsvoffset  |
-p      |OP*    |oopsAV         |OP* o
-p      |OP*    |oopsHV         |OP* o
+pR     |OP*    |oopsAV         |NN OP* o
+pR     |OP*    |oopsHV         |NN OP* o
 pd     |void   |pad_leavemy
 Apd    |SV*    |pad_sv         |PADOFFSET po
 pd     |void   |pad_free       |PADOFFSET po
@@ -572,72 +584,73 @@ Ap        |void   |reentrant_free
 Anp    |void*  |reentrant_retry|const char*|...
 #endif
 Ap     |void   |call_atexit    |ATEXIT_t fn|void *ptr
-Apd    |I32    |call_argv      |const char* sub_name|I32 flags|char** argv
-Apd    |I32    |call_method    |const char* methname|I32 flags
-Apd    |I32    |call_pv        |const char* sub_name|I32 flags
+Apd    |I32    |call_argv      |NN const char* sub_name|I32 flags|NN char** argv
+Apd    |I32    |call_method    |NN const char* methname|I32 flags
+Apd    |I32    |call_pv        |NN const char* sub_name|I32 flags
 Apd    |I32    |call_sv        |SV* sv|I32 flags
 Ap     |void   |despatch_signals
-Apd    |SV*    |eval_pv        |const char* p|I32 croak_on_error
-Apd    |I32    |eval_sv        |SV* sv|I32 flags
-Apd    |SV*    |get_sv         |const char* name|I32 create
-Apd    |AV*    |get_av         |const char* name|I32 create
+Apd    |SV*    |eval_pv        |NN const char* p|I32 croak_on_error
+Apd    |I32    |eval_sv        |NN SV* sv|I32 flags
+Apd    |SV*    |get_sv         |NN const char* name|I32 create
+Apd    |AV*    |get_av         |NN const char* name|I32 create
 Apd    |HV*    |get_hv         |const char* name|I32 create
 Apd    |CV*    |get_cv         |const char* name|I32 create
 Ap     |int    |init_i18nl10n  |int printwarn
 Ap     |int    |init_i18nl14n  |int printwarn
-Ap     |void   |new_collate    |char* newcoll
-Ap     |void   |new_ctype      |char* newctype
-Ap     |void   |new_numeric    |char* newcoll
+Ap     |void   |new_collate    |NN char* newcoll
+Ap     |void   |new_ctype      |NN char* newctype
+Ap     |void   |new_numeric    |NN char* newcoll
 Ap     |void   |set_numeric_local
 Ap     |void   |set_numeric_radix
 Ap     |void   |set_numeric_standard
-Apd    |void   |require_pv     |const char* pv
-Apd    |void   |pack_cat       |SV *cat|char *pat|char *patend|SV **beglist|SV **endlist|SV ***next_in_list|U32 flags
-Apd    |void   |packlist       |SV *cat|char *pat|char *patend|SV **beglist|SV **endlist
+Apd    |void   |require_pv     |NN const char* pv
+Apd    |void   |pack_cat       |SV *cat|const char *pat|const char *patend|SV **beglist|SV **endlist|SV ***next_in_list|U32 flags
+Apd    |void   |packlist       |SV *cat|const char *pat|const char *patend|SV **beglist|SV **endlist
 p      |void   |pidgone        |Pid_t pid|int status
-Ap     |void   |pmflag         |U32* pmfl|int ch
-p      |OP*    |pmruntime      |OP* pm|OP* expr|bool isreg
-p      |OP*    |pmtrans        |OP* o|OP* expr|OP* repl
+Ap     |void   |pmflag         |NN U32* pmfl|int ch
+p      |OP*    |pmruntime      |NN OP* pm|NN OP* expr|bool isreg
+p      |OP*    |pmtrans        |NN OP* o|NN OP* expr|OP* repl
 Ap     |void   |pop_scope
 p      |OP*    |prepend_elem   |I32 optype|OP* head|OP* tail
 Ap     |void   |push_scope
 p      |OP*    |ref            |OP* o|I32 type
 p      |OP*    |refkids        |OP* o|I32 type
-Ap     |void   |regdump        |regexp* r
-Ap     |SV*    |regclass_swash |struct regnode *n|bool doinit|SV **listsvp|SV **altsvp
-Ap     |I32    |pregexec       |regexp* prog|char* stringarg \
-                               |char* strend|char* strbeg|I32 minend \
-                               |SV* screamer|U32 nosave
+Ap     |void   |regdump        |NN regexp* r
+Ap     |SV*    |regclass_swash |const struct regnode *n|bool doinit|SV **listsvp|SV **altsvp
+Ap     |I32    |pregexec       |NN regexp* prog|NN char* stringarg \
+                               |NN char* strend|NN char* strbeg|I32 minend \
+                               |NN SV* screamer|U32 nosave
 Ap     |void   |pregfree       |struct regexp* r
-Ap     |regexp*|pregcomp       |char* exp|char* xend|PMOP* pm
+Ap     |regexp*|pregcomp       |NN char* exp|NN char* xend|NN PMOP* pm
 Ap     |char*  |re_intuit_start|regexp* prog|SV* sv|char* strpos \
                                |char* strend|U32 flags \
                                |struct re_scream_pos_data_s *data
 Ap     |SV*    |re_intuit_string|regexp* prog
-Ap     |I32    |regexec_flags  |regexp* prog|char* stringarg \
-                               |char* strend|char* strbeg|I32 minend \
+Ap     |I32    |regexec_flags  |NN regexp* prog|NN char* stringarg \
+                               |NN char* strend|NN char* strbeg|I32 minend \
                                |SV* screamer|void* data|U32 flags
-Ap     |regnode*|regnext       |regnode* p
-Ep     |void   |regprop        |SV* sv|regnode* o
-Ap     |void   |repeatcpy      |char* to|const char* from|I32 len|I32 count
-Ap     |char*  |rninstr        |const char* big|const char* bigend \
-                               |const char* little|const char* lend
+ApR    |regnode*|regnext       |NN regnode* p
+Ep     |void   |regprop        |SV* sv|const regnode* o
+Ap     |void   |repeatcpy      |NN char* to|NN const char* from|I32 len|I32 count
+ApP    |char*  |rninstr        |NN const char* big|NN const char* bigend \
+                               |NN const char* little|NN const char* lend
 Ap     |Sighandler_t|rsignal   |int i|Sighandler_t t
 p      |int    |rsignal_restore|int i|Sigsave_t* t
 p      |int    |rsignal_save   |int i|Sighandler_t t1|Sigsave_t* t2
 Ap     |Sighandler_t|rsignal_state|int i
-p      |void   |rxres_free     |void** rsp
-p      |void   |rxres_restore  |void** rsp|REGEXP* prx
-p      |void   |rxres_save     |void** rsp|REGEXP* prx
+p      |void   |rxres_free     |NN void** rsp
+p      |void   |rxres_restore  |NN void** rsp|NN REGEXP* prx
+p      |void   |rxres_save     |NN void** rsp|NN REGEXP* prx
 #if !defined(HAS_RENAME)
-p      |I32    |same_dirent    |char* a|char* b
+p      |I32    |same_dirent    |NN const char* a|NN const char* b
 #endif
-Apd    |char*  |savepv         |const char* pv
-Apd    |char*  |savesharedpv   |const char* pv
-Apd    |char*  |savepvn        |const char* pv|I32 len
+Apda   |char*  |savepv         |NN const char* pv
+Apda   |char*  |savepvn        |NN const char* pv|I32 len
+Apda   |char*  |savesharedpv   |const char* pv
+Apda   |char*  |savesvpv       |NN SV* sv
 Ap     |void   |savestack_grow
 Ap     |void   |savestack_grow_cnt     |I32 need
-Ap     |void   |save_aelem     |AV* av|I32 idx|SV **sptr
+Ap     |void   |save_aelem     |const AV* av|I32 idx|SV **sptr
 Ap     |I32    |save_alloc     |I32 size|I32 pad
 Ap     |void   |save_aptr      |AV** aptr
 Ap     |AV*    |save_ary       |GV* gv
@@ -655,7 +668,7 @@ Ap  |void   |save_shared_pvref|char** str
 Ap     |void   |save_gp        |GV* gv|I32 empty
 Ap     |HV*    |save_hash      |GV* gv
 Ap     |void   |save_helem     |HV* hv|SV *key|SV **sptr
-Ap     |void   |save_hints
+Apr    |void   |save_hints
 Ap     |void   |save_hptr      |HV** hptr
 Ap     |void   |save_I16       |I16* intp
 Ap     |void   |save_I32       |I32* intp
@@ -675,201 +688,201 @@ Ap      |void   |save_re_context
 Ap     |void   |save_padsv     |PADOFFSET off
 Ap     |void   |save_sptr      |SV** sptr
 Ap     |SV*    |save_svref     |SV** sptr
-Ap     |SV**   |save_threadsv  |PADOFFSET i
+Apr    |SV**   |save_threadsv  |PADOFFSET i
 p      |OP*    |sawparens      |OP* o
 p      |OP*    |scalar         |OP* o
 p      |OP*    |scalarkids     |OP* o
 p      |OP*    |scalarseq      |OP* o
 p      |OP*    |scalarvoid     |OP* o
-Apd    |NV     |scan_bin       |char* start|STRLEN len|STRLEN* retlen
-Apd    |NV     |scan_hex       |char* start|STRLEN len|STRLEN* retlen
-Ap     |char*  |scan_num       |char* s|YYSTYPE *lvalp
-Apd    |NV     |scan_oct       |char* start|STRLEN len|STRLEN* retlen
+Apd    |NV     |scan_bin       |const char* start|STRLEN len|STRLEN* retlen
+Apd    |NV     |scan_hex       |const char* start|STRLEN len|STRLEN* retlen
+Ap     |char*  |scan_num       |const char* s|YYSTYPE *lvalp
+Apd    |NV     |scan_oct       |const char* start|STRLEN len|STRLEN* retlen
 p      |OP*    |scope          |OP* o
 Ap     |char*  |screaminstr    |SV* bigsv|SV* littlesv|I32 start_shift \
                                |I32 end_shift|I32 *state|I32 last
 #if !defined(VMS)
-p      |I32    |setenv_getix   |char* nam
+p      |I32    |setenv_getix   |const char* nam
 #endif
 p      |void   |setdefout      |GV* gv
 p      |HEK*   |share_hek      |const char* sv|I32 len|U32 hash
 np     |Signal_t |sighandler   |int sig
 Anp    |Signal_t |csighandler  |int sig
-Ap     |SV**   |stack_grow     |SV** sp|SV**p|int n
-Ap     |I32    |start_subparse |I32 is_format|U32 flags
+Ap     |SV**   |stack_grow     |NN SV** sp|NN SV**p|int n
+ApR    |I32    |start_subparse |I32 is_format|U32 flags
 p      |void   |sub_crush_depth|CV* cv
-Apd    |bool   |sv_2bool       |SV* sv
-Apd    |CV*    |sv_2cv         |SV* sv|HV** st|GV** gvp|I32 lref
-Apd    |IO*    |sv_2io         |SV* sv
-Amb    |IV     |sv_2iv         |SV* sv
-Apd    |IV     |sv_2iv_flags   |SV* sv|I32 flags
-Apd    |SV*    |sv_2mortal     |SV* sv
-Apd    |NV     |sv_2nv         |SV* sv
-Amb    |char*  |sv_2pv         |SV* sv|STRLEN* lp
-Apd    |char*  |sv_2pvutf8     |SV* sv|STRLEN* lp
-Apd    |char*  |sv_2pvbyte     |SV* sv|STRLEN* lp
-Ap     |char*  |sv_pvn_nomg    |SV* sv|STRLEN* lp
-Amb    |UV     |sv_2uv         |SV* sv
-Apd    |UV     |sv_2uv_flags   |SV* sv|I32 flags
-Apd    |IV     |sv_iv          |SV* sv
-Apd    |UV     |sv_uv          |SV* sv
-Apd    |NV     |sv_nv          |SV* sv
-Apd    |char*  |sv_pvn         |SV *sv|STRLEN *len
-Apd    |char*  |sv_pvutf8n     |SV *sv|STRLEN *len
-Apd    |char*  |sv_pvbyten     |SV *sv|STRLEN *len
-Apd    |I32    |sv_true        |SV *sv
-pd     |void   |sv_add_arena   |char* ptr|U32 size|U32 flags
-Apd    |int    |sv_backoff     |SV* sv
-Apd    |SV*    |sv_bless       |SV* sv|HV* stash
-Afpd   |void   |sv_catpvf      |SV* sv|const char* pat|...
-Apd    |void   |sv_vcatpvf     |SV* sv|const char* pat|va_list* args
-Apd    |void   |sv_catpv       |SV* sv|const char* ptr
-Amdb   |void   |sv_catpvn      |SV* sv|const char* ptr|STRLEN len
-Amdb   |void   |sv_catsv       |SV* dsv|SV* ssv
-Apd    |void   |sv_chop        |SV* sv|char* ptr
+Apd    |bool   |sv_2bool       |NN SV* sv
+Apd    |CV*    |sv_2cv         |NN SV* sv|HV** st|GV** gvp|I32 lref
+Apd    |IO*    |sv_2io         |NN SV* sv
+Amb    |IV     |sv_2iv         |NN SV* sv
+Apd    |IV     |sv_2iv_flags   |NN SV* sv|I32 flags
+Apd    |SV*    |sv_2mortal     |NN SV* sv
+Apd    |NV     |sv_2nv         |NN SV* sv
+Amb    |char*  |sv_2pv         |NN SV* sv|STRLEN* lp
+Apd    |char*  |sv_2pv_flags   |NN SV* sv|STRLEN* lp|I32 flags
+Apd    |char*  |sv_2pvutf8     |NN SV* sv|STRLEN* lp
+Apd    |char*  |sv_2pvbyte     |NN SV* sv|STRLEN* lp
+Ap     |char*  |sv_pvn_nomg    |NN SV* sv|STRLEN* lp
+Amb    |UV     |sv_2uv         |NN SV* sv
+Apd    |UV     |sv_2uv_flags   |NN SV* sv|I32 flags
+Apd    |IV     |sv_iv          |NN SV* sv
+Apd    |UV     |sv_uv          |NN SV* sv
+Apd    |NV     |sv_nv          |NN SV* sv
+Apd    |char*  |sv_pvn         |NN SV *sv|NN STRLEN *len
+Apd    |char*  |sv_pvutf8n     |NN SV *sv|NN STRLEN *len
+Apd    |char*  |sv_pvbyten     |NN SV *sv|NN STRLEN *len
+Apd    |I32    |sv_true        |NN SV *sv
+pd     |void   |sv_add_arena   |NN char* ptr|U32 size|U32 flags
+Apd    |int    |sv_backoff     |NN SV* sv
+Apd    |SV*    |sv_bless       |NN SV* sv|NN HV* stash
+Afpd   |void   |sv_catpvf      |NN SV* sv|const char* pat|...
+Apd    |void   |sv_vcatpvf     |NN SV* sv|const char* pat|va_list* args
+Apd    |void   |sv_catpv       |NN SV* sv|const char* ptr
+Amdb   |void   |sv_catpvn      |NN SV* sv|const char* ptr|STRLEN len
+Amdb   |void   |sv_catsv       |NN SV* dsv|SV* ssv
+Apd    |void   |sv_chop        |NN SV* sv|const char* ptr
 pd     |I32    |sv_clean_all
 pd     |void   |sv_clean_objs
-Apd    |void   |sv_clear       |SV* sv
-Apd    |I32    |sv_cmp         |SV* sv1|SV* sv2
-Apd    |I32    |sv_cmp_locale  |SV* sv1|SV* sv2
+Apd    |void   |sv_clear       |NN SV* sv
+Apd    |I32    |sv_cmp         |NN SV* sv1|NN SV* sv2
+Apd    |I32    |sv_cmp_locale  |NN SV* sv1|NN SV* sv2
 #if defined(USE_LOCALE_COLLATE)
-Apd    |char*  |sv_collxfrm    |SV* sv|STRLEN* nxp
-#endif
-Ap     |OP*    |sv_compile_2op |SV* sv|OP** startp|char* code|PAD** padp
-Apd    |int    |getcwd_sv      |SV* sv
-Apd    |void   |sv_dec         |SV* sv
-Ap     |void   |sv_dump        |SV* sv
-Apd    |bool   |sv_derived_from|SV* sv|const char* name
-Apd    |I32    |sv_eq          |SV* sv1|SV* sv2
+Apd    |char*  |sv_collxfrm    |NN SV* sv|NN STRLEN* nxp
+#endif
+Ap     |OP*    |sv_compile_2op |NN SV* sv|NN OP** startp|NN const char* code|NN PAD** padp
+Apd    |int    |getcwd_sv      |NN SV* sv
+Apd    |void   |sv_dec         |NN SV* sv
+Ap     |void   |sv_dump        |NN SV* sv
+ApdR   |bool   |sv_derived_from|NN SV* sv|NN const char* name
+Apd    |I32    |sv_eq          |NN SV* sv1|NN SV* sv2
 Apd    |void   |sv_free        |SV* sv
-poMX   |void   |sv_free2       |SV* sv
+poMX   |void   |sv_free2       |NN SV* sv
 pd     |void   |sv_free_arenas
-Apd    |char*  |sv_gets        |SV* sv|PerlIO* fp|I32 append
-Apd    |char*  |sv_grow        |SV* sv|STRLEN newlen
-Apd    |void   |sv_inc         |SV* sv
-Apd    |void   |sv_insert      |SV* bigsv|STRLEN offset|STRLEN len \
-                               |char* little|STRLEN littlelen
-Apd    |int    |sv_isa         |SV* sv|const char* name
-Apd    |int    |sv_isobject    |SV* sv
-Apd    |STRLEN |sv_len         |SV* sv
-Apd    |STRLEN |sv_len_utf8    |SV* sv
-Apd    |void   |sv_magic       |SV* sv|SV* obj|int how|const char* name \
+Apd    |char*  |sv_gets        |NN SV* sv|NN PerlIO* fp|I32 append
+Apd    |char*  |sv_grow        |NN SV* sv|STRLEN newlen
+Apd    |void   |sv_inc         |NN SV* sv
+Apd    |void   |sv_insert      |NN SV* bigsv|STRLEN offset|STRLEN len \
+                               |NN const char* little|STRLEN littlelen
+Apd    |int    |sv_isa         |NN SV* sv|const char* name
+Apd    |int    |sv_isobject    |NN SV* sv
+Apd    |STRLEN |sv_len         |NN SV* sv
+Apd    |STRLEN |sv_len_utf8    |NN SV* sv
+Apd    |void   |sv_magic       |NN SV* sv|SV* obj|int how|const char* name \
                                |I32 namlen
-Apd    |MAGIC *|sv_magicext    |SV* sv|SV* obj|int how|MGVTBL *vtbl \
+Apd    |MAGIC *|sv_magicext    |NN SV* sv|SV* obj|int how|const MGVTBL *vtbl \
                                |const char* name|I32 namlen
-Apd    |SV*    |sv_mortalcopy  |SV* oldsv
-Apd    |SV*    |sv_newmortal
-Apd    |SV*    |sv_newref      |SV* sv
+ApdaR  |SV*    |sv_mortalcopy  |NULLOK SV* oldsv
+ApdR   |SV*    |sv_newmortal
+Apd    |SV*    |sv_newref      |NULLOK SV* sv
 Ap     |char*  |sv_peek        |SV* sv
-Apd    |void   |sv_pos_u2b     |SV* sv|I32* offsetp|I32* lenp
-Apd    |void   |sv_pos_b2u     |SV* sv|I32* offsetp
+Apd    |void   |sv_pos_u2b     |SV* sv|NN I32* offsetp|I32* lenp
+Apd    |void   |sv_pos_b2u     |SV* sv|NN I32* offsetp
 Amdb   |char*  |sv_pvn_force   |SV* sv|STRLEN* lp
 Apd    |char*  |sv_pvutf8n_force|SV* sv|STRLEN* lp
 Apd    |char*  |sv_pvbyten_force|SV* sv|STRLEN* lp
 Apd    |char*  |sv_recode_to_utf8      |SV* sv|SV *encoding
 Apd    |bool   |sv_cat_decode  |SV* dsv|SV *encoding|SV *ssv|int *offset \
                                |char* tstr|int tlen
-Apd    |char*  |sv_reftype     |SV* sv|int ob
-Apd    |void   |sv_replace     |SV* sv|SV* nsv
+ApdR   |char*  |sv_reftype     |NN const SV* sv|int ob
+Apd    |void   |sv_replace     |NN SV* sv|NN SV* nsv
 Apd    |void   |sv_report_used
-Apd    |void   |sv_reset       |char* s|HV* stash
+Apd    |void   |sv_reset       |NN const char* s|HV* stash
 Afpd   |void   |sv_setpvf      |SV* sv|const char* pat|...
 Apd    |void   |sv_vsetpvf     |SV* sv|const char* pat|va_list* args
 Apd    |void   |sv_setiv       |SV* sv|IV num
-Apdb   |void   |sv_setpviv     |SV* sv|IV num
+Apdb   |void   |sv_setpviv     |NN SV* sv|IV num
 Apd    |void   |sv_setuv       |SV* sv|UV num
 Apd    |void   |sv_setnv       |SV* sv|NV num
 Apd    |SV*    |sv_setref_iv   |SV* rv|const char* classname|IV iv
 Apd    |SV*    |sv_setref_uv   |SV* rv|const char* classname|UV uv
 Apd    |SV*    |sv_setref_nv   |SV* rv|const char* classname|NV nv
-Apd    |SV*    |sv_setref_pv   |SV* rv|const char* classname|void* pv
-Apd    |SV*    |sv_setref_pvn  |SV* rv|const char* classname|char* pv \
-                               |STRLEN n
+Apd    |SV*    |sv_setref_pv   |SV* rv|const char* classname|NULLOK void* pv
+Apd    |SV*    |sv_setref_pvn  |SV* rv|const char* classname|NN const char* pv|STRLEN n
 Apd    |void   |sv_setpv       |SV* sv|const char* ptr
-Apd    |void   |sv_setpvn      |SV* sv|const char* ptr|STRLEN len
+Apd    |void   |sv_setpvn      |NN SV* sv|const char* ptr|STRLEN len
 Amdb   |void   |sv_setsv       |SV* dsv|SV* ssv
 Apd    |void   |sv_taint       |SV* sv
-Apd    |bool   |sv_tainted     |SV* sv
-Apd    |int    |sv_unmagic     |SV* sv|int type
-Apd    |void   |sv_unref       |SV* sv
-Apd    |void   |sv_unref_flags |SV* sv|U32 flags
-Apd    |void   |sv_untaint     |SV* sv
-Apd    |bool   |sv_upgrade     |SV* sv|U32 mt
-Apd    |void   |sv_usepvn      |SV* sv|char* ptr|STRLEN len
-Apd    |void   |sv_vcatpvfn    |SV* sv|const char* pat|STRLEN patlen \
+ApdR   |bool   |sv_tainted     |SV* sv
+Apd    |int    |sv_unmagic     |NN SV* sv|int type
+Apd    |void   |sv_unref       |NN SV* sv
+Apd    |void   |sv_unref_flags |NN SV* sv|U32 flags
+Apd    |void   |sv_untaint     |NN SV* sv
+Apd    |void   |sv_upgrade     |NN SV* sv|U32 mt
+Apd    |void   |sv_usepvn      |NN SV* sv|char* ptr|STRLEN len
+Apd    |void   |sv_vcatpvfn    |NN SV* sv|NN const char* pat|STRLEN patlen \
                                |va_list* args|SV** svargs|I32 svmax \
                                |bool *maybe_tainted
-Apd    |void   |sv_vsetpvfn    |SV* sv|const char* pat|STRLEN patlen \
+Apd    |void   |sv_vsetpvfn    |NN SV* sv|NN const char* pat|STRLEN patlen \
                                |va_list* args|SV** svargs|I32 svmax \
                                |bool *maybe_tainted
 Ap     |NV     |str_to_version |SV *sv
-Ap     |SV*    |swash_init     |char* pkg|char* name|SV* listsv \
-                               |I32 minbits|I32 none
-Ap     |UV     |swash_fetch    |SV *sv|U8 *ptr|bool do_utf8
+Ap     |SV*    |swash_init     |const char* pkg|const char* name|SV* listsv|I32 minbits|I32 none
+Ap     |UV     |swash_fetch    |SV *sv|const U8 *ptr|bool do_utf8
 Ap     |void   |taint_env
 Ap     |void   |taint_proper   |const char* f|const char* s
-Apd    |UV     |to_utf8_case   |U8 *p|U8* ustrp|STRLEN *lenp \
-                               |SV **swash|char *normal|char *special
-Apd    |UV     |to_utf8_lower  |U8 *p|U8* ustrp|STRLEN *lenp
-Apd    |UV     |to_utf8_upper  |U8 *p|U8* ustrp|STRLEN *lenp
-Apd    |UV     |to_utf8_title  |U8 *p|U8* ustrp|STRLEN *lenp
-Apd    |UV     |to_utf8_fold   |U8 *p|U8* ustrp|STRLEN *lenp
+Apd    |UV     |to_utf8_case   |NN const U8 *p|NN U8* ustrp|STRLEN *lenp|SV **swash|const char *normal|const char *special
+Apd    |UV     |to_utf8_lower  |NN const U8 *p|NN U8* ustrp|STRLEN *lenp
+Apd    |UV     |to_utf8_upper  |NN const U8 *p|NN U8* ustrp|STRLEN *lenp
+Apd    |UV     |to_utf8_title  |NN const U8 *p|NN U8* ustrp|STRLEN *lenp
+Apd    |UV     |to_utf8_fold   |NN const U8 *p|NN U8* ustrp|STRLEN *lenp
 #if defined(UNLINK_ALL_VERSIONS)
 Ap     |I32    |unlnk          |char* f
 #endif
-Apd    |I32    |unpack_str     |char *pat|char *patend|char *s|char *strbeg|char *strend|char **new_s|I32 ocnt|U32 flags
-Apd    |I32    |unpackstring   |char *pat|char *patend|char *s|char *strend|U32 flags
+Apd    |I32    |unpack_str     |const char *pat|const char *patend|const char *s|const char *strbeg|const char *strend|char **new_s|I32 ocnt|U32 flags
+Apd    |I32    |unpackstring   |const char *pat|const char *patend|const char *s|const char *strend|U32 flags
 Ap     |void   |unsharepvn     |const char* sv|I32 len|U32 hash
 p      |void   |unshare_hek    |HEK* hek
 p      |void   |utilize        |int aver|I32 floor|OP* version|OP* idop|OP* arg
 Ap     |U8*    |utf16_to_utf8  |U8* p|U8 *d|I32 bytelen|I32 *newlen
 Ap     |U8*    |utf16_to_utf8_reversed|U8* p|U8 *d|I32 bytelen|I32 *newlen
-Adp    |STRLEN |utf8_length    |U8* s|U8 *e
-Apd    |IV     |utf8_distance  |U8 *a|U8 *b
-Apd    |U8*    |utf8_hop       |U8 *s|I32 off
-ApMd   |U8*    |utf8_to_bytes  |U8 *s|STRLEN *len
-ApMd   |U8*    |bytes_from_utf8|U8 *s|STRLEN *len|bool *is_utf8
-ApMd   |U8*    |bytes_to_utf8  |U8 *s|STRLEN *len
-Apd    |UV     |utf8_to_uvchr  |U8 *s|STRLEN* retlen
-Apd    |UV     |utf8_to_uvuni  |U8 *s|STRLEN* retlen
-Adp    |UV     |utf8n_to_uvchr |U8 *s|STRLEN curlen|STRLEN* retlen|U32 flags
-Adp    |UV     |utf8n_to_uvuni |U8 *s|STRLEN curlen|STRLEN* retlen|U32 flags
-Apd    |U8*    |uvchr_to_utf8  |U8 *d|UV uv
-Ap     |U8*    |uvuni_to_utf8  |U8 *d|UV uv
-Ap     |U8*    |uvchr_to_utf8_flags    |U8 *d|UV uv|UV flags
-Apd    |U8*    |uvuni_to_utf8_flags    |U8 *d|UV uv|UV flags
-Apd    |char*  |pv_uni_display |SV *dsv|U8 *spv|STRLEN len \
+AdpPR  |STRLEN |utf8_length    |NN const U8* s|NN const U8 *e
+ApdPR  |IV     |utf8_distance  |NN const U8 *a|NN const U8 *b
+ApdPR  |U8*    |utf8_hop       |NN const U8 *s|I32 off
+ApMd   |U8*    |utf8_to_bytes  |NN U8 *s|NN STRLEN *len
+ApMd   |U8*    |bytes_from_utf8|const U8 *s|STRLEN *len|bool *is_utf8
+ApMd   |U8*    |bytes_to_utf8  |const U8 *s|STRLEN *len
+Apd    |UV     |utf8_to_uvchr  |const U8 *s|STRLEN* retlen
+Apd    |UV     |utf8_to_uvuni  |const U8 *s|STRLEN* retlen
+Adp    |UV     |utf8n_to_uvchr |const U8 *s|STRLEN curlen|STRLEN* retlen|U32 flags
+Adp    |UV     |utf8n_to_uvuni |const U8 *s|STRLEN curlen|STRLEN* retlen|U32 flags
+Apd    |U8*    |uvchr_to_utf8  |NN U8 *d|UV uv
+Ap     |U8*    |uvuni_to_utf8  |NN U8 *d|UV uv
+Ap     |U8*    |uvchr_to_utf8_flags    |NN U8 *d|UV uv|UV flags
+Apd    |U8*    |uvuni_to_utf8_flags    |NN U8 *d|UV uv|UV flags
+Apd    |char*  |pv_uni_display |SV *dsv|const U8 *spv|STRLEN len \
                                |STRLEN pvlim|UV flags
-Apd    |char*  |sv_uni_display |SV *dsv|SV *ssv|STRLEN pvlim|UV flags
+ApdR   |char*  |sv_uni_display |SV *dsv|SV *ssv|STRLEN pvlim|UV flags
 p      |void   |vivify_defelem |SV* sv
 p      |void   |vivify_ref     |SV* sv|U32 to_what
 p      |I32    |wait4pid       |Pid_t pid|int* statusp|int flags
-p      |U32    |parse_unicode_opts|char **popt
+p      |U32    |parse_unicode_opts|const char **popt
 p      |U32    |seed
 p      |UV     |get_hash_seed
-p      |void   |report_evil_fh |GV *gv|IO *io|I32 op
+p      |void   |report_evil_fh |const GV *gv|const IO *io|I32 op
 pd     |void   |report_uninit  |SV* uninit_sv
 Afpd   |void   |warn           |const char* pat|...
 Ap     |void   |vwarn          |const char* pat|va_list* args
 Afp    |void   |warner         |U32 err|const char* pat|...
 Ap     |void   |vwarner        |U32 err|const char* pat|va_list* args
 p      |void   |watch          |char** addr
-Ap     |I32    |whichsig       |char* sig
+Ap     |I32    |whichsig       |const char* sig
 p      |void   |write_to_stderr|const char* message|int msglen
-p      |int    |yyerror        |char* s
+p      |int    |yyerror        |const char* s
 p      |int    |yylex
 p      |int    |yyparse
-p      |int    |yywarn         |char* s
+p      |int    |yywarn         |const char* s
 #if defined(MYMALLOC)
 Ap     |void   |dump_mstats    |char* s
 Ap     |int    |get_mstats     |perl_mstats_t *buf|int buflen|int level
 #endif
-Anp    |Malloc_t|safesysmalloc |MEM_SIZE nbytes
-Anp    |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
-Anp    |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
+Anpa   |Malloc_t|safesysmalloc |MEM_SIZE nbytes
+Anpa   |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
+Anpa   |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
 Anp    |Free_t |safesysfree    |Malloc_t where
 #if defined(PERL_GLOBAL_STRUCT)
 Ap     |struct perl_vars *|GetVars
+Ap     |struct perl_vars*|init_global_struct
+Ap     |void   |free_global_struct|struct perl_vars*
 #endif
 Ap     |int    |runops_standard
 Ap     |int    |runops_debug
@@ -881,7 +894,7 @@ Apd |void   |sv_catsv_mg    |SV *dstr|SV *sstr
 Afpd   |void   |sv_setpvf_mg   |SV *sv|const char* pat|...
 Apd    |void   |sv_vsetpvf_mg  |SV* sv|const char* pat|va_list* args
 Apd    |void   |sv_setiv_mg    |SV *sv|IV i
-Apdb   |void   |sv_setpviv_mg  |SV *sv|IV iv
+Apdb   |void   |sv_setpviv_mg  |NN SV *sv|IV iv
 Apd    |void   |sv_setuv_mg    |SV *sv|UV u
 Apd    |void   |sv_setnv_mg    |SV *sv|NV num
 Apd    |void   |sv_setpv_mg    |SV *sv|const char *ptr
@@ -889,21 +902,21 @@ Apd       |void   |sv_setpvn_mg   |SV *sv|const char *ptr|STRLEN len
 Apd    |void   |sv_setsv_mg    |SV *dstr|SV *sstr
 Apd    |void   |sv_usepvn_mg   |SV *sv|char *ptr|STRLEN len
 Ap     |MGVTBL*|get_vtbl       |int vtbl_id
-Ap     |char*  |pv_display     |SV *dsv|char *pv|STRLEN cur|STRLEN len \
+Ap     |char*  |pv_display     |SV *dsv|const char *pv|STRLEN cur|STRLEN len \
                                |STRLEN pvlim
-Afp    |void   |dump_indent    |I32 level|PerlIO *file|const char* pat|...
-Ap     |void   |dump_vindent   |I32 level|PerlIO *file|const char* pat \
+Afp    |void   |dump_indent    |I32 level|NN PerlIO *file|const char* pat|...
+Ap     |void   |dump_vindent   |I32 level|NN PerlIO *file|const char* pat \
                                |va_list *args
-Ap     |void   |do_gv_dump     |I32 level|PerlIO *file|char *name|GV *sv
-Ap     |void   |do_gvgv_dump   |I32 level|PerlIO *file|char *name|GV *sv
-Ap     |void   |do_hv_dump     |I32 level|PerlIO *file|char *name|HV *sv
-Ap     |void   |do_magic_dump  |I32 level|PerlIO *file|MAGIC *mg|I32 nest \
+Ap     |void   |do_gv_dump     |I32 level|NN PerlIO *file|const char *name|GV *sv
+Ap     |void   |do_gvgv_dump   |I32 level|NN PerlIO *file|const char *name|GV *sv
+Ap     |void   |do_hv_dump     |I32 level|NN PerlIO *file|const char *name|HV *sv
+Ap     |void   |do_magic_dump  |I32 level|NN PerlIO *file|const MAGIC *mg|I32 nest \
                                |I32 maxnest|bool dumpops|STRLEN pvlim
-Ap     |void   |do_op_dump     |I32 level|PerlIO *file|OP *o
-Ap     |void   |do_pmop_dump   |I32 level|PerlIO *file|PMOP *pm
-Ap     |void   |do_sv_dump     |I32 level|PerlIO *file|SV *sv|I32 nest \
+Ap     |void   |do_op_dump     |I32 level|NN PerlIO *file|const OP *o
+Ap     |void   |do_pmop_dump   |I32 level|NN PerlIO *file|const PMOP *pm
+Ap     |void   |do_sv_dump     |I32 level|NN PerlIO *file|NULLOK SV *sv|I32 nest \
                                |I32 maxnest|bool dumpops|STRLEN pvlim
-Ap     |void   |magic_dump     |MAGIC *mg
+Ap     |void   |magic_dump     |NULLOK const MAGIC *mg
 Ap     |void   |reginitcolors
 Apd    |char*  |sv_2pv_nolen   |SV* sv
 Apd    |char*  |sv_2pvutf8_nolen|SV* sv
@@ -922,39 +935,40 @@ Apd       |SV*    |sv_rvweaken    |SV *sv
 p      |int    |magic_killbackrefs|SV *sv|MAGIC *mg
 Ap     |OP*    |newANONATTRSUB |I32 floor|OP *proto|OP *attrs|OP *block
 Ap     |CV*    |newATTRSUB     |I32 floor|OP *o|OP *proto|OP *attrs|OP *block
-Ap     |void   |newMYSUB       |I32 floor|OP *o|OP *proto|OP *attrs|OP *block
-p      |OP *   |my_attrs       |OP *o|OP *attrs
+Apr    |void   |newMYSUB       |I32 floor|OP *o|OP *proto|OP *attrs|OP *block
+p      |OP *   |my_attrs       |NN OP *o|OP *attrs
 p      |void   |boot_core_xsutils
 #if defined(USE_ITHREADS)
-Ap     |PERL_CONTEXT*|cx_dup   |PERL_CONTEXT* cx|I32 ix|I32 max|CLONE_PARAMS* param
-Ap     |PERL_SI*|si_dup        |PERL_SI* si|CLONE_PARAMS* param
-Ap     |ANY*   |ss_dup         |PerlInterpreter* proto_perl|CLONE_PARAMS* param
-Ap     |void*  |any_dup        |void* v|PerlInterpreter* proto_perl
-Ap     |HE*    |he_dup         |HE* e|bool shared|CLONE_PARAMS* param
-Ap     |REGEXP*|re_dup         |REGEXP* r|CLONE_PARAMS* param
-Ap     |PerlIO*|fp_dup         |PerlIO* fp|char type|CLONE_PARAMS* param
-Ap     |DIR*   |dirp_dup       |DIR* dp
-Ap     |GP*    |gp_dup         |GP* gp|CLONE_PARAMS* param
-Ap     |MAGIC* |mg_dup         |MAGIC* mg|CLONE_PARAMS* param
-Ap     |SV*    |sv_dup         |SV* sstr|CLONE_PARAMS* param
-#if defined(HAVE_INTERP_INTERN)
-Ap     |void   |sys_intern_dup |struct interp_intern* src \
-                               |struct interp_intern* dst
-#endif
-Ap     |PTR_TBL_t*|ptr_table_new
-Ap     |void*  |ptr_table_fetch|PTR_TBL_t *tbl|void *sv
-Ap     |void   |ptr_table_store|PTR_TBL_t *tbl|void *oldsv|void *newsv
-Ap     |void   |ptr_table_split|PTR_TBL_t *tbl
+Apa    |PERL_CONTEXT*|cx_dup   |PERL_CONTEXT* cx|I32 ix|I32 max|CLONE_PARAMS* param
+Apa    |PERL_SI*|si_dup        |PERL_SI* si|CLONE_PARAMS* param
+Apa    |ANY*   |ss_dup         |NN PerlInterpreter* proto_perl|CLONE_PARAMS* param
+Apa    |void*  |any_dup        |void* v|NN const PerlInterpreter* proto_perl
+Apa    |HE*    |he_dup         |HE* e|bool shared|CLONE_PARAMS* param
+Apa    |HEK*   |hek_dup        |HEK* e|CLONE_PARAMS* param
+Apa    |REGEXP*|re_dup         |const REGEXP* r|CLONE_PARAMS* param
+Apa    |PerlIO*|fp_dup         |PerlIO* fp|char type|CLONE_PARAMS* param
+Apa    |DIR*   |dirp_dup       |DIR* dp
+Apa    |GP*    |gp_dup         |GP* gp|CLONE_PARAMS* param
+Apa    |MAGIC* |mg_dup         |NN MAGIC* mg|CLONE_PARAMS* param
+Apa    |SV*    |sv_dup         |NN SV* sstr|CLONE_PARAMS* param
+Ap     |void   |rvpv_dup       |NN SV* dstr|NN SV *sstr|CLONE_PARAMS* param
+Apa    |PTR_TBL_t*|ptr_table_new
+Apa    |void*  |ptr_table_fetch|NN PTR_TBL_t *tbl|NN const void *sv
+Ap     |void   |ptr_table_store|NN PTR_TBL_t *tbl|const void *oldsv|NN void *newsv
+Ap     |void   |ptr_table_split|NN PTR_TBL_t *tbl
 Ap     |void   |ptr_table_clear|PTR_TBL_t *tbl
 Ap     |void   |ptr_table_free|PTR_TBL_t *tbl
+#  if defined(HAVE_INTERP_INTERN)
+Ap     |void   |sys_intern_dup |NN struct interp_intern* src|NN struct interp_intern* dst
+#  endif
 #endif
 #if defined(HAVE_INTERP_INTERN)
 Ap     |void   |sys_intern_clear
 Ap     |void   |sys_intern_init
 #endif
 
-Ap     |char * |custom_op_name |OP* op
-Ap     |char * |custom_op_desc |OP* op
+ApR    |char * |custom_op_name |NN const OP* op
+ApR    |char * |custom_op_desc |NN const OP* op
 
 #if defined(PERL_COPY_ON_WRITE)
 pMX    |int    |sv_release_IVX |SV *sv
@@ -968,69 +982,112 @@ Adp      |int    |nothreadhook
 END_EXTERN_C
 
 #if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
-s      |I32    |do_trans_simple        |SV *sv
-s      |I32    |do_trans_count         |SV *sv
-s      |I32    |do_trans_complex       |SV *sv
-s      |I32    |do_trans_simple_utf8   |SV *sv
-s      |I32    |do_trans_count_utf8    |SV *sv
-s      |I32    |do_trans_complex_utf8  |SV *sv
+sR     |I32    |do_trans_simple        |NN SV *sv
+sR     |I32    |do_trans_count         |NN SV *sv
+sR     |I32    |do_trans_complex       |NN SV *sv
+sR     |I32    |do_trans_simple_utf8   |NN SV *sv
+sR     |I32    |do_trans_count_utf8    |NN SV *sv
+sR     |I32    |do_trans_complex_utf8  |NN SV *sv
 #endif
 
 #if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
-s      |void   |gv_init_sv     |GV *gv|I32 sv_type
-s      |void   |require_errno  |GV *gv
+s      |void   |gv_init_sv     |NN GV *gv|I32 sv_type
+s      |void   |require_errno  |NN GV *gv
 #endif
 
 #if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
-s      |void   |hsplit         |HV *hv
+s      |void   |hsplit         |NN HV *hv
 s      |void   |hfreeentries   |HV *hv
-s      |void   |more_he
-s      |HE*    |new_he
-s      |void   |del_he         |HE *p
-s      |HEK*   |save_hek_flags |const char *str|I32 len|U32 hash|int flags
-s      |void   |hv_magic_check |HV *hv|bool *needs_copy|bool *needs_store
-s      |void   |unshare_hek_or_pvn|HEK* hek|const char* sv|I32 len|U32 hash
-s      |HEK*   |share_hek_flags|const char* sv|I32 len|U32 hash|int flags
-s      |void   |hv_notallowed  |int flags|const char *key|I32 klen|const char *msg
+sa     |HE*    |new_he
+s      |void   |del_he         |NN HE *p
+sa     |HEK*   |save_hek_flags |NN const char *str|I32 len|U32 hash|int flags
+s      |void   |hv_magic_check |NN HV *hv|NN bool *needs_copy|NN bool *needs_store
+s      |void   |unshare_hek_or_pvn|NULLOK const HEK* hek|NULLOK const char* str|I32 len|U32 hash
+sR     |HEK*   |share_hek_flags|NN const char* sv|I32 len|U32 hash|int flags
+rs     |void   |hv_notallowed  |int flags|NN const char *key|I32 klen|NN const char *msg
+s      |struct xpvhv_aux*|hv_auxinit|NN HV *hv
+sM     |SV*    |hv_delete_common|HV* tb|SV* key_sv|const char* key|STRLEN klen|int k_flags|I32 d_flags|U32 hash
+sM     |HE*    |hv_fetch_common|HV* tb|SV* key_sv|const char* key|STRLEN klen|int flags|int action|SV* val|U32 hash
 #endif
 
 #if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
-s      |void   |save_magic     |I32 mgs_ix|SV *sv
-s      |int    |magic_methpack |SV *sv|MAGIC *mg|char *meth
-s      |int    |magic_methcall |SV *sv|MAGIC *mg|char *meth|I32 f \
+s      |void   |save_magic     |I32 mgs_ix|NN SV *sv
+s      |int    |magic_methpack |NN SV *sv|NN const MAGIC *mg|NN const char *meth
+s      |int    |magic_methcall |NN SV *sv|NN const MAGIC *mg|NN const char *meth|I32 f \
                                |int n|SV *val
 #endif
 
 #if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
-s      |I32    |list_assignment|OP *o
-s      |void   |bad_type       |I32 n|char *t|char *name|OP *kid
-s      |void   |cop_free       |COP *cop
+pR     |OP*    |ck_anoncode    |NN OP *o
+pR     |OP*    |ck_bitop       |NN OP *o
+pR     |OP*    |ck_concat      |NN OP *o
+pR     |OP*    |ck_defined     |NN OP *o
+pR     |OP*    |ck_delete      |NN OP *o
+pR     |OP*    |ck_die         |NN OP *o
+pR     |OP*    |ck_eof         |NN OP *o
+pR     |OP*    |ck_eval        |NN OP *o
+pR     |OP*    |ck_exec        |NN OP *o
+pR     |OP*    |ck_exists      |NN OP *o
+pR     |OP*    |ck_exit        |NN OP *o
+pR     |OP*    |ck_ftst        |NN OP *o
+pR     |OP*    |ck_fun         |NN OP *o
+pR     |OP*    |ck_glob        |NN OP *o
+pR     |OP*    |ck_grep        |NN OP *o
+pR     |OP*    |ck_index       |NN OP *o
+pR     |OP*    |ck_join        |NN OP *o
+pR     |OP*    |ck_lengthconst |NN OP *o
+pR     |OP*    |ck_lfun        |NN OP *o
+pR     |OP*    |ck_listiob     |NN OP *o
+pR     |OP*    |ck_match       |NN OP *o
+pR     |OP*    |ck_method      |NN OP *o
+pR     |OP*    |ck_null        |NN OP *o
+pR     |OP*    |ck_open        |NN OP *o
+pR     |OP*    |ck_repeat      |NN OP *o
+pR     |OP*    |ck_require     |NN OP *o
+pR     |OP*    |ck_retarget    |NN OP *o
+pR     |OP*    |ck_return      |NN OP *o
+pR     |OP*    |ck_rfun        |NN OP *o
+pR     |OP*    |ck_rvconst     |NN OP *o
+pR     |OP*    |ck_sassign     |NN OP *o
+pR     |OP*    |ck_select      |NN OP *o
+pR     |OP*    |ck_shift       |NN OP *o
+pR     |OP*    |ck_sort        |NN OP *o
+pR     |OP*    |ck_spair       |NN OP *o
+pR     |OP*    |ck_split       |NN OP *o
+pR     |OP*    |ck_subr        |NN OP *o
+pR     |OP*    |ck_substr      |NN OP *o
+pR     |OP*    |ck_svconst     |NN OP *o
+pR     |OP*    |ck_trunc       |NN OP *o
+pR     |OP*    |ck_unpack      |NN OP *o
+sR     |bool   |is_handle_constructor|NN const OP *o|I32 numargs
+sR     |I32    |is_list_assignment|const OP *o
+s      |void   |cop_free       |NN COP *cop
 s      |OP*    |modkids        |OP *o|I32 type
-s      |void   |no_bareword_allowed|OP *o
-s      |OP*    |no_fh_allowed  |OP *o
-s      |OP*    |scalarboolean  |OP *o
-s      |OP*    |too_few_arguments|OP *o|char* name
-s      |OP*    |too_many_arguments|OP *o|char* name
-s      |OP*    |newDEFSVOP
-s      |OP*    |new_logop      |I32 type|I32 flags|OP **firstp|OP **otherp
-s      |void   |simplify_sort  |OP *o
-s      |bool   |is_handle_constructor  |OP *o|I32 argnum
-s      |char*  |gv_ename       |GV *gv
-s      |bool   |scalar_mod_type|OP *o|I32 type
+s      |OP*    |scalarboolean  |NN OP *o
+sR     |OP*    |newDEFSVOP
+sR     |OP*    |new_logop      |I32 type|I32 flags|NN OP **firstp|NN OP **otherp
+s      |void   |simplify_sort  |NN OP *o
+s      |const char*    |gv_ename       |GV *gv
+s      |bool   |scalar_mod_type|const OP *o|I32 type
 s      |OP *   |my_kid         |OP *o|OP *attrs|OP **imopsp
 s      |OP *   |dup_attrlist   |OP *o
 s      |void   |apply_attrs    |HV *stash|SV *target|OP *attrs|bool for_my
 s      |void   |apply_attrs_my |HV *stash|OP *target|OP *attrs|OP **imopsp
+s      |void   |bad_type       |I32 n|NN const char *t|NN const char *name|NN const OP *kid
+s      |void   |no_bareword_allowed|NN const OP *o
+sR     |OP*    |no_fh_allowed|NN OP *o
+sR     |OP*    |too_few_arguments|NN OP *o|NN const char* name
+sR     |OP*    |too_many_arguments|NN OP *o|NN const char* name
 #endif
 #if defined(PL_OP_SLAB_ALLOC)
-Ap     |void*  |Slab_Alloc     |int m|size_t sz
+ApR    |void*  |Slab_Alloc     |int m|size_t sz
 Ap     |void   |Slab_Free      |void *op
 #endif
 
 #if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
 s      |void   |find_beginning
-s      |void   |forbid_setid   |char *
-s      |void   |incpush        |char *|int|int|int|int
+s      |void   |forbid_setid   |const char * s
+s      |void   |incpush        |const char *dir|bool addsubdirs|bool addoldvers|bool usesep|bool canrelocate
 s      |void   |init_interp
 s      |void   |init_ids
 s      |void   |init_lexer
@@ -1040,126 +1097,129 @@ s     |void   |init_postdump_symbols|int|char **|char **
 s      |void   |init_predump_symbols
 rs     |void   |my_exit_jump
 s      |void   |nuke_stacks
-s      |void   |open_script    |char *|bool|SV *
-s      |void   |usage          |char *
-s      |void   |validate_suid  |char *|char*
+s      |void   |open_script    |const char *scriptname|bool dosearch|SV *sv
+s      |void   |usage          |const char *name
+s      |void   |validate_suid  |const char *validarg|const char *scriptname
 #  if defined(IAMSUID)
 s      |int    |fd_on_nosuid_fs|int fd
 #  endif
 s      |void*  |parse_body     |char **env|XSINIT_t xsinit
-s      |void*  |run_body       |I32 oldscope
-s      |void   |call_body      |OP *myop|int is_eval
+rs     |void   |run_body       |I32 oldscope
+s      |void   |call_body      |const OP *myop|bool is_eval
 s      |void*  |call_list_body |CV *cv
 #endif
 
 #if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
-s      |SV*    |refto          |SV* sv
+sR     |SV*    |refto          |SV* sv
 #endif
 
 #if defined(PERL_IN_PP_PACK_C) || defined(PERL_DECL_PROT)
-s      |I32    |unpack_rec     |tempsym_t* symptr|char *s|char *strbeg|char *strend|char **new_s
-s      |SV **  |pack_rec       |SV *cat|tempsym_t* symptr|SV **beglist|SV **endlist
-s      |SV*    |mul128         |SV *sv|U8 m
-s      |I32    |measure_struct |tempsym_t* symptr
-s      |char * |group_end      |char *pat|char *patend|char ender
-s      |char * |get_num        |char *ppat|I32 *
-s      |bool   |next_symbol    |tempsym_t* symptr
-s      |void   |doencodes      |SV* sv|char* s|I32 len
-s      |SV*    |is_an_int      |char *s|STRLEN l
-s      |int    |div128         |SV *pnum|bool *done
+s      |I32    |unpack_rec     |struct tempsym* symptr|const char *s|const char *strbeg|const char *strend|const char **new_s
+s      |SV **  |pack_rec       |SV *cat|struct tempsym* symptr|SV **beglist|SV **endlist
+s      |SV*    |mul128         |NN SV *sv|U8 m
+s      |I32    |measure_struct |NN struct tempsym* symptr
+s      |bool   |next_symbol    |NN struct tempsym* symptr
+sR     |SV*    |is_an_int      |NN const char *s|STRLEN l
+s      |int    |div128         |NN SV *pnum|NN bool *done
+s      |const char *|group_end |NN const char *pat|NN const char *patend|char ender
+s      |const char *|get_num   |NN const char *ppat|NN I32 *lenptr
 #endif
 
 #if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
-s      |OP*    |docatch        |OP *o
-s      |void*  |docatch_body
-s      |OP*    |dofindlabel    |OP *o|char *label|OP **opstack|OP **oplimit
-s      |OP*    |doparseform    |SV *sv
-sn     |bool   |num_overflow   |NV value|I32 fldsize|I32 frcsize
-s      |I32    |dopoptoeval    |I32 startingblock
-s      |I32    |dopoptolabel   |char *label
-s      |I32    |dopoptoloop    |I32 startingblock
-s      |I32    |dopoptosub     |I32 startingblock
-s      |I32    |dopoptosub_at  |PERL_CONTEXT* cxstk|I32 startingblock
+sR     |OP*    |docatch        |OP *o
+s      |void   |docatch_body
+sR     |OP*    |dofindlabel    |OP *o|const char *label|OP **opstack|OP **oplimit
+sR     |OP*    |doparseform    |SV *sv
+snR    |bool   |num_overflow   |NV value|I32 fldsize|I32 frcsize
+sR     |I32    |dopoptoeval    |I32 startingblock
+sR     |I32    |dopoptolabel   |NN const char *label
+sR     |I32    |dopoptoloop    |I32 startingblock
+sR     |I32    |dopoptosub     |I32 startingblock
+sR     |I32    |dopoptosub_at  |const PERL_CONTEXT* cxstk|I32 startingblock
 s      |void   |save_lines     |AV *array|SV *sv
-s      |OP*    |doeval         |int gimme|OP** startop|CV* outside|U32 seq
-s      |PerlIO *|doopen_pm     |const char *name|const char *mode
-s      |bool   |path_is_absolute|char *name
+sR     |OP*    |doeval         |int gimme|OP** startop|CV* outside|U32 seq
+sR     |PerlIO *|doopen_pm     |const char *name|const char *mode
+sR     |bool   |path_is_absolute|NN const char *name
 #endif
 
 #if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
-s      |void   |do_oddball     |HV *hash|SV **relem|SV **firstrelem
-s      |CV*    |get_db_sub     |SV **svp|CV *cv
-s      |SV*    |method_common  |SV* meth|U32* hashp
+s      |void   |do_oddball     |NN HV *hash|NN SV **relem|NN SV **firstrelem
+sR     |CV*    |get_db_sub     |NN SV **svp|NN CV *cv
+sR     |SV*    |method_common  |NN SV* meth|U32* hashp
 #endif
 
 #if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
-s      |OP*    |doform         |CV *cv|GV *gv|OP *retop
-s      |int    |emulate_eaccess|const char* path|Mode_t mode
+s      |OP*    |doform         |NN CV *cv|NN GV *gv|NN OP *retop
+s      |int    |emulate_eaccess|NN const char* path|Mode_t mode
 #  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
-s      |int    |dooneliner     |char *cmd|char *filename
+sR     |int    |dooneliner     |NN const char *cmd|NN const char *filename
 #  endif
 #endif
 
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
-Es     |regnode*|reg           |struct RExC_state_t*|I32|I32 *
-Es     |regnode*|reganode      |struct RExC_state_t*|U8|U32
-Es     |regnode*|regatom       |struct RExC_state_t*|I32 *
-Es     |regnode*|regbranch     |struct RExC_state_t*|I32 *|I32
-Es     |void   |reguni         |struct RExC_state_t*|UV|char *|STRLEN*
-Es     |regnode*|regclass      |struct RExC_state_t*
-Es     |I32    |regcurly       |char *
-Es     |regnode*|reg_node      |struct RExC_state_t*|U8
-Es     |regnode*|regpiece      |struct RExC_state_t*|I32 *
-Es     |void   |reginsert      |struct RExC_state_t*|U8|regnode *
-Es     |void   |regoptail      |struct RExC_state_t*|regnode *|regnode *
-Es     |void   |regtail        |struct RExC_state_t*|regnode *|regnode *
-Es     |char*|regwhite |char *|char *
-Es     |char*|nextchar |struct RExC_state_t*
+Es     |regnode*|reg           |NN struct RExC_state_t *state|I32 paren|NN I32 *flagp
+Es     |regnode*|reganode      |NN struct RExC_state_t *state|U8 op|U32 arg
+Es     |regnode*|regatom       |NN struct RExC_state_t *state|NN I32 *flagp
+Es     |regnode*|regbranch     |NN struct RExC_state_t *state|NN I32 *flagp|I32 first
+Es     |void   |reguni         |NN const struct RExC_state_t *state|UV uv|NN char *s|NN STRLEN *lenp
+Es     |regnode*|regclass      |NN struct RExC_state_t *state
+ERs    |I32    |regcurly       |NN const char *
+Es     |regnode*|reg_node      |NN struct RExC_state_t *state|U8 op
+Es     |regnode*|regpiece      |NN struct RExC_state_t *state|NN I32 *flagp
+Es     |void   |reginsert      |NN struct RExC_state_t *state|U8 op|NN regnode *opnd
+Es     |void   |regoptail      |NN struct RExC_state_t *state|NN regnode *p|NN regnode *val
+Es     |void   |regtail        |NN struct RExC_state_t *state|NN regnode *p|NN regnode *val
+Es     |char*  |regwhite       |NN char *p|NN const char *e
+Es     |char*  |nextchar       |NN struct RExC_state_t*
 #  ifdef DEBUGGING
 Es     |regnode*|dumpuntil     |regnode *start|regnode *node \
                                |regnode *last|SV* sv|I32 l
-Es     |void   |put_byte       |SV* sv|int c
+Es     |void   |put_byte       |NN SV* sv|int c
 #  endif
 Es     |void   |scan_commit    |struct RExC_state_t*|struct scan_data_t *data
-Es     |void   |cl_anything    |struct RExC_state_t*|struct regnode_charclass_class *cl
-Es     |int    |cl_is_anything |struct regnode_charclass_class *cl
-Es     |void   |cl_init        |struct RExC_state_t*|struct regnode_charclass_class *cl
-Es     |void   |cl_init_zero   |struct RExC_state_t*|struct regnode_charclass_class *cl
-Es     |void   |cl_and         |struct regnode_charclass_class *cl \
-                               |struct regnode_charclass_class *and_with
-Es     |void   |cl_or          |struct RExC_state_t*|struct regnode_charclass_class *cl \
-                               |struct regnode_charclass_class *or_with
+Es     |void   |cl_anything    |NN struct RExC_state_t*|NN struct regnode_charclass_class *cl
+Es     |int    |cl_is_anything |NN const struct regnode_charclass_class *cl
+Es     |void   |cl_init        |NN struct RExC_state_t*|NN struct regnode_charclass_class *cl
+Es     |void   |cl_init_zero   |NN struct RExC_state_t*|NN struct regnode_charclass_class *cl
+Es     |void   |cl_and         |NN struct regnode_charclass_class *cl \
+                               |const struct regnode_charclass_class *and_with
+Es     |void   |cl_or          |NN struct RExC_state_t*|NN struct regnode_charclass_class *cl \
+                               |NN const struct regnode_charclass_class *or_with
 Es     |I32    |study_chunk    |struct RExC_state_t*|regnode **scanp|I32 *deltap \
                                |regnode *last|struct scan_data_t *data \
-                               |U32 flags
-Es     |I32    |add_data       |struct RExC_state_t*|I32 n|char *s
-rs     |void|re_croak2 |const char* pat1|const char* pat2|...
+                               |U32 flags|U32 depth
+Es     |I32    |add_data       |struct RExC_state_t*|I32 n|const char *s
+rs     |void   |re_croak2      |const char* pat1|const char* pat2|...
 Es     |I32    |regpposixcc    |struct RExC_state_t*|I32 value
 Es     |void   |checkposixcc   |struct RExC_state_t*
+
+Es     |I32    |make_trie      |struct RExC_state_t*|regnode *startbranch \
+                               |regnode *first|regnode *last|regnode *tail \
+                               |U32 flags
 #endif
 
 #if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
-Es     |I32    |regmatch       |regnode *prog
-Es     |I32    |regrepeat      |regnode *p|I32 max
-Es     |I32    |regrepeat_hard |regnode *p|I32 max|I32 *lp
-E    |I32    |regtry         |regexp *prog|char *startpos
-Es     |bool   |reginclass     |regnode *n|U8 *p|STRLEN *lenp|bool do_utf8sv_is_utf8
+ERs    |I32    |regmatch       |NN regnode *prog
+ERs    |I32    |regrepeat      |NN const regnode *p|I32 max
+ERs    |I32    |regrepeat_hard |NN regnode *p|I32 max|NN I32 *lp
+ERs    |I32    |regtry         |regexp *prog|char *startpos
+ERs    |bool   |reginclass     |NN const regnode *n|NN const U8 *p|STRLEN *lenp|bool do_utf8sv_is_utf8
 Es     |CHECKPOINT|regcppush   |I32 parenfloor
 Es     |char*|regcppop
 Es     |char*|regcp_set_to     |I32 ss
 Es     |void   |cache_re       |regexp *prog
-E    |U8*    |reghop         |U8 *pos|I32 off
-E    |U8*    |reghop3        |U8 *pos|I32 off|U8 *lim
-E    |U8*    |reghopmaybe    |U8 *pos|I32 off
-Es     |U8*    |reghopmaybe3   |U8 *pos|I32 off|U8 *lim
-Es     |char*  |find_byclass   |regexp * prog|regnode *c|char *s|char *strend|char *startpos|I32 norun
-Es     |void   |to_utf8_substr |regexp * prog
-Es     |void   |to_byte_substr |regexp * prog
+ERs    |U8*    |reghop         |U8 *pos|I32 off
+ERs    |U8*    |reghop3        |U8 *pos|I32 off|U8 *lim
+ERs    |U8*    |reghopmaybe    |U8 *pos|I32 off
+ERs    |U8*    |reghopmaybe3   |NN U8 *pos|I32 off|NN U8 *lim
+ERs    |char*  |find_byclass   |NN regexp * prog|NN regnode *c|NN char *s|NN const char *strend|I32 norun
+Es     |void   |to_utf8_substr |NN regexp * prog
+Es     |void   |to_byte_substr |NN regexp * prog
 #endif
 
 #if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
 s      |CV*    |deb_curcv      |I32 ix
-s      |void   |debprof        |OP *o
+s      |void   |debprof        |const OP *o
 #endif
 
 #if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
@@ -1167,66 +1227,35 @@ s       |SV*    |save_scalar_at |SV **sptr
 #endif
 
 #if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
-s      |IV     |asIV           |SV* sv
-s      |UV     |asUV           |SV* sv
-s      |SV*    |more_sv
-s      |void   |more_xiv
-s      |void   |more_xnv
-s      |void   |more_xpv
-s      |void   |more_xpviv
-s      |void   |more_xpvnv
-s      |void   |more_xpvcv
-s      |void   |more_xpvav
-s      |void   |more_xpvhv
-s      |void   |more_xpvmg
-s      |void   |more_xpvlv
-s      |void   |more_xpvbm
-s      |void   |more_xrv
-s      |XPVIV* |new_xiv
-s      |XPVNV* |new_xnv
-s      |XPV*   |new_xpv
-s      |XPVIV* |new_xpviv
-s      |XPVNV* |new_xpvnv
-s      |XPVCV* |new_xpvcv
-s      |XPVAV* |new_xpvav
-s      |XPVHV* |new_xpvhv
-s      |XPVMG* |new_xpvmg
-s      |XPVLV* |new_xpvlv
-s      |XPVBM* |new_xpvbm
-s      |XRV*   |new_xrv
-s      |void   |del_xiv        |XPVIV* p
-s      |void   |del_xnv        |XPVNV* p
-s      |void   |del_xpv        |XPV* p
-s      |void   |del_xpviv      |XPVIV* p
-s      |void   |del_xpvnv      |XPVNV* p
-s      |void   |del_xpvcv      |XPVCV* p
-s      |void   |del_xpvav      |XPVAV* p
-s      |void   |del_xpvhv      |XPVHV* p
-s      |void   |del_xpvmg      |XPVMG* p
-s      |void   |del_xpvlv      |XPVLV* p
-s      |void   |del_xpvbm      |XPVBM* p
-s      |void   |del_xrv        |XRV* p
-s      |void   |sv_unglob      |SV* sv
-s      |void   |not_a_number   |SV *sv
-s      |I32    |visit          |SVFUNC_t f|U32 flags|U32 mask
-s      |void   |sv_add_backref |SV *tsv|SV *sv
-s      |void   |sv_del_backref |SV *sv
+sR     |IV     |asIV           |NN SV* sv
+sR     |UV     |asUV           |NN SV* sv
+s      |void   |sv_unglob      |NN SV* sv
+s      |void   |not_a_number   |NN SV *sv
+s      |I32    |visit          |NN SVFUNC_t f|U32 flags|U32 mask
+s      |void   |sv_add_backref |NN SV *tsv|NN SV *sv
+s      |void   |sv_del_backref |NN SV *sv
+sR     |SV *   |varname        |NULLOK GV *gv|NN const char *gvtype|PADOFFSET targ \
+                               |NULLOK SV *keyname|I32 aindex|int subscript_type
 #  ifdef DEBUGGING
 s      |void   |del_sv |SV *p
 #  endif
 #  if !defined(NV_PRESERVES_UV)
 s      |int    |sv_2iuv_non_preserve   |SV *sv|I32 numtype
 #  endif
-s      |I32    |expect_number  |char** pattern
+sR     |I32    |expect_number  |NN char** pattern
 #
 #  if defined(USE_ITHREADS)
 s      |SV*    |gv_share       |SV *sv|CLONE_PARAMS *param
 #  endif
-s      |bool   |utf8_mg_pos    |SV *sv|MAGIC **mgp|STRLEN **cachep|I32 i|I32 *offsetp|I32 uoff|U8 **sp|U8 *start|U8 *send
-s      |bool   |utf8_mg_pos_init       |SV *sv|MAGIC **mgp|STRLEN **cachep|I32 i|I32 *offsetp|U8 *s|U8 *start
+s      |bool   |utf8_mg_pos    |NN SV *sv|NN MAGIC **mgp|NN STRLEN **cachep \
+                               |I32 i|NN I32 *offsetp|I32 uoff \
+                               |NN const U8 **sp|NN const U8 *start \
+                               |NN const U8 *send
+s      |bool   |utf8_mg_pos_init       |NN SV *sv|NN MAGIC **mgp \
+                               |NN STRLEN **cachep|I32 i|I32 offsetp \
+                               |NN const U8 *s|NN const U8 *start
 #if defined(PERL_COPY_ON_WRITE)
-sM     |void   |sv_release_COW |SV *sv|char *pvx|STRLEN cur|STRLEN len \
-                               |U32 hash|SV *after
+sM     |void   |sv_release_COW |SV *sv|const char *pvx|STRLEN len|SV *after
 #endif
 #endif
 
@@ -1238,10 +1267,10 @@ s       |char*  |force_word     |char *start|int token|int check_keyword \
                                |int allow_pack|int allow_tick
 s      |SV*    |tokeq          |SV *sv
 s      |int    |pending_ident
-s      |char*  |scan_const     |char *start
-s      |char*  |scan_formline  |char *s
-s      |char*  |scan_heredoc   |char *s
-s      |char*  |scan_ident     |char *s|char *send|char *dest \
+s      |char*  |scan_const     |NN char *start
+s      |char*  |scan_formline  |NN char *s
+s      |char*  |scan_heredoc   |NN char *s
+s      |char*  |scan_ident     |NN char *s|NN const char *send|NN char *dest \
                                |STRLEN destlen|I32 ck_uni
 s      |char*  |scan_inputsymbol|char *start
 s      |char*  |scan_pat       |char *start|I32 type
@@ -1252,28 +1281,28 @@ s       |char*  |scan_word      |char *s|char *dest|STRLEN destlen \
                                |int allow_package|STRLEN *slp
 s      |char*  |skipspace      |char *s
 s      |char*  |swallow_bom    |U8 *s
-s      |void   |checkcomma     |char *s|char *name|char *what
-s      |void   |force_ident    |char *s|int kind
+s      |void   |checkcomma     |NN char *s|NN const char *name|NN const char *what
+s      |void   |force_ident    |const char *s|int kind
 s      |void   |incline        |char *s
 s      |int    |intuit_method  |char *s|GV *gv
 s      |int    |intuit_more    |char *s
 s      |I32    |lop            |I32 f|int x|char *s
-     |void   |missingterm    |char *s
-s      |void   |no_op          |char *what|char *s
+rs     |void   |missingterm    |char *s
+s      |void   |no_op          |const char *what|char *s
 s      |void   |set_csh
 s      |I32    |sublex_done
 s      |I32    |sublex_push
 s      |I32    |sublex_start
 s      |char * |filter_gets    |SV *sv|PerlIO *fp|STRLEN append
-s      |HV *   |find_in_my_stash|char *pkgname|I32 len
-s      |SV*    |new_constant   |char *s|STRLEN len|const char *key|SV *sv \
+s      |HV *   |find_in_my_stash|const char *pkgname|I32 len
+s      |SV*    |new_constant   |const char *s|STRLEN len|const char *key|SV *sv \
                                |SV *pv|const char *type
 #  if defined(DEBUGGING)
-s      |int    |tokereport     |char *s|I32 rv
+s      |int    |tokereport     |const char *s|I32 rv
 #  endif
 s      |int    |ao             |int toketype
 s      |void   |depcom
-s      |char*  |incl_perldb
+s      |const char*|incl_perldb
 #if 0
 s      |I32    |utf16_textfilter|int idx|SV *sv|int maxlen
 s      |I32    |utf16rev_textfilter|int idx|SV *sv|int maxlen
@@ -1288,8 +1317,10 @@ s        |SV*|isa_lookup |HV *stash|const char *name|HV *name_stash|int len|int level
 #endif
 
 #if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
+#if defined(USE_LOCALE_NUMERIC) || defined(USE_LOCALE_COLLATE)
 s      |char*  |stdize_locale  |char* locs
 #endif
+#endif
 
 #if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
 s      |COP*   |closest_cop    |COP *cop|OP *o
@@ -1300,42 +1331,45 @@ s       |SV*    |mess_alloc
 sn     |NV|mulexp10    |NV value|I32 exponent
 #endif
 
+#if defined(PERL_IN_UTF8_C) || defined(PERL_DECL_PROT)
+s      |STRLEN |is_utf8_char_slow|NN const U8 *s|const STRLEN len
+#endif
+
 START_EXTERN_C
 
-Apd    |void   |sv_setsv_flags |SV* dsv|SV* ssv|I32 flags
-Apd    |void   |sv_catpvn_flags|SV* sv|const char* ptr|STRLEN len|I32 flags
-Apd    |void   |sv_catsv_flags |SV* dsv|SV* ssv|I32 flags
-Apd    |STRLEN |sv_utf8_upgrade_flags|SV *sv|I32 flags
+Apd    |void   |sv_setsv_flags |NN SV* dsv|NULLOK SV* ssv|I32 flags
+Apd    |void   |sv_catpvn_flags|NN SV* sv|NN const char* ptr|STRLEN len|I32 flags
+Apd    |void   |sv_catsv_flags |NN SV* dsv|SV* ssv|I32 flags
+Apd    |STRLEN |sv_utf8_upgrade_flags|NN SV *sv|I32 flags
 Apd    |char*  |sv_pvn_force_flags|SV* sv|STRLEN* lp|I32 flags
-Apd    |char*  |sv_2pv_flags   |SV* sv|STRLEN* lp|I32 flags
-Apd    |void   |sv_copypv      |SV* dsv|SV* ssv
-Ap     |char*  |my_atof2       |const char *s|NV* value
+Apd    |void   |sv_copypv      |NN SV* dsv|NN SV* ssv
+Ap     |char*  |my_atof2       |NN const char *s|NN NV* value
 Apn    |int    |my_socketpair  |int family|int type|int protocol|int fd[2]
 #ifdef PERL_COPY_ON_WRITE
 pMXE   |SV*    |sv_setsv_cow   |SV* dsv|SV* ssv
 #endif
 
 #if defined(USE_PERLIO) && !defined(USE_SFIO)
-Ap     |int    |PerlIO_close           |PerlIO *
-Ap     |int    |PerlIO_fill            |PerlIO *
-Ap     |int    |PerlIO_fileno          |PerlIO *
-Ap     |int    |PerlIO_eof             |PerlIO *
-Ap     |int    |PerlIO_error           |PerlIO *
-Ap     |int    |PerlIO_flush           |PerlIO *
-Ap     |void   |PerlIO_clearerr        |PerlIO *
-Ap     |void   |PerlIO_set_cnt         |PerlIO *|int
-Ap     |void   |PerlIO_set_ptrcnt      |PerlIO *|STDCHAR *|int
-Ap     |void   |PerlIO_setlinebuf      |PerlIO *
-Ap     |SSize_t|PerlIO_read            |PerlIO *|void *|Size_t
-Ap     |SSize_t|PerlIO_write           |PerlIO *|const void *|Size_t
-Ap     |SSize_t|PerlIO_unread          |PerlIO *|const void *|Size_t
-Ap     |Off_t  |PerlIO_tell            |PerlIO *
-Ap     |int    |PerlIO_seek            |PerlIO *|Off_t|int
+Ap     |int    |PerlIO_close           |PerlIO *f
+Ap     |int    |PerlIO_fill            |PerlIO *f
+Ap     |int    |PerlIO_fileno          |PerlIO *f
+Ap     |int    |PerlIO_eof             |PerlIO *f
+Ap     |int    |PerlIO_error           |PerlIO *f
+Ap     |int    |PerlIO_flush           |PerlIO *f
+Ap     |void   |PerlIO_clearerr        |PerlIO *f
+Ap     |void   |PerlIO_set_cnt         |PerlIO *f|int cnt
+Ap     |void   |PerlIO_set_ptrcnt      |PerlIO *f|NN STDCHAR *ptr|int cnt
+Ap     |void   |PerlIO_setlinebuf      |PerlIO *f
+Ap     |SSize_t|PerlIO_read            |PerlIO *f|NN void *buf|Size_t count
+Ap     |SSize_t|PerlIO_write           |PerlIO *f|NN const void *buf|Size_t count
+Ap     |SSize_t|PerlIO_unread          |PerlIO *f|NN const void *buf|Size_t count
+Ap     |Off_t  |PerlIO_tell            |PerlIO *f
+Ap     |int    |PerlIO_seek            |PerlIO *f|Off_t offset|int whence
 
-Ap     |STDCHAR *|PerlIO_get_base      |PerlIO *
-Ap     |STDCHAR *|PerlIO_get_ptr       |PerlIO *
-Ap     |int      |PerlIO_get_bufsiz    |PerlIO *
-Ap     |int      |PerlIO_get_cnt       |PerlIO *
+Ap     |STDCHAR *|PerlIO_get_base      |PerlIO *f
+Ap     |STDCHAR *|PerlIO_get_ptr       |PerlIO *f
+Ap     |int      |PerlIO_get_bufsiz    |PerlIO *f
+Ap     |int      |PerlIO_get_cnt       |PerlIO *f
 
 Ap     |PerlIO *|PerlIO_stdin
 Ap     |PerlIO *|PerlIO_stdout
@@ -1348,49 +1382,52 @@ s       |void   |deb_stack_n    |SV** stack_base|I32 stack_min \
                                |I32 stack_max|I32 mark_min|I32 mark_max
 #endif
 
-pd     |PADLIST*|pad_new       |int flags
+pda    |PADLIST*|pad_new       |int flags
 pd     |void   |pad_undef      |CV* cv
-pd     |PADOFFSET|pad_add_name |char *name\
+pd     |PADOFFSET|pad_add_name |NN const char *name\
                                |HV* typestash|HV* ourstash \
                                |bool clone
 pd     |PADOFFSET|pad_add_anon |SV* sv|OPCODE op_type
-pd     |void   |pad_check_dup  |char* name|bool is_our|HV* ourstash
+pd     |void   |pad_check_dup  |NN const char* name|bool is_our|NN const HV* ourstash
 #ifdef DEBUGGING
-pd     |void   |pad_setsv      |PADOFFSET po|SV* sv
+pd     |void   |pad_setsv      |PADOFFSET po|NN SV* sv
 #endif
 pd     |void   |pad_block_start|int full
 pd     |void   |pad_tidy       |padtidy_type type
-pd     |void   |do_dump_pad    |I32 level|PerlIO *file \
-                               |PADLIST *padlist|int full
-pd     |void   |pad_fixup_inner_anons|PADLIST *padlist|CV *old_cv|CV *new_cv
+pd     |void   |do_dump_pad    |I32 level|NN PerlIO *file|PADLIST *padlist|int full
+pd     |void   |pad_fixup_inner_anons|NN PADLIST *padlist|CV *old_cv|CV *new_cv
 
-pd     |void   |pad_push       |PADLIST *padlist|int depth|int has_args
+pd     |void   |pad_push       |NN PADLIST *padlist|int depth
+pR     |HV*    |pad_compname_type|const PADOFFSET po
 
 #if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
-sd     |PADOFFSET|pad_findlex  |char *name|CV* cv|U32 seq|int warn \
+sd     |PADOFFSET|pad_findlex  |const char *name|const CV* cv|U32 seq|int warn \
                                |SV** out_capture|SV** out_name_sv \
                                |int *out_flags
 #  if defined(DEBUGGING)
-sd     |void   |cv_dump        |CV *cv|char *title
+sd     |void   |cv_dump        |NN const CV *cv|NN const char *title
 #  endif
 #endif
-pd     |CV*    |find_runcv     |U32 *db_seqp
+pdR    |CV*    |find_runcv     |U32 *db_seqp
 p      |void   |free_tied_hv_pool
 #if defined(DEBUGGING)
-p      |int    |get_debug_opts |char **s|bool givehelp
+p      |int    |get_debug_opts |const char **s|bool givehelp
 #endif
 Ap     |void   |save_set_svflags|SV* sv|U32 mask|U32 val
-Apod   |void   |hv_assert      |HV* tb
-
-#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
-sM     |SV*    |hv_delete_common|HV* tb|SV* key_sv|const char* key|STRLEN klen|int k_flags|I32 d_flags|U32 hash
-sM     |HE*    |hv_fetch_common|HV* tb|SV* key_sv|const char* key|STRLEN klen|int flags|int action|SV* val|U32 hash
-#endif
+Apod   |void   |hv_assert      |NN HV* tb
 
-Apd    |void   |hv_clear_placeholders|HV* hb
+ApdR   |SV*    |hv_scalar      |NN HV* hv
+ApoR   |I32*   |hv_riter_p     |NN HV* hv
+ApoR   |HE**   |hv_eiter_p     |NN HV* hv
+Apo    |void   |hv_riter_set   |NN HV* hv|I32 riter
+Apo    |void   |hv_eiter_set   |NN HV* hv|HE* eiter
+Apo    |void   |hv_name_set    |NN HV* hv|const char *name|I32 len|int flags
+Apd    |void   |hv_clear_placeholders  |NN HV* hb
+ApoR   |I32*   |hv_placeholders_p      |NN HV* hv
+ApoR   |I32    |hv_placeholders_get    |NN HV* hv
+Apo    |void   |hv_placeholders_set    |NN HV* hv|I32 ph
 
-Apd    |SV*    |hv_scalar      |HV* hv|
-p      |SV*    |magic_scalarpack|HV* hv|MAGIC* mg
+p      |SV*    |magic_scalarpack|NN HV* hv|NN MAGIC* mg
 #ifdef PERL_IN_SV_C
 sMd    |SV*    |find_uninit_var|OP* obase|SV* uninit_sv|bool top
 #endif
@@ -1473,8 +1510,11 @@ np       |void   |my_swabn       |void* ptr|int n
 
 Ap     |GV*    |gv_fetchpvn_flags|const char* name|STRLEN len|I32 flags|I32 sv_type
 Ap     |GV*    |gv_fetchsv|SV *name|I32 flags|I32 sv_type
-dp     |bool   |is_gv_magical_sv|SV *name|U32 flags
+dpR    |bool   |is_gv_magical_sv|SV *name|U32 flags
 
-Apd    |char*  |savesvpv       |SV* sv
+ApR    |bool   |stashpv_hvname_match|NN const COP *cop|NN const HV *hv
 
 END_EXTERN_C
+/*
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
index 5b26baf..3592d6c 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 10 $
+##  $Revision: 11 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:52 +0100 $
+##  $Date: 2005/03/10 18:08:41 +0100 $
 ##
 ################################################################################
 ##
@@ -139,13 +139,13 @@ _aMY_CXT
 =xsmisc
 
 #define MY_CXT_KEY "Devel::PPPort::_guts" XS_VERSION
+
 typedef struct {
   /* Put Global Data in here */
-  int dummy;          
+  int dummy;
 } my_cxt_t;
-START_MY_CXT     
+
+START_MY_CXT
 
 =xsboot
 
index 56474d2..bb4c0f5 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 10 $
+##  $Revision: 11 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:54 +0100 $
+##  $Date: 2005/03/10 18:08:41 +0100 $
 ##
 ################################################################################
 ##
@@ -32,7 +32,7 @@ sv_pvn_force
 
 char *
 sv_2pv_nolen(pTHX_ register SV *sv)
-{   
+{
   STRLEN n_a;
   return sv_2pv(sv, &n_a);
 }
@@ -63,7 +63,7 @@ sv_2pv_nolen(pTHX_ register SV *sv)
 
 char *
 sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
-{   
+{
   sv_utf8_downgrade(sv,0);
   return SvPV(sv,*lp);
 }
index 78d46f9..da2048b 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 3 $
+##  $Revision: 4 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:51 +0100 $
+##  $Date: 2005/03/10 18:08:37 +0100 $
 ##
 ################################################################################
 ##
@@ -41,7 +41,7 @@
 
 #ifndef NVef
 #  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
-      defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */ 
+      defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
 #    define NVef          PERL_PRIeldbl
 #    define NVff          PERL_PRIfldbl
 #    define NVgf          PERL_PRIgldbl
index be7679f..782e0dd 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 7 $
+##  $Revision: 8 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:51 +0100 $
+##  $Date: 2005/03/10 18:08:40 +0100 $
 ##
 ################################################################################
 ##
@@ -53,12 +53,12 @@ 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) { 
+    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; 
+            return TRUE;
         }
     }
 #else
@@ -69,11 +69,11 @@ grok_numeric_radix(pTHX_ const char **sp, const char *send)
     dTHR;  /* needed for older threaded perls */
     struct lconv *lc = localeconv();
     char *radix = lc->decimal_point;
-    if (radix && IN_LOCALE) { 
+    if (radix && IN_LOCALE) {
         STRLEN len = strlen(radix);
         if (*sp + len <= send && memEQ(*sp, radix, len)) {
             *sp += len;
-            return TRUE; 
+            return TRUE;
         }
     }
 #endif /* PERL_VERSION */
@@ -360,7 +360,7 @@ grok_bin(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
             warn("Illegal binary digit '%c' ignored", *s);
         break;
     }
-    
+
     if (   ( overflowed && value_nv > 4294967295.0)
 #if UVSIZE > 4
        || (!overflowed && value > 0xffffffff  )
@@ -449,7 +449,7 @@ grok_hex(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
             warn("Illegal hexadecimal digit '%c' ignored", *s);
         break;
     }
-    
+
     if (   ( overflowed && value_nv > 4294967295.0)
 #if UVSIZE > 4
        || (!overflowed && value > 0xffffffff  )
@@ -529,7 +529,7 @@ grok_oct(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
         }
         break;
     }
-    
+
     if (   ( overflowed && value_nv > 4294967295.0)
 #if UVSIZE > 4
        || (!overflowed && value > 0xffffffff  )
index 84c0511..3fd37fa 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 20 $
+##  $Revision: 22 $
 ##  $Author: mhx $
-##  $Date: 2005/02/02 19:17:33 +0100 $
+##  $Date: 2005/06/11 09:37:31 +0200 $
 ##
 ################################################################################
 ##
@@ -119,7 +119,7 @@ typedef NVTYPE NV;
 #  if PTRSIZE == LONGSIZE
 #    define PTR2ul(p)     (unsigned long)(p)
 #  else
-#    define PTR2ul(p)     INT2PTR(unsigned long,p)        
+#    define PTR2ul(p)     INT2PTR(unsigned long,p)
 #  endif
 
 #endif /* !INT2PTR */
index fbf752a..9bf81d1 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 8 $
+##  $Revision: 9 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:52 +0100 $
+##  $Date: 2005/03/10 18:08:41 +0100 $
 ##
 ################################################################################
 ##
@@ -96,12 +96,12 @@ call_newCONSTSUB_3()
 
 =tests plan => 3
 
-&Devel::PPPort::call_newCONSTSUB_1(); 
+&Devel::PPPort::call_newCONSTSUB_1();
 ok(&Devel::PPPort::test_value_1(), 1);
 
-&Devel::PPPort::call_newCONSTSUB_2(); 
+&Devel::PPPort::call_newCONSTSUB_2();
 ok(&Devel::PPPort::test_value_2(), 2);
 
-&Devel::PPPort::call_newCONSTSUB_3(); 
+&Devel::PPPort::call_newCONSTSUB_3();
 ok(&Devel::PPPort::test_value_3(), 3);
 
index 6df23e4..e3d32dd 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 26 $
+##  $Revision: 28 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:53 +0100 $
+##  $Date: 2005/03/10 18:08:41 +0100 $
 ##
 ################################################################################
 ##
@@ -29,6 +29,7 @@ my %opt = (
   hints     => 1,
   changes   => 1,
   cplusplus => 0,
+  filter    => 1,
 );
 
 my($ppport) = $0 =~ /([\w.]+)$/;
@@ -38,7 +39,7 @@ my $HS = "[ \t]";             # horizontal whitespace
 eval {
   require Getopt::Long;
   Getopt::Long::GetOptions(\%opt, qw(
-    help quiet diag! hints! changes! cplusplus
+    help quiet diag! filter! hints! changes! cplusplus
     patch=s copy=s diff=s compat-version=s
     list-provided list-unsupported api-info=s
   )) or usage();
@@ -57,7 +58,7 @@ if (exists $opt{'compat-version'}) {
     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 || $v >= 1000;
+  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
   $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
 }
 else {
@@ -70,32 +71,8 @@ my $cce  = '*'.'/';
 my $rccs = quotemeta $ccs;
 my $rcce = quotemeta $cce;
 
-my @files;
-
-if (@ARGV) {
-  @files = map { glob $_ } @ARGV;
-}
-else {
-  eval {
-    require File::Find;
-    File::Find::find(sub {
-      $File::Find::name =~ /\.(xs|c|h|cc)$/i
-          and push @files, $File::Find::name;
-    }, '.');
-  };
-  if ($@) {
-    @files = map { glob $_ } qw(*.xs *.c *.h *.cc);
-  }
-  my %filter = map { /(.*)\.xs$/ ? ("$1.c" => 1) : () } @files;
-  @files = grep { !/\b\Q$ppport\E$/i && !exists $filter{$_} } @files;
-}
-
-unless (@files) {
-  die "No input files given!\n";
-}
-
 my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
-                ? ( $1 => { 
+                ? ( $1 => {
                       ($2                  ? ( base     => $2 ) : ()),
                       ($3                  ? ( todo     => $3 ) : ()),
                       (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
@@ -194,6 +171,44 @@ if (exists $opt{'list-provided'}) {
   exit 0;
 }
 
+my @files;
+my @srcext = qw( xs c h cc cpp );
+my $srcext = join '|', @srcext;
+
+if (@ARGV) {
+  my %seen;
+  @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
+}
+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;
+}
+
+unless (@files) {
+  die "No input files given!\n";
+}
+
 my(%files, %global, %revreplace);
 %revreplace = reverse %replace;
 my $filename;
index 37097b7..36c072f 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 20 $
+##  $Revision: 21 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:53 +0100 $
+##  $Date: 2005/02/27 21:13:25 +0100 $
 ##
 ################################################################################
 ##
@@ -33,7 +33,9 @@ ppport.h - Perl/Pollution/Portability version __VERSION__
 
 =head1 SYNOPSIS
 
-  perl ppport.h [options] [files]
+  perl ppport.h [options] [source files]
+
+  Searches current directory for files if no [source files] are given
 
   --help                      show short help
 
@@ -48,6 +50,7 @@ ppport.h - Perl/Pollution/Portability version __VERSION__
   --nodiag                    don't show diagnostics
   --nohints                   don't show hints
   --nochanges                 don't suggest changes
+  --nofilter                  don't filter input files
 
   --list-provided             list provided API
   --list-unsupported          list unsupported API
@@ -120,6 +123,11 @@ notes.
 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 --list-provided
 
 Lists the API elements for which compatibility is provided by
index 43fbe9f..fda3362 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 23 $
+##  $Revision: 26 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:53 +0100 $
+##  $Date: 2005/06/24 19:03:21 +0200 $
 ##
 ################################################################################
 ##
@@ -15,7 +15,7 @@
 ##
 ################################################################################
 
-=tests plan => 134
+=tests plan => 197
 
 use File::Path qw/rmtree mkpath/;
 use Config;
@@ -23,6 +23,8 @@ use Config;
 my $tmp = 'ppptmp';
 my $inc = '';
 my $perl = find_perl();
+my $isVMS = $^O eq 'VMS';
+my $isMAC = $^O eq 'MacOS';
 
 rmtree($tmp) if -d $tmp;
 mkpath($tmp) or die "mkpath $tmp: $!\n";
@@ -30,7 +32,15 @@ chdir($tmp) or die "chdir $tmp: $!\n";
 
 if ($ENV{'PERL_CORE'}) {
   if (-d '../../lib') {
-    $inc = $^O eq 'VMS' ? '-"I../../lib"' : '-I../../lib';
+    if ($isVMS) {
+      $inc = '"-I../../lib"';
+    }
+    elsif ($isMAC) {
+      $inc = '-I:::lib';
+    }
+    else {
+      $inc = '-I../../lib';
+    }
     unshift @INC, '../../lib';
   }
 }
@@ -45,15 +55,30 @@ END {
 
 ok(&Devel::PPPort::WriteFile("ppport.h"));
 
+sub comment
+{
+  my $c = shift;
+  $c =~ s/^/# | /mg;
+  $c .= "\n" unless $c =~ /[\r\n]$/;
+  print $c;
+}
+
 sub ppport
 {
-  my @args = @_;
-  print "# *** running $perl $inc ppport.h @args ***\n";
-  my $out = join '', `$perl $inc ppport.h @args`;
-  my $copy = $out;
-  $copy =~ s/^/# | /mg;
-  print "$copy\n";
-  return $out;
+  my @args = ('ppport.h', @_);
+  unshift @args, $inc if $inc;
+  my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
+  $run .= ' -MMac::err=unix' if $isMAC;
+  for (@args) {
+    $_ = qq("$_") if $isVMS && /^[^"]/;
+    $run .= " $_";
+  }
+  print "# *** running $run ***\n";
+  $run .= ' 2>&1' unless $isMAC;
+  my @out = `$run`;
+  my $out = join '', @out;
+  comment($out);
+  return wantarray ? @out : $out;
 }
 
 sub matches
@@ -82,9 +107,7 @@ sub eq_files
     }
     $_ = do { local $/; <F> };
     close F;
-    my $copy = $_;
-    $copy =~ s/^/# | /mg;
-    print "$copy\n";
+    comment($_);
   }
   return $f1 eq $f2;
 }
@@ -133,11 +156,11 @@ for $t (@tests) {
 sub find_perl
 {
   my $perl = $^X;
-  
-  return $perl if $^O eq 'VMS';
-  
+
+  return $perl if $isVMS;
+
   my $exe = $Config{'_exe'} || '';
-  
+
   if ($perl =~ /^perl\Q$exe\E$/i) {
     $perl = "perl$exe";
     eval "require File::Spec";
@@ -147,13 +170,13 @@ sub find_perl
       $perl = File::Spec->catfile(File::Spec->curdir(), $perl);
     }
   }
-  
+
   if ($perl !~ /\Q$exe\E$/i) {
     $perl .= $exe;
   }
-  
+
   warn "find_perl: cannot find $perl from $^X" unless -f $perl;
-  
+
   return $perl;
 }
 
@@ -164,10 +187,10 @@ ok($o =~ /^Usage:.*ppport\.h/m);
 ok($o =~ /--help/m);
 
 $o = ppport(qw(--nochanges));
-ok($o =~ /^scanning.*test\.xs/mi);
-ok($o =~ /analyzing.*test\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
-ok(matches($o, 'analyzing', 'mi'), 1);
+ok($o =~ /^Scanning.*test\.xs/mi);
+ok($o =~ /Analyzing.*test\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
 ok($o =~ /Uses Perl_newSViv instead of newSViv/);
 
 $o = ppport(qw(--quiet --nochanges));
@@ -182,9 +205,9 @@ Perl_newSViv();
 # check if C and C++ comments are filtered correctly
 
 my $o = ppport(qw(--copy=a));
-ok($o =~ /^scanning.*MyExt\.xs/mi);
-ok($o =~ /analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Uses grok_bin/m);
 ok($o !~ /^Uses newSVpv/m);
@@ -194,9 +217,9 @@ ok(eq_files('MyExt.xsa', 'MyExt.ra'));
 # check if C++ are left untouched with --cplusplus
 
 $o = ppport(qw(--copy=b --cplusplus));
-ok($o =~ /^scanning.*MyExt\.xs/mi);
-ok($o =~ /analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Uses grok_bin/m);
 ok($o !~ /^Uses newSVpv/m);
@@ -206,14 +229,14 @@ ok(eq_files('MyExt.xsb', 'MyExt.rb'));
 unlink qw(MyExt.xsa MyExt.xsb);
 
 ---------------------------- MyExt.xs -----------------------------------------
-  
+
 newSVuv();
     // newSVpv();
   XPUSHs(foo);
 /* grok_bin(); */
 
 ---------------------------- MyExt.ra -----------------------------------------
-  
+
 #include "ppport.h"
 newSVuv();
     /* newSVpv(); */
@@ -221,7 +244,7 @@ newSVuv();
 /* grok_bin(); */
 
 ---------------------------- MyExt.rb -----------------------------------------
-  
+
 #include "ppport.h"
 newSVuv();
     // newSVpv();
@@ -231,9 +254,9 @@ newSVuv();
 ===============================================================================
 
 my $o = ppport(qw(--nochanges file1.xs));
-ok($o =~ /^scanning.*file1\.xs/mi);
-ok($o =~ /analyzing.*file1\.xs/mi);
-ok($o !~ /^scanning.*file2\.xs/mi);
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
 ok($o =~ /^Uses newCONSTSUB/m);
 ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
 ok($o =~ /hint for newCONSTSUB/m);
@@ -241,9 +264,9 @@ ok($o !~ /hint for sv_2pv_nolen/m);
 ok($o =~ /^Looks good/m);
 
 $o = ppport(qw(--nochanges --nohints file1.xs));
-ok($o =~ /^scanning.*file1\.xs/mi);
-ok($o =~ /analyzing.*file1\.xs/mi);
-ok($o !~ /^scanning.*file2\.xs/mi);
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
 ok($o =~ /^Uses newCONSTSUB/m);
 ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
 ok($o !~ /hint for newCONSTSUB/m);
@@ -251,9 +274,9 @@ ok($o !~ /hint for sv_2pv_nolen/m);
 ok($o =~ /^Looks good/m);
 
 $o = ppport(qw(--nochanges --nohints --nodiag file1.xs));
-ok($o =~ /^scanning.*file1\.xs/mi);
-ok($o =~ /analyzing.*file1\.xs/mi);
-ok($o !~ /^scanning.*file2\.xs/mi);
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
 ok($o !~ /^Uses newCONSTSUB/m);
 ok($o !~ /^Uses SvPV_nolen/m);
 ok($o !~ /hint for newCONSTSUB/m);
@@ -264,27 +287,27 @@ $o = ppport(qw(--nochanges --quiet file1.xs));
 ok($o =~ /^\s*$/);
 
 $o = ppport(qw(--nochanges file2.xs));
-ok($o =~ /^scanning.*file2\.xs/mi);
-ok($o =~ /analyzing.*file2\.xs/mi);
-ok($o !~ /^scanning.*file1\.xs/mi);
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
 ok($o =~ /^Uses mXPUSHp/m);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Looks good/m);
 ok($o =~ /^1 potentially required change detected/m);
 
 $o = ppport(qw(--nochanges --nohints file2.xs));
-ok($o =~ /^scanning.*file2\.xs/mi);
-ok($o =~ /analyzing.*file2\.xs/mi);
-ok($o !~ /^scanning.*file1\.xs/mi);
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
 ok($o =~ /^Uses mXPUSHp/m);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Looks good/m);
 ok($o =~ /^1 potentially required change detected/m);
 
 $o = ppport(qw(--nochanges --nohints --nodiag file2.xs));
-ok($o =~ /^scanning.*file2\.xs/mi);
-ok($o =~ /analyzing.*file2\.xs/mi);
-ok($o !~ /^scanning.*file1\.xs/mi);
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
 ok($o !~ /^Uses mXPUSHp/m);
 ok($o !~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Looks good/m);
@@ -309,9 +332,9 @@ mXPUSHp(foo);
 ===============================================================================
 
 my $o = ppport(qw(--nochanges));
-ok($o =~ /^scanning.*FooBar\.xs/mi);
-ok($o =~ /analyzing.*FooBar\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
+ok($o =~ /^Scanning.*FooBar\.xs/mi);
+ok($o =~ /Analyzing.*FooBar\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
 ok($o !~ /^Looks good/m);
 ok($o =~ /^Uses grok_bin/m);
 
@@ -324,14 +347,14 @@ grok_bin();
 ===============================================================================
 
 my $o = ppport(qw(--nochanges));
-ok($o =~ /^scanning.*First\.xs/mi);
-ok($o =~ /analyzing.*First\.xs/mi);
-ok($o =~ /^scanning.*second\.h/mi);
-ok($o =~ /analyzing.*second\.h/mi);
-ok($o =~ /^scanning.*sub.*third\.c/mi);
-ok($o =~ /analyzing.*sub.*third\.c/mi);
-ok($o !~ /^scanning.*foobar/mi);
-ok(matches($o, '^scanning', 'mi'), 3);
+ok($o =~ /^Scanning.*First\.xs/mi);
+ok($o =~ /Analyzing.*First\.xs/mi);
+ok($o =~ /^Scanning.*second\.h/mi);
+ok($o =~ /Analyzing.*second\.h/mi);
+ok($o =~ /^Scanning.*sub.*third\.c/mi);
+ok($o =~ /Analyzing.*sub.*third\.c/mi);
+ok($o !~ /^Scanning.*foobar/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
 
 ---------------------------- First.xs -----------------------------------------
 
@@ -364,12 +387,12 @@ ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);
 
 my $o = ppport(qw(--copy=f));
 for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
-  ok($o =~ /^scanning.*\Q$_\E/mi);
-  ok($o =~ /analyzing.*\Q$_\E/i);
+  ok($o =~ /^Scanning.*\Q$_\E/mi);
+  ok($o =~ /Analyzing.*\Q$_\E/i);
 }
-ok(matches($o, '^scanning', 'mi'), 6);
+ok(matches($o, '^Scanning', 'm'), 6);
 
-ok(matches($o, '^Writing copy of', 'mi'), 5);
+ok(matches($o, '^Writing copy of', 'm'), 5);
 ok(!-e "mod5.cf");
 
 for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
@@ -546,9 +569,30 @@ grok_hex();
 my $o = ppport(qw(--nochanges));
 ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
 
+$o = ppport(qw(--nochanges --compat-version=5.5.3));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.005_03));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
 $o = ppport(qw(--nochanges --compat-version=5.6.0));
 ok($o !~ /Uses SvPVutf8_force/m);
 
+$o = ppport(qw(--nochanges --compat-version=5.006));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.999));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=6.0.0));
+ok($o =~ /Only Perl 5 is supported/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.1000.999));
+ok($o =~ /Invalid version number: 5.1000.999/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.1000));
+ok($o =~ /Invalid version number: 5.999.1000/m);
+
 ---------------------------- FooBar.xs ----------------------------------------
 
 SvPVutf8_force();
@@ -557,7 +601,7 @@ SvPVutf8_force();
 
 my $o = ppport(qw(--nochanges));
 ok($o !~ /potentially required change/);
-ok(matches($o, '^Looks good', 'mi'), 2);
+ok(matches($o, '^Looks good', 'm'), 2);
 
 ---------------------------- FooBar.xs ----------------------------------------
 
@@ -574,3 +618,122 @@ grok_number();
 
 call_pv();
 
+===============================================================================
+
+# check --api-info option
+
+my $o = ppport(qw(--api-info=INT2PTR));
+my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{INT2PTR});
+ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
+ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=Zero));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{Zero});
+ok(matches($o, '^No portability information available\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=/Zero/));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 2);
+ok(exists $found{Zero});
+ok(exists $found{ZeroD});
+
+===============================================================================
+
+# check --list-provided option
+
+my @o = ppport(qw(--list-provided));
+my %p;
+my $fail = 0;
+for (@o) {
+  my($name, $flags) = /^(\w+)(?:\s+\[(\w+(?:,\s+\w+)*)\])?$/ or $fail++;
+  exists $p{$name} and $fail++;
+  $p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{call_sv});
+ok(not ref $p{call_sv});
+
+ok(exists $p{grok_bin});
+ok(ref $p{grok_bin}, 'HASH');
+ok(scalar keys %{$p{grok_bin}}, 1);
+ok($p{grok_bin}{explicit});
+
+ok(exists $p{gv_stashpvn});
+ok(ref $p{gv_stashpvn}, 'HASH');
+ok(scalar keys %{$p{gv_stashpvn}}, 1);
+ok($p{gv_stashpvn}{hint});
+
+ok(exists $p{sv_catpvf_mg});
+ok(ref $p{sv_catpvf_mg}, 'HASH');
+ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
+ok($p{sv_catpvf_mg}{explicit});
+ok($p{sv_catpvf_mg}{depend});
+
+===============================================================================
+
+# check --list-unsupported option
+
+my @o = ppport(qw(--list-unsupported));
+my %p;
+my $fail = 0;
+for (@o) {
+  my($name, $ver) = /^(\w+)\s*\.+\s*([\d._]+)$/ or $fail++;
+  exists $p{$name} and $fail++;
+  $p{$name} = $ver;
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{utf8_distance});
+ok($p{utf8_distance}, '5.6.0');
+
+ok(exists $p{save_generic_svref});
+ok($p{save_generic_svref}, '5.005_03');
+
+===============================================================================
+
+# check --nofilter option
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
+ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
+ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
+ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok($o =~ /^Scanning.*foo\.o/mi);
+ok($o =~ /Analyzing.*foo\.o/mi);
+ok($o =~ /^Scanning.*Makefile/mi);
+ok($o =~ /Analyzing.*Makefile/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
+ok(matches($o, 'Analyzing', 'm'), 3);
+
+---------------------------- foo.cpp ------------------------------------------
+
+newSViv();
+
+---------------------------- foo.o --------------------------------------------
+
+newSViv();
+
+---------------------------- Makefile.PL --------------------------------------
+
+newSViv();
+
index 1bf07ba..c5ef47a 100644 (file)
@@ -1,8 +1,8 @@
 ################################################################################
 ##
-##  $Revision: 4 $
+##  $Revision: 5 $
 ##  $Author: mhx $
-##  $Date: 2005/01/31 08:10:54 +0100 $
+##  $Date: 2005/03/10 18:08:42 +0100 $
 ##
 ################################################################################
 ##
@@ -48,7 +48,7 @@ PERL_PATCHLEVEL_H_IMPLICIT
 
 #define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
 
-/* It is very unlikely that anyone will try to use this with Perl 6 
+/* It is very unlikely that anyone will try to use this with Perl 6
    (or greater), but who knows.
  */
 #if PERL_REVISION != 5
index 9e27e62..e78f89a 100644 (file)
@@ -4,9 +4,9 @@
 #
 ################################################################################
 #
-#  $Revision: 13 $
+#  $Revision: 15 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:54 +0100 $
+#  $Date: 2005/06/24 19:01:33 +0200 $
 #
 ################################################################################
 #
@@ -211,15 +211,17 @@ sub ppcond
 sub trim_arg
 {
   my $in = shift;
+  my $remove = join '|', qw( NN NULLOK );
 
   $in eq '...' and return ($in);
 
   local $_ = $in;
   my $id;
+
   s/[*()]/ /g;
   s/\[[^\]]*\]/ /g;
   s/\b(?:auto|const|extern|inline|register|static|volatile|restrict)\b//g;
+  s/\b(?:$remove)\b//;
   s/^\s*//; s/\s*$//;
 
   if( /^\b(?:struct|union|enum)\s+\w+(?:\s+(\w+))?$/ ) {
@@ -240,6 +242,7 @@ sub trim_arg
 
   # these don't matter at all
   s/\b(?:auto|extern|inline|register|static|volatile|restrict)\b//g;
+  s/\b(?:$remove)\b//;
 
   s/(?=<\*)\s+(?=\*)//g;
   s/\s*(\*+)\s*/ $1 /g;
index 9920f57..69ccd5d 100644 (file)
@@ -1,2 +1 @@
 5.004040
-newWHILEOP                     # E (Perl_newWHILEOP)
index e0eecec..443a693 100644 (file)
@@ -1,7 +1,7 @@
 5.005000
 PL_modglobal                   # E
 cx_dump                        # U
-debop                          # U
+debop                          # E
 debprofdump                    # U
 fbm_compile                    # E (Perl_fbm_compile)
 fbm_instr                      # E (Perl_fbm_instr)
index b1e9b26..2bd073b 100644 (file)
@@ -31,10 +31,10 @@ do_pmop_dump                   # U
 do_sv_dump                     # U
 dump_all                       # U
 dump_eval                      # U
-dump_form                      # U
+dump_form                      # E
 dump_indent                    # U
-dump_packsubs                  # U
-dump_sub                       # U
+dump_packsubs                  # E
+dump_sub                       # E
 dump_vindent                   # U
 get_context                    # E
 get_ppaddr                     # E
index f8ed365..c19336c 100644 (file)
@@ -4,9 +4,9 @@
 #
 ################################################################################
 #
-#  $Revision: 4 $
+#  $Revision: 5 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:54 +0100 $
+#  $Date: 2005/03/10 18:45:41 +0100 $
 #
 ################################################################################
 #
@@ -19,8 +19,8 @@
 #
 ################################################################################
 
-package Devel::PPPort; 
-sub bootstrap {}; 
+package Devel::PPPort;
+sub bootstrap {};
 require "PPPort.pm";
 rename 'ppport.h', 'ppport.old' if -f 'ppport.h';
 unlink "ppport.old" if WriteFile("ppport.h") && -f 'ppport.h';
index 65a8fbc..c0b11ab 100644 (file)
@@ -1,15 +1,15 @@
 #!/usr/bin/perl -w
 ################################################################################
 #
-#  soak -- Test Devel::PPPort with multiple versions of Perl.
+#  soak -- Test Perl modules with multiple Perl releases.
 #
 #  Original Author: Paul Marquess
 #
 ################################################################################
 #
-#  $Revision: 7 $
+#  $Revision: 8 $
 #  $Author: mhx $
-#  $Date: 2005/01/31 08:10:55 +0100 $
+#  $Date: 2005/02/27 21:16:42 +0100 $
 #
 ################################################################################
 #
@@ -28,151 +28,123 @@ use strict;
 use warnings;
 use ExtUtils::MakeMaker;
 use Getopt::Long;
+use Pod::Usage;
+use List::Util qw(max);
+use Config;
 
-my $VERSION = "1.000";
+my $VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.06_01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
 
-$| = 1 ;
-my $verbose = 0 ;
+$| = 1;
+my $verbose = 0;
+my $MAKE = $Config{make} || 'make';
+my %OPT = (
+  verbose => 0,
+  make    => $Config{make} || 'make',
+);
 
-# TODO -- determine what "make" program to run.
-my $MAKE = 'make';
+GetOptions(\%OPT, qw(verbose make=s mmargs=s@)) or pod2usage(2);
 
-my $result = GetOptions(
-       "verbose"       => \$verbose,
-       "make=s"        => \$MAKE,
-       ) or Usage();
+$OPT{mmargs} = [''] unless exists $OPT{mmargs};
 
-my @GoodPerls = ();
-
-if (@ARGV)
-  { @GoodPerls = @ARGV }
-else 
-  { @GoodPerls = FindPerls() }
-
-my $maxlen = 0;
-foreach (@GoodPerls) {
-    $maxlen = length $_
-        if length $_ > $maxlen ;
-}
-$maxlen += 3 ;
+my @GoodPerls = @ARGV ? @ARGV : FindPerls();
+my $maxlen = max(map length, @GoodPerls) + 3;
+my $mmalen = max(map length, @{$OPT{mmargs}});
+$maxlen += $mmalen+3 if $mmalen > 0;
 
 # run each through the test harness
-
-my $bad = 0 ;
-my $good = 0 ;
-my $total = 0 ;
+my(@good, @bad, $total);
 
 # prime the pump, so the first "make realclean" will work.
-runit("perl Makefile.PL") || die "Cannot run perl Makefile.PL\n" ;
+runit("$^X Makefile.PL") && runit("$MAKE realclean")
+    or die "Cannot run $^X Makefile.PL && $MAKE realclean\n";
 
-foreach my $perl (@GoodPerls)
-{
-   my $prefix = $verbose  ? "$perl -- " : '';
-   print "Testing $perl " . ('.' x ($maxlen - length $perl)) ;
+for my $perl (@GoodPerls) {
+  for my $mm (@{$OPT{mmargs}}) {
+    my $config = $mm =~ /\S+/ ? " ($mm)" : '';
+    my $prefix = $verbose ? "$perl$config -- " : '';
+    print "Testing $perl$config " . ('.' x ($maxlen - length($perl.$config)));
 
-   my $ok = runit("$MAKE realclean") &&
-            runit("$perl Makefile.PL") &&
-            # runit("$perl Makefile.PL --with-apicheck") &&
-            runit("$MAKE test");
+    my $ok = runit("$perl Makefile.PL $mm") &&
+             # runit("$perl Makefile.PL --with-apicheck") &&
+             runit("$MAKE test");
 
-    ++ $total;
+    $total++;
     if ($ok) {
-        ++ $good ;
-        print "${prefix}ok\n";
+      push @good, [$perl, $mm];
+      print "${prefix}ok\n";
     }
     else {
-        ++ $bad ;
-        print "${prefix}not ok\n" ;
+      push @bad, [$perl, $mm];
+      print "${prefix}not ok\n";
     }
 
+    runit("$MAKE realclean");
+  }
 }
 
-print "\n\nPassed with $good of $total versions of Perl.\n\n";
-exit $bad ;
-
+if ($verbose && @bad) {
+  print "\nFailed with:\n", map "    $_\n", @bad;
+}
+print "\nPassed with ", scalar @good, " of $total versions/configurations.\n\n";
+exit scalar @bad;
 
 sub runit
 {
-    # TODO -- portability alert!!
-
-    my $cmd = shift ;
-    print "\n    Running [$cmd]\n" if $verbose ;
-    my $output = `$cmd 2>&1` ;
-    $output = "\n" unless defined $output;
-    $output =~ s/^/      /gm;
-    print "\n    Output\n$output\n" if $verbose || $? ;
-    if ($?)
-    {
-        warn "    Running '$cmd' failed: $?\n" ;
-        return 0 ;
-    }
-    return 1 ;
-}                   
-
-sub Usage
-{
-    die <<EOM;
-
-usage: soak [OPT] [perl...]
-
-  OPT
-    -m make    - the name of the make program. Default "make"
-    -v         - verbose
-
-EOM
-
+  # TODO -- portability alert!!
+
+  my $cmd = shift;
+  print "\n    Running [$cmd]\n" if $verbose;
+  my $output = `$cmd 2>&1`;
+  $output = "\n" unless defined $output;
+  $output =~ s/^/      /gm;
+  print "\n    Output\n$output\n" if $verbose || $?;
+  if ($?) {
+    warn "    Running '$cmd' failed: $?\n";
+    return 0;
+  }
+  return 1;
 }
 
 sub FindPerls
 {
-    # TODO -- need to decide how far back we go.
-    # TODO -- get list of user releases prior to 5.004
-
-    # find all version 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.6.0        
-       5.6.1 
-       5.7.0
-       5.7.1
-       5.7.2      
-       );
-
-    print "Searching for Perl binaries...\n" ;
-    my @GoodPerls = ();
-    my $maxlen = 0;
-    my $mm = MM->new( { NAME => 'dummy' });
-    my @path = $mm->path();
-
-    # 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');
-
-    foreach my $perl (@PerlBinaries) {
-        if (my $abs = $mm->find_perl($perl, ["perl$perl"], [@path], 0)) {
-            push @GoodPerls, $abs ;
-        }
+  # 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.9.0 5.9.1
+  );
+
+  print "Searching for Perl binaries...\n";
+  my $mm = MM->new( { NAME => 'dummy' });
+  my @path = $mm->path;
+  my @GoodPerls;
+
+  # 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';
+
+  for my $perl (@PerlBinaries) {
+    if (my $abs = $mm->find_perl($perl, ["perl$perl"], \@path, 0)) {
+      push @GoodPerls, $abs;
     }
-    untie *STDOUT;
-    
-    print "\n\nFound\n";
-    foreach (@GoodPerls) { print "    $_\n" }
-    print "\n\n";
+  }
+
+  untie *STDOUT;
 
-    return @GoodPerls;
+  print "\nFound:\n", (map "    $_\n", @GoodPerls), "\n";
+
+  return @GoodPerls;
 }
 
 package NoSTDOUT;
@@ -180,21 +152,38 @@ package NoSTDOUT;
 use Tie::Handle;
 our @ISA = qw(Tie::Handle);
 
-sub TIEHANDLE 
-{
-    my ($class) = @_;
-    my $buf = "";
-    bless \$buf, $class;
-}
-sub PRINT 
-{
-    my $self = shift;
-}                
-sub WRITE 
-{
-    my $self = shift;
-}                
+sub TIEHANDLE { bless \(my $s = ''), shift }
+sub PRINT {}
+sub WRITE {}
+
+__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})
+  --mmargs=options   pass options to Makefile.PL (multiple --mmargs possible)
+  --verbose          be verbose
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (c) 2004-2005, 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<Devel::PPPort>.
 
+=cut
 
index c40fc49..3d87623 100644 (file)
@@ -35,12 +35,12 @@ use Devel::PPPort;
 use strict;
 $^W = 1;
 
-&Devel::PPPort::call_newCONSTSUB_1(); 
+&Devel::PPPort::call_newCONSTSUB_1();
 ok(&Devel::PPPort::test_value_1(), 1);
 
-&Devel::PPPort::call_newCONSTSUB_2(); 
+&Devel::PPPort::call_newCONSTSUB_2();
 ok(&Devel::PPPort::test_value_2(), 2);
 
-&Devel::PPPort::call_newCONSTSUB_3(); 
+&Devel::PPPort::call_newCONSTSUB_3();
 ok(&Devel::PPPort::test_value_3(), 3);
 
index e1cf0ed..9040c92 100644 (file)
@@ -24,10 +24,10 @@ BEGIN {
   eval "use Test";
   if ($@) {
     require 'testutil.pl';
-    print "1..134\n";
+    print "1..197\n";
   }
   else {
-    plan(tests => 134);
+    plan(tests => 197);
   }
 }
 
@@ -41,6 +41,8 @@ use Config;
 my $tmp = 'ppptmp';
 my $inc = '';
 my $perl = find_perl();
+my $isVMS = $^O eq 'VMS';
+my $isMAC = $^O eq 'MacOS';
 
 rmtree($tmp) if -d $tmp;
 mkpath($tmp) or die "mkpath $tmp: $!\n";
@@ -48,7 +50,15 @@ chdir($tmp) or die "chdir $tmp: $!\n";
 
 if ($ENV{'PERL_CORE'}) {
   if (-d '../../lib') {
-    $inc = $^O eq 'VMS' ? '-"I../../lib"' : '-I../../lib';
+    if ($isVMS) {
+      $inc = '"-I../../lib"';
+    }
+    elsif ($isMAC) {
+      $inc = '-I:::lib';
+    }
+    else {
+      $inc = '-I../../lib';
+    }
     unshift @INC, '../../lib';
   }
 }
@@ -63,15 +73,30 @@ END {
 
 ok(&Devel::PPPort::WriteFile("ppport.h"));
 
+sub comment
+{
+  my $c = shift;
+  $c =~ s/^/# | /mg;
+  $c .= "\n" unless $c =~ /[\r\n]$/;
+  print $c;
+}
+
 sub ppport
 {
-  my @args = @_;
-  print "# *** running $perl $inc ppport.h @args ***\n";
-  my $out = join '', `$perl $inc ppport.h @args`;
-  my $copy = $out;
-  $copy =~ s/^/# | /mg;
-  print "$copy\n";
-  return $out;
+  my @args = ('ppport.h', @_);
+  unshift @args, $inc if $inc;
+  my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
+  $run .= ' -MMac::err=unix' if $isMAC;
+  for (@args) {
+    $_ = qq("$_") if $isVMS && /^[^"]/;
+    $run .= " $_";
+  }
+  print "# *** running $run ***\n";
+  $run .= ' 2>&1' unless $isMAC;
+  my @out = `$run`;
+  my $out = join '', @out;
+  comment($out);
+  return wantarray ? @out : $out;
 }
 
 sub matches
@@ -100,9 +125,7 @@ sub eq_files
     }
     $_ = do { local $/; <F> };
     close F;
-    my $copy = $_;
-    $copy =~ s/^/# | /mg;
-    print "$copy\n";
+    comment($_);
   }
   return $f1 eq $f2;
 }
@@ -151,11 +174,11 @@ for $t (@tests) {
 sub find_perl
 {
   my $perl = $^X;
-  
-  return $perl if $^O eq 'VMS';
-  
+
+  return $perl if $isVMS;
+
   my $exe = $Config{'_exe'} || '';
-  
+
   if ($perl =~ /^perl\Q$exe\E$/i) {
     $perl = "perl$exe";
     eval "require File::Spec";
@@ -165,13 +188,13 @@ sub find_perl
       $perl = File::Spec->catfile(File::Spec->curdir(), $perl);
     }
   }
-  
+
   if ($perl !~ /\Q$exe\E$/i) {
     $perl .= $exe;
   }
-  
+
   warn "find_perl: cannot find $perl from $^X" unless -f $perl;
-  
+
   return $perl;
 }
 
@@ -182,10 +205,10 @@ ok($o =~ /^Usage:.*ppport\.h/m);
 ok($o =~ /--help/m);
 
 $o = ppport(qw(--nochanges));
-ok($o =~ /^scanning.*test\.xs/mi);
-ok($o =~ /analyzing.*test\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
-ok(matches($o, 'analyzing', 'mi'), 1);
+ok($o =~ /^Scanning.*test\.xs/mi);
+ok($o =~ /Analyzing.*test\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
 ok($o =~ /Uses Perl_newSViv instead of newSViv/);
 
 $o = ppport(qw(--quiet --nochanges));
@@ -200,9 +223,9 @@ Perl_newSViv();
 # check if C and C++ comments are filtered correctly
 
 my $o = ppport(qw(--copy=a));
-ok($o =~ /^scanning.*MyExt\.xs/mi);
-ok($o =~ /analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Uses grok_bin/m);
 ok($o !~ /^Uses newSVpv/m);
@@ -212,9 +235,9 @@ ok(eq_files('MyExt.xsa', 'MyExt.ra'));
 # check if C++ are left untouched with --cplusplus
 
 $o = ppport(qw(--copy=b --cplusplus));
-ok($o =~ /^scanning.*MyExt\.xs/mi);
-ok($o =~ /analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
+ok($o =~ /^Scanning.*MyExt\.xs/mi);
+ok($o =~ /Analyzing.*MyExt\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Uses grok_bin/m);
 ok($o !~ /^Uses newSVpv/m);
@@ -224,14 +247,14 @@ ok(eq_files('MyExt.xsb', 'MyExt.rb'));
 unlink qw(MyExt.xsa MyExt.xsb);
 
 ---------------------------- MyExt.xs -----------------------------------------
-  
+
 newSVuv();
     // newSVpv();
   XPUSHs(foo);
 /* grok_bin(); */
 
 ---------------------------- MyExt.ra -----------------------------------------
-  
+
 #include "ppport.h"
 newSVuv();
     /* newSVpv(); */
@@ -239,7 +262,7 @@ newSVuv();
 /* grok_bin(); */
 
 ---------------------------- MyExt.rb -----------------------------------------
-  
+
 #include "ppport.h"
 newSVuv();
     // newSVpv();
@@ -249,9 +272,9 @@ newSVuv();
 ===============================================================================
 
 my $o = ppport(qw(--nochanges file1.xs));
-ok($o =~ /^scanning.*file1\.xs/mi);
-ok($o =~ /analyzing.*file1\.xs/mi);
-ok($o !~ /^scanning.*file2\.xs/mi);
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
 ok($o =~ /^Uses newCONSTSUB/m);
 ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
 ok($o =~ /hint for newCONSTSUB/m);
@@ -259,9 +282,9 @@ ok($o !~ /hint for sv_2pv_nolen/m);
 ok($o =~ /^Looks good/m);
 
 $o = ppport(qw(--nochanges --nohints file1.xs));
-ok($o =~ /^scanning.*file1\.xs/mi);
-ok($o =~ /analyzing.*file1\.xs/mi);
-ok($o !~ /^scanning.*file2\.xs/mi);
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
 ok($o =~ /^Uses newCONSTSUB/m);
 ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
 ok($o !~ /hint for newCONSTSUB/m);
@@ -269,9 +292,9 @@ ok($o !~ /hint for sv_2pv_nolen/m);
 ok($o =~ /^Looks good/m);
 
 $o = ppport(qw(--nochanges --nohints --nodiag file1.xs));
-ok($o =~ /^scanning.*file1\.xs/mi);
-ok($o =~ /analyzing.*file1\.xs/mi);
-ok($o !~ /^scanning.*file2\.xs/mi);
+ok($o =~ /^Scanning.*file1\.xs/mi);
+ok($o =~ /Analyzing.*file1\.xs/mi);
+ok($o !~ /^Scanning.*file2\.xs/mi);
 ok($o !~ /^Uses newCONSTSUB/m);
 ok($o !~ /^Uses SvPV_nolen/m);
 ok($o !~ /hint for newCONSTSUB/m);
@@ -282,27 +305,27 @@ $o = ppport(qw(--nochanges --quiet file1.xs));
 ok($o =~ /^\s*$/);
 
 $o = ppport(qw(--nochanges file2.xs));
-ok($o =~ /^scanning.*file2\.xs/mi);
-ok($o =~ /analyzing.*file2\.xs/mi);
-ok($o !~ /^scanning.*file1\.xs/mi);
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
 ok($o =~ /^Uses mXPUSHp/m);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Looks good/m);
 ok($o =~ /^1 potentially required change detected/m);
 
 $o = ppport(qw(--nochanges --nohints file2.xs));
-ok($o =~ /^scanning.*file2\.xs/mi);
-ok($o =~ /analyzing.*file2\.xs/mi);
-ok($o !~ /^scanning.*file1\.xs/mi);
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
 ok($o =~ /^Uses mXPUSHp/m);
 ok($o =~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Looks good/m);
 ok($o =~ /^1 potentially required change detected/m);
 
 $o = ppport(qw(--nochanges --nohints --nodiag file2.xs));
-ok($o =~ /^scanning.*file2\.xs/mi);
-ok($o =~ /analyzing.*file2\.xs/mi);
-ok($o !~ /^scanning.*file1\.xs/mi);
+ok($o =~ /^Scanning.*file2\.xs/mi);
+ok($o =~ /Analyzing.*file2\.xs/mi);
+ok($o !~ /^Scanning.*file1\.xs/mi);
 ok($o !~ /^Uses mXPUSHp/m);
 ok($o !~ /^Needs to include.*ppport\.h/m);
 ok($o !~ /^Looks good/m);
@@ -327,9 +350,9 @@ mXPUSHp(foo);
 ===============================================================================
 
 my $o = ppport(qw(--nochanges));
-ok($o =~ /^scanning.*FooBar\.xs/mi);
-ok($o =~ /analyzing.*FooBar\.xs/mi);
-ok(matches($o, '^scanning', 'mi'), 1);
+ok($o =~ /^Scanning.*FooBar\.xs/mi);
+ok($o =~ /Analyzing.*FooBar\.xs/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
 ok($o !~ /^Looks good/m);
 ok($o =~ /^Uses grok_bin/m);
 
@@ -342,14 +365,14 @@ grok_bin();
 ===============================================================================
 
 my $o = ppport(qw(--nochanges));
-ok($o =~ /^scanning.*First\.xs/mi);
-ok($o =~ /analyzing.*First\.xs/mi);
-ok($o =~ /^scanning.*second\.h/mi);
-ok($o =~ /analyzing.*second\.h/mi);
-ok($o =~ /^scanning.*sub.*third\.c/mi);
-ok($o =~ /analyzing.*sub.*third\.c/mi);
-ok($o !~ /^scanning.*foobar/mi);
-ok(matches($o, '^scanning', 'mi'), 3);
+ok($o =~ /^Scanning.*First\.xs/mi);
+ok($o =~ /Analyzing.*First\.xs/mi);
+ok($o =~ /^Scanning.*second\.h/mi);
+ok($o =~ /Analyzing.*second\.h/mi);
+ok($o =~ /^Scanning.*sub.*third\.c/mi);
+ok($o =~ /Analyzing.*sub.*third\.c/mi);
+ok($o !~ /^Scanning.*foobar/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
 
 ---------------------------- First.xs -----------------------------------------
 
@@ -382,12 +405,12 @@ ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);
 
 my $o = ppport(qw(--copy=f));
 for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
-  ok($o =~ /^scanning.*\Q$_\E/mi);
-  ok($o =~ /analyzing.*\Q$_\E/i);
+  ok($o =~ /^Scanning.*\Q$_\E/mi);
+  ok($o =~ /Analyzing.*\Q$_\E/i);
 }
-ok(matches($o, '^scanning', 'mi'), 6);
+ok(matches($o, '^Scanning', 'm'), 6);
 
-ok(matches($o, '^Writing copy of', 'mi'), 5);
+ok(matches($o, '^Writing copy of', 'm'), 5);
 ok(!-e "mod5.cf");
 
 for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
@@ -564,9 +587,30 @@ grok_hex();
 my $o = ppport(qw(--nochanges));
 ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
 
+$o = ppport(qw(--nochanges --compat-version=5.5.3));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.005_03));
+ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
+
 $o = ppport(qw(--nochanges --compat-version=5.6.0));
 ok($o !~ /Uses SvPVutf8_force/m);
 
+$o = ppport(qw(--nochanges --compat-version=5.006));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.999));
+ok($o !~ /Uses SvPVutf8_force/m);
+
+$o = ppport(qw(--nochanges --compat-version=6.0.0));
+ok($o =~ /Only Perl 5 is supported/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.1000.999));
+ok($o =~ /Invalid version number: 5.1000.999/m);
+
+$o = ppport(qw(--nochanges --compat-version=5.999.1000));
+ok($o =~ /Invalid version number: 5.999.1000/m);
+
 ---------------------------- FooBar.xs ----------------------------------------
 
 SvPVutf8_force();
@@ -575,7 +619,7 @@ SvPVutf8_force();
 
 my $o = ppport(qw(--nochanges));
 ok($o !~ /potentially required change/);
-ok(matches($o, '^Looks good', 'mi'), 2);
+ok(matches($o, '^Looks good', 'm'), 2);
 
 ---------------------------- FooBar.xs ----------------------------------------
 
@@ -592,3 +636,122 @@ grok_number();
 
 call_pv();
 
+===============================================================================
+
+# check --api-info option
+
+my $o = ppport(qw(--api-info=INT2PTR));
+my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{INT2PTR});
+ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
+ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=Zero));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 1);
+ok(exists $found{Zero});
+ok(matches($o, '^No portability information available\.', 'm'), 1);
+
+$o = ppport(qw(--api-info=/Zero/));
+%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
+ok(scalar keys %found, 2);
+ok(exists $found{Zero});
+ok(exists $found{ZeroD});
+
+===============================================================================
+
+# check --list-provided option
+
+my @o = ppport(qw(--list-provided));
+my %p;
+my $fail = 0;
+for (@o) {
+  my($name, $flags) = /^(\w+)(?:\s+\[(\w+(?:,\s+\w+)*)\])?$/ or $fail++;
+  exists $p{$name} and $fail++;
+  $p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{call_sv});
+ok(not ref $p{call_sv});
+
+ok(exists $p{grok_bin});
+ok(ref $p{grok_bin}, 'HASH');
+ok(scalar keys %{$p{grok_bin}}, 1);
+ok($p{grok_bin}{explicit});
+
+ok(exists $p{gv_stashpvn});
+ok(ref $p{gv_stashpvn}, 'HASH');
+ok(scalar keys %{$p{gv_stashpvn}}, 1);
+ok($p{gv_stashpvn}{hint});
+
+ok(exists $p{sv_catpvf_mg});
+ok(ref $p{sv_catpvf_mg}, 'HASH');
+ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
+ok($p{sv_catpvf_mg}{explicit});
+ok($p{sv_catpvf_mg}{depend});
+
+===============================================================================
+
+# check --list-unsupported option
+
+my @o = ppport(qw(--list-unsupported));
+my %p;
+my $fail = 0;
+for (@o) {
+  my($name, $ver) = /^(\w+)\s*\.+\s*([\d._]+)$/ or $fail++;
+  exists $p{$name} and $fail++;
+  $p{$name} = $ver;
+}
+ok(@o > 100);
+ok($fail, 0);
+
+ok(exists $p{utf8_distance});
+ok($p{utf8_distance}, '5.6.0');
+
+ok(exists $p{save_generic_svref});
+ok($p{save_generic_svref}, '5.005_03');
+
+===============================================================================
+
+# check --nofilter option
+
+my $o = ppport(qw(--nochanges));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
+ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
+ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
+ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok(matches($o, '^Scanning', 'm'), 1);
+ok(matches($o, 'Analyzing', 'm'), 1);
+
+$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
+ok($o =~ /^Scanning.*foo\.cpp/mi);
+ok($o =~ /Analyzing.*foo\.cpp/mi);
+ok($o =~ /^Scanning.*foo\.o/mi);
+ok($o =~ /Analyzing.*foo\.o/mi);
+ok($o =~ /^Scanning.*Makefile/mi);
+ok($o =~ /Analyzing.*Makefile/mi);
+ok(matches($o, '^Scanning', 'm'), 3);
+ok(matches($o, 'Analyzing', 'm'), 3);
+
+---------------------------- foo.cpp ------------------------------------------
+
+newSViv();
+
+---------------------------- foo.o --------------------------------------------
+
+newSViv();
+
+---------------------------- Makefile.PL --------------------------------------
+
+newSViv();
+