Update to a newer ppport.h to get things working on 5.8.8 again
Dave Rolsky [Mon, 11 Aug 2008 20:16:14 +0000 (20:16 +0000)]
ppport.h

index 81a70a3..e8e9003 100644 (file)
--- a/ppport.h
+++ b/ppport.h
@@ -4,10 +4,9 @@
 /*
 ----------------------------------------------------------------------
 
-    ppport.h -- Perl/Pollution/Portability Version 3.06_01
+    ppport.h -- Perl/Pollution/Portability Version 3.14
 
-    Automatically created by Devel::PPPort running under
-    perl 5.008008 on Wed Dec 12 09:11:01 2007.
+    Automatically created by Devel::PPPort running under perl 5.008008.
 
     Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
     includes in parts/inc/ instead.
@@ -22,7 +21,7 @@ SKIP
 
 =head1 NAME
 
-ppport.h - Perl/Pollution/Portability version 3.06_01
+ppport.h - Perl/Pollution/Portability version 3.14
 
 =head1 SYNOPSIS
 
@@ -32,6 +31,8 @@ ppport.h - Perl/Pollution/Portability version 3.06_01
 
   --help                      show short help
 
+  --version                   show version
+
   --patch=file                write one patch file with changes
   --copy=suffix               write changed copies with suffix
   --diff=program              use diff program and options
@@ -45,6 +46,9 @@ ppport.h - Perl/Pollution/Portability version 3.06_01
   --nochanges                 don't suggest changes
   --nofilter                  don't filter input files
 
+  --strip                     strip all script and doc functionality from
+                              ppport.h
+
   --list-provided             list provided API
   --list-unsupported          list unsupported API
   --api-info=name             show Perl API portability information
@@ -52,7 +56,7 @@ ppport.h - Perl/Pollution/Portability version 3.06_01
 =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.
+installations back to 5.003, and has been tested up to 5.10.0.
 
 =head1 OPTIONS
 
@@ -60,6 +64,10 @@ installations back to 5.003, and has been tested up to 5.9.3.
 
 Display a brief usage summary.
 
+=head2 --version
+
+Display the version of F<ppport.h>.
+
 =head2 --patch=I<file>
 
 If this option is given, a single patch file will be created if
@@ -70,7 +78,10 @@ to be installed on your system.
 
 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.
+not require any external programs. Note that this does not
+automagially add a dot between the original filename and the
+suffix. If you want the dot, you have to include it in the option
+argument.
 
 If neither C<--patch> or C<--copy> are given, the default is to
 simply print the diffs for each file. This requires either
@@ -88,7 +99,7 @@ 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.
+down to a certain Perl version.
 
 =head2 --cplusplus
 
@@ -109,7 +120,7 @@ alerts will be printed.
 =head2 --nohints
 
 Don't output any hints. Hints often contain useful portability
-notes.
+notes. Warnings will still be displayed.
 
 =head2 --nochanges
 
@@ -121,11 +132,22 @@ unless these are also deactivated.
 Don't filter the list of input files. By default, files not looking
 like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
 
+=head2 --strip
+
+Strip all script and documentation functionality from F<ppport.h>.
+This reduces the size of F<ppport.h> dramatically and may be useful
+if you want to include F<ppport.h> in smaller modules without
+increasing their distribution size too much.
+
+The stripped F<ppport.h> will have a C<--unstrip> option that allows
+you to undo the stripping, but only if an appropriate C<Devel::PPPort>
+module is installed.
+
 =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.
+if it has dependencies, and if there are hints or warnings for it.
 
 =head2 --list-unsupported
 
@@ -166,49 +188,64 @@ 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
+If you use one of a few functions or variables that were not present in
+earlier versions of Perl, and that can't be provided using a macro, you
+have to explicitly request support for these functions by adding one or
 more C<#define>s in your source code before the inclusion of F<ppport.h>.
 
-These functions will be marked C<explicit> in the list shown by
-C<--list-provided>.
+These functions or variables 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.
+use such functions or variables, you want either C<static> or global
+variants.
 
-For a C<static> function, use:
+For a C<static> function or variable (used only in a single source
+file), use:
 
     #define NEED_function
+    #define NEED_variable
 
-For a global function, use:
+For a global function or variable (used in multiple source files),
+use:
 
     #define NEED_function_GLOBAL
+    #define NEED_variable_GLOBAL
 
-Note that you mustn't have more than one global request for one
-function in your project.
+Note that you mustn't have more than one global request for the
+same function or variable in your project.
 
-    Function                  Static Request               Global Request
+    Function / Variable       Static Request               Global Request
     -----------------------------------------------------------------------------------------
+    PL_signals                NEED_PL_signals              NEED_PL_signals_GLOBAL
     eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
     grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
     grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
     grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
     grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
     grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
+    load_module()             NEED_load_module             NEED_load_module_GLOBAL
+    my_snprintf()             NEED_my_snprintf             NEED_my_snprintf_GLOBAL
+    my_strlcat()              NEED_my_strlcat              NEED_my_strlcat_GLOBAL
+    my_strlcpy()              NEED_my_strlcpy              NEED_my_strlcpy_GLOBAL
     newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
     newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
-    sv_2pv_nolen()            NEED_sv_2pv_nolen            NEED_sv_2pv_nolen_GLOBAL
+    newSVpvn_flags()          NEED_newSVpvn_flags          NEED_newSVpvn_flags_GLOBAL
+    newSVpvn_share()          NEED_newSVpvn_share          NEED_newSVpvn_share_GLOBAL
+    sv_2pv_flags()            NEED_sv_2pv_flags            NEED_sv_2pv_flags_GLOBAL
     sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
     sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
     sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
+    sv_pvn_force_flags()      NEED_sv_pvn_force_flags      NEED_sv_pvn_force_flags_GLOBAL
     sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
     sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
+    vload_module()            NEED_vload_module            NEED_vload_module_GLOBAL
     vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
+    warner()                  NEED_warner                  NEED_warner_GLOBAL
 
 To avoid namespace conflicts, you can change the namespace of the
-explicitly exported functions using the C<DPPP_NAMESPACE> macro.
-Just C<#define> the macro before including C<ppport.h>:
+explicitly exported functions / variables using the C<DPPP_NAMESPACE>
+macro. Just C<#define> the macro before including C<ppport.h>:
 
     #define DPPP_NAMESPACE MyOwnNamespace_
     #include "ppport.h"
@@ -253,6 +290,10 @@ the C<--diff> option:
 
 This would output context diffs with 10 lines of context.
 
+If you want to create patched copies of your files instead, use:
+
+    perl ppport.h --copy=.new
+
 To display portability information for the C<newSVpvn> function,
 use:
 
@@ -311,7 +352,7 @@ module from CPAN.
 
 =head1 COPYRIGHT
 
-Version 3.x, Copyright (c) 2004-2005, Marcus Holland-Moritz.
+Version 3.x, Copyright (c) 2004-2008, Marcus Holland-Moritz.
 
 Version 2.x, Copyright (C) 2001, Paul Marquess.
 
@@ -328,6 +369,11 @@ See L<Devel::PPPort>.
 
 use strict;
 
+# Disable broken TRIE-optimization
+BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
+
+my $VERSION = 3.14;
+
 my %opt = (
   quiet     => 0,
   diag      => 1,
@@ -335,16 +381,24 @@ my %opt = (
   changes   => 1,
   cplusplus => 0,
   filter    => 1,
+  strip     => 0,
+  version   => 0,
 );
 
 my($ppport) = $0 =~ /([\w.]+)$/;
 my $LF = '(?:\r\n|[\r\n])';   # line feed
 my $HS = "[ \t]";             # horizontal whitespace
 
+# Never use C comments in this file!
+my $ccs  = '/'.'*';
+my $cce  = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
 eval {
   require Getopt::Long;
   Getopt::Long::GetOptions(\%opt, qw(
-    help quiet diag! filter! hints! changes! cplusplus
+    help quiet diag! filter! hints! changes! cplusplus strip version
     patch=s copy=s diff=s compat-version=s
     list-provided list-unsupported api-info=s
   )) or usage();
@@ -355,7 +409,13 @@ if ($@ and grep /^-/, @ARGV) {
   die "Getopt::Long not found. Please don't use any options.\n";
 }
 
+if ($opt{version}) {
+  print "This is $0 $VERSION.\n";
+  exit 0;
+}
+
 usage() if $opt{help};
+strip() if $opt{strip};
 
 if (exists $opt{'compat-version'}) {
   my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
@@ -370,12 +430,6 @@ else {
   $opt{'compat-version'} = 5;
 }
 
-# Never use C comments in this file!!!!!
-my $ccs  = '/'.'*';
-my $cce  = '*'.'/';
-my $rccs = quotemeta $ccs;
-my $rcce = quotemeta $cce;
-
 my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
                 ? ( $1 => {
                       ($2                  ? ( base     => $2 ) : ()),
@@ -412,6 +466,7 @@ ENTER|||
 ERRSV|5.004050||p
 EXTEND|||
 EXTERN_C|5.005000||p
+F0convert|||n
 FREETMPS|||
 GIMME_V||5.004000|n
 GIMME|||n
@@ -433,6 +488,7 @@ HePV||5.004000|
 HeSVKEY_force||5.004000|
 HeSVKEY_set||5.004000|
 HeSVKEY||5.004000|
+HeUTF8||5.011000|
 HeVAL||5.004000|
 HvNAME|||
 INT2PTR|5.006000||p
@@ -452,21 +508,21 @@ IVdf|5.006000||p
 LEAVE|||
 LVRET|||
 MARK|||
+MULTICALL||5.011000|
 MY_CXT_CLONE|5.009002||p
 MY_CXT_INIT|5.007003||p
 MY_CXT|5.007003||p
 MoveD|5.009002||p
 Move|||
-NEWSV|||
 NOOP|5.005000||p
 NUM2PTR|5.006000||p
 NVTYPE|5.006000||p
 NVef|5.006001||p
 NVff|5.006001||p
 NVgf|5.006001||p
-Newc|||
-Newz|||
-New|||
+Newxc|5.009003||p
+Newxz|5.009003||p
+Newx|5.009003||p
 Nullav|||
 Nullch|||
 Nullcv|||
@@ -489,8 +545,10 @@ PAD_SET_CUR_NOSAVE|||
 PAD_SET_CUR|||
 PAD_SVl|||
 PAD_SV|||
-PERL_BCDVERSION|5.009003||p
+PERL_ABS|5.008001||p
+PERL_BCDVERSION|5.011000||p
 PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
+PERL_HASH|5.004000||p
 PERL_INT_MAX|5.004000||p
 PERL_INT_MIN|5.004000||p
 PERL_LONG_MAX|5.004000||p
@@ -506,10 +564,10 @@ PERL_MAGIC_envelem|5.007002||p
 PERL_MAGIC_env|5.007002||p
 PERL_MAGIC_ext|5.007002||p
 PERL_MAGIC_fm|5.007002||p
-PERL_MAGIC_glob|5.007002||p
+PERL_MAGIC_glob|5.011000||p
 PERL_MAGIC_isaelem|5.007002||p
 PERL_MAGIC_isa|5.007002||p
-PERL_MAGIC_mutex|5.007002||p
+PERL_MAGIC_mutex|5.011000||p
 PERL_MAGIC_nkeys|5.007002||p
 PERL_MAGIC_overload_elem|5.007002||p
 PERL_MAGIC_overload_table|5.007002||p
@@ -543,6 +601,7 @@ PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
 PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
 PERL_SHORT_MAX|5.004000||p
 PERL_SHORT_MIN|5.004000||p
+PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
 PERL_SUBVERSION|5.006000||p
 PERL_UCHAR_MAX|5.004000||p
 PERL_UCHAR_MIN|5.004000||p
@@ -550,18 +609,23 @@ PERL_UINT_MAX|5.004000||p
 PERL_UINT_MIN|5.004000||p
 PERL_ULONG_MAX|5.004000||p
 PERL_ULONG_MIN|5.004000||p
+PERL_UNUSED_ARG|5.009003||p
+PERL_UNUSED_CONTEXT|5.009004||p
 PERL_UNUSED_DECL|5.007002||p
+PERL_UNUSED_VAR|5.007002||p
 PERL_UQUAD_MAX|5.004000||p
 PERL_UQUAD_MIN|5.004000||p
+PERL_USE_GCC_BRACE_GROUPS|5.009004||p
 PERL_USHORT_MAX|5.004000||p
 PERL_USHORT_MIN|5.004000||p
 PERL_VERSION|5.006000||p
+PL_DBsignal|5.005000||p
 PL_DBsingle|||pn
 PL_DBsub|||pn
-PL_DBtrace|||n
+PL_DBtrace|||pn
 PL_Sv|5.005000||p
 PL_compiling|5.004050||p
-PL_copline|5.005000||p
+PL_copline|5.011000||p
 PL_curcop|5.004050||p
 PL_curstash|5.004050||p
 PL_debstash|5.004050||p
@@ -570,9 +634,11 @@ PL_diehook|5.004050||p
 PL_dirty|5.004050||p
 PL_dowarn|||pn
 PL_errgv|5.004050||p
+PL_expect|5.011000||p
 PL_hexdigit|5.005000||p
 PL_hints|5.005000||p
 PL_last_in_gv|||n
+PL_laststatval|5.005000||p
 PL_modglobal||5.005000|n
 PL_na|5.004050||pn
 PL_no_modify|5.006000||p
@@ -583,8 +649,10 @@ PL_ppaddr|5.006000||p
 PL_rsfp_filters|5.004050||p
 PL_rsfp|5.004050||p
 PL_rs|||n
+PL_signals|5.008001||p
 PL_stack_base|5.004050||p
 PL_stack_sp|5.004050||p
+PL_statcache|5.005000||p
 PL_stdingv|5.004050||p
 PL_sv_arenaroot|5.004050||p
 PL_sv_no|5.004050||pn
@@ -592,6 +660,7 @@ PL_sv_undef|5.004050||pn
 PL_sv_yes|5.004050||pn
 PL_tainted|5.004050||p
 PL_tainting|5.004050||p
+POP_MULTICALL||5.011000|
 POPi|||n
 POPl|||n
 POPn|||n
@@ -605,6 +674,7 @@ PTR2UV|5.006000||p
 PTR2ul|5.007001||p
 PTRV|5.006000||p
 PUSHMARK|||
+PUSH_MULTICALL||5.011000|
 PUSHi|||
 PUSHmortal|5.009002||p
 PUSHn|||
@@ -614,6 +684,7 @@ PUSHu|5.004000||p
 PUTBACK|||
 PerlIO_clearerr||5.007003|
 PerlIO_close||5.007003|
+PerlIO_context_layers||5.009004|
 PerlIO_eof||5.007003|
 PerlIO_error||5.007003|
 PerlIO_fileno||5.007003|
@@ -634,6 +705,10 @@ PerlIO_stdout||5.007003|
 PerlIO_tell||5.007003|
 PerlIO_unread||5.007003|
 PerlIO_write||5.007003|
+Perl_signbit||5.009005|n
+PoisonFree|5.009004||p
+PoisonNew|5.009004||p
+PoisonWith|5.009004||p
 Poison|5.008000||p
 RETVAL|||n
 Renewc|||
@@ -649,7 +724,20 @@ START_EXTERN_C|5.005000||p
 START_MY_CXT|5.007003||p
 STMT_END|||p
 STMT_START|||p
+STR_WITH_LEN|5.009003||p
 ST|||
+SV_CONST_RETURN|5.009003||p
+SV_COW_DROP_PV|5.008001||p
+SV_COW_SHARED_HASH_KEYS|5.009005||p
+SV_GMAGIC|5.007002||p
+SV_HAS_TRAILING_NUL|5.009004||p
+SV_IMMEDIATE_UNREF|5.007001||p
+SV_MUTABLE_RETURN|5.009003||p
+SV_NOSTEAL|5.009002||p
+SV_SMAGIC|5.009003||p
+SV_UTF8_NO_ENCODING|5.008001||p
+SVf_UTF8|5.006000||p
+SVf|5.006000||p
 SVt_IV|||
 SVt_NV|||
 SVt_PVAV|||
@@ -660,10 +748,12 @@ SVt_PV|||
 Safefree|||
 Slab_Alloc|||
 Slab_Free|||
+Slab_to_rw|||
 StructCopy|||
 SvCUR_set|||
 SvCUR|||
 SvEND|||
+SvGAMAGIC||5.006001|
 SvGETMAGIC|5.004050||p
 SvGROW|||
 SvIOK_UV||5.006000|
@@ -684,7 +774,7 @@ SvIsCOW||5.008003|
 SvLEN_set|||
 SvLEN|||
 SvLOCK||5.007003|
-SvMAGIC_set||5.009003|
+SvMAGIC_set|5.009003||p
 SvNIOK_off|||
 SvNIOKp|||
 SvNIOK|||
@@ -705,10 +795,27 @@ SvPOK_only|||
 SvPOK_on|||
 SvPOKp|||
 SvPOK|||
+SvPVX_const|5.009003||p
+SvPVX_mutable|5.009003||p
 SvPVX|||
+SvPV_const|5.009003||p
+SvPV_flags_const_nolen|5.009003||p
+SvPV_flags_const|5.009003||p
+SvPV_flags_mutable|5.009003||p
+SvPV_flags|5.007002||p
+SvPV_force_flags_mutable|5.009003||p
+SvPV_force_flags_nolen|5.009003||p
+SvPV_force_flags|5.007002||p
+SvPV_force_mutable|5.009003||p
+SvPV_force_nolen|5.009003||p
+SvPV_force_nomg_nolen|5.009003||p
 SvPV_force_nomg|5.007002||p
-SvPV_force|||
+SvPV_force|||p
+SvPV_mutable|5.009003||p
+SvPV_nolen_const|5.009003||p
 SvPV_nolen|5.006000||p
+SvPV_nomg_const_nolen|5.009003||p
+SvPV_nomg_const|5.009003||p
 SvPV_nomg|5.007002||p
 SvPV_set|||
 SvPVbyte_force||5.009002|
@@ -724,16 +831,26 @@ SvPVutf8||5.006000|
 SvPVx|||
 SvPV|||
 SvREFCNT_dec|||
-SvREFCNT_inc|||
+SvREFCNT_inc_NN|5.009004||p
+SvREFCNT_inc_simple_NN|5.009004||p
+SvREFCNT_inc_simple_void_NN|5.009004||p
+SvREFCNT_inc_simple_void|5.009004||p
+SvREFCNT_inc_simple|5.009004||p
+SvREFCNT_inc_void_NN|5.009004||p
+SvREFCNT_inc_void|5.009004||p
+SvREFCNT_inc|||p
 SvREFCNT|||
 SvROK_off|||
 SvROK_on|||
 SvROK|||
-SvRV_set||5.009003|
+SvRV_set|5.009003||p
 SvRV|||
+SvRXOK||5.009005|
+SvRX||5.009005|
 SvSETMAGIC|||
+SvSHARED_HASH|5.009003||p
 SvSHARE||5.007003|
-SvSTASH_set||5.009003|
+SvSTASH_set|5.009003||p
 SvSTASH|||
 SvSetMagicSV_nosteal||5.004000|
 SvSetMagicSV||5.004000|
@@ -746,7 +863,7 @@ SvTAINT|||
 SvTRUE|||
 SvTYPE|||
 SvUNLOCK||5.007003|
-SvUOK||5.007001|
+SvUOK|5.007001|5.006000|p
 SvUPGRADE|||
 SvUTF8_off||5.006000|
 SvUTF8_on||5.006000|
@@ -754,18 +871,67 @@ SvUTF8||5.006000|
 SvUVXx|5.004000||p
 SvUVX|5.004000||p
 SvUV_nomg|5.009001||p
-SvUV_set||5.009003|
+SvUV_set|5.009003||p
 SvUVx|5.004000||p
 SvUV|5.004000||p
 SvVOK||5.008001|
+SvVSTRING_mg|5.009004||p
 THIS|||n
 UNDERBAR|5.009002||p
+UTF8_MAXBYTES|5.009002||p
 UVSIZE|5.006000||p
 UVTYPE|5.006000||p
 UVXf|5.007001||p
 UVof|5.006000||p
 UVuf|5.006000||p
 UVxf|5.006000||p
+WARN_ALL|5.006000||p
+WARN_AMBIGUOUS|5.006000||p
+WARN_ASSERTIONS|5.011000||p
+WARN_BAREWORD|5.006000||p
+WARN_CLOSED|5.006000||p
+WARN_CLOSURE|5.006000||p
+WARN_DEBUGGING|5.006000||p
+WARN_DEPRECATED|5.006000||p
+WARN_DIGIT|5.006000||p
+WARN_EXEC|5.006000||p
+WARN_EXITING|5.006000||p
+WARN_GLOB|5.006000||p
+WARN_INPLACE|5.006000||p
+WARN_INTERNAL|5.006000||p
+WARN_IO|5.006000||p
+WARN_LAYER|5.008000||p
+WARN_MALLOC|5.006000||p
+WARN_MISC|5.006000||p
+WARN_NEWLINE|5.006000||p
+WARN_NUMERIC|5.006000||p
+WARN_ONCE|5.006000||p
+WARN_OVERFLOW|5.006000||p
+WARN_PACK|5.006000||p
+WARN_PARENTHESIS|5.006000||p
+WARN_PIPE|5.006000||p
+WARN_PORTABLE|5.006000||p
+WARN_PRECEDENCE|5.006000||p
+WARN_PRINTF|5.006000||p
+WARN_PROTOTYPE|5.006000||p
+WARN_QW|5.006000||p
+WARN_RECURSION|5.006000||p
+WARN_REDEFINE|5.006000||p
+WARN_REGEXP|5.006000||p
+WARN_RESERVED|5.006000||p
+WARN_SEMICOLON|5.006000||p
+WARN_SEVERE|5.006000||p
+WARN_SIGNAL|5.006000||p
+WARN_SUBSTR|5.006000||p
+WARN_SYNTAX|5.006000||p
+WARN_TAINT|5.006000||p
+WARN_THREADS|5.008000||p
+WARN_UNINITIALIZED|5.006000||p
+WARN_UNOPENED|5.006000||p
+WARN_UNPACK|5.006000||p
+WARN_UNTIE|5.006000||p
+WARN_UTF8|5.006000||p
+WARN_VOID|5.006000||p
 XCPT_CATCH|5.009002||p
 XCPT_RETHROW|5.009002||p
 XCPT_TRY_END|5.009002||p
@@ -784,7 +950,7 @@ XSRETURN_PV|||
 XSRETURN_UNDEF|||
 XSRETURN_UV|5.008001||p
 XSRETURN_YES|||
-XSRETURN|||
+XSRETURN|||p
 XST_mIV|||
 XST_mNO|||
 XST_mNV|||
@@ -794,6 +960,7 @@ XST_mUV|5.008001||p
 XST_mYES|||
 XS_VERSION_BOOTCHECK|||
 XS_VERSION|||
+XSprePUSH|5.006000||p
 XS|||
 ZeroD|5.009002||p
 Zero|||
@@ -801,31 +968,40 @@ _aMY_CXT|5.007003||p
 _pMY_CXT|5.007003||p
 aMY_CXT_|5.007003||p
 aMY_CXT|5.007003||p
+aTHXR_|5.011000||p
+aTHXR|5.011000||p
 aTHX_|5.006000||p
 aTHX|5.006000||p
-add_data|||
+add_data|||n
+addmad|||
 allocmy|||
 amagic_call|||
+amagic_cmp_locale|||
+amagic_cmp|||
+amagic_i_ncmp|||
+amagic_ncmp|||
 any_dup|||
 ao|||
 append_elem|||
 append_list|||
+append_madprops|||
 apply_attrs_my|||
 apply_attrs_string||5.006001|
 apply_attrs|||
 apply|||
-asIV|||
-asUV|||
 atfork_lock||5.007003|n
 atfork_unlock||5.007003|n
 av_arylen_p||5.009003|
 av_clear|||
+av_create_and_push||5.009005|
+av_create_and_unshift_one||5.009005|
 av_delete||5.006000|
 av_exists||5.006000|
 av_extend|||
 av_fake|||
 av_fetch|||
 av_fill|||
+av_iter_p||5.011000|
 av_len|||
 av_make|||
 av_pop|||
@@ -844,14 +1020,13 @@ block_start|||
 boolSV|5.004000||p
 boot_core_PerlIO|||
 boot_core_UNIVERSAL|||
+boot_core_mro|||
 boot_core_xsutils|||
 bytes_from_utf8||5.007001|
+bytes_to_uni|||n
 bytes_to_utf8||5.006001|
-cache_re|||
 call_argv|5.006000||p
 call_atexit||5.006000|
-call_body|||
-call_list_body|||
 call_list||5.004000|
 call_method|5.006000||p
 call_pv|5.006000||p
@@ -862,15 +1037,18 @@ cast_i32||5.006000|
 cast_iv||5.006000|
 cast_ulong||5.006000|
 cast_uv||5.006000|
+check_type_and_open|||
 check_uni|||
 checkcomma|||
 checkposixcc|||
+ckWARN|5.006000||p
 ck_anoncode|||
 ck_bitop|||
 ck_concat|||
 ck_defined|||
 ck_delete|||
 ck_die|||
+ck_each|||
 ck_eof|||
 ck_eval|||
 ck_exec|||
@@ -889,6 +1067,7 @@ ck_match|||
 ck_method|||
 ck_null|||
 ck_open|||
+ck_readline|||
 ck_repeat|||
 ck_require|||
 ck_retarget|||
@@ -906,21 +1085,27 @@ ck_substr|||
 ck_svconst|||
 ck_trunc|||
 ck_unpack|||
-cl_and|||
-cl_anything|||
-cl_init_zero|||
-cl_init|||
-cl_is_anything|||
-cl_or|||
+ckwarn_d||5.009003|
+ckwarn||5.009003|
+cl_and|||n
+cl_anything|||n
+cl_init_zero|||n
+cl_init|||n
+cl_is_anything|||n
+cl_or|||n
+clear_placeholders|||
 closest_cop|||
 convert|||
 cop_free|||
 cr_textfilter|||
+create_eval_scope|||
 croak_nocontext|||vn
 croak|||v
-csighandler||5.007001|n
+csighandler||5.009003|n
+curmad|||
 custom_op_desc||5.007003|
 custom_op_name||5.007003|
+cv_ckproto_len|||
 cv_ckproto|||
 cv_clone|||
 cv_const_sv||5.004000|
@@ -929,20 +1114,23 @@ cv_undef|||
 cx_dump||5.005000|
 cx_dup|||
 cxinc|||
-dAXMARK||5.009003|
+dAXMARK|5.009003||p
 dAX|5.007002||p
 dITEMS|5.007002||p
 dMARK|||
+dMULTICALL||5.009003|
 dMY_CXT_SV|5.007003||p
 dMY_CXT|5.007003||p
 dNOOP|5.006000||p
 dORIGMARK|||
 dSP|||
 dTHR|5.004050||p
+dTHXR|5.011000||p
 dTHXa|5.006000||p
 dTHXoa|5.006000||p
 dTHX|5.006000||p
 dUNDERBAR|5.009002||p
+dVAR|5.009003||p
 dXCPT|5.009002||p
 dXSARGS|||
 dXSI32|||
@@ -956,14 +1144,15 @@ debprofdump||5.005000|
 debprof|||
 debstackptrs||5.007003|
 debstack||5.007003|
+debug_start_match|||
 deb||5.007003|v
-del_he|||
 del_sv|||
+delete_eval_scope|||
 delimcpy||5.004000|
-depcom|||
 deprecate_old|||
 deprecate|||
 despatch_signals||5.007001|
+destroy_matcher|||
 die_nocontext|||vn
 die_where|||
 die|||v
@@ -994,16 +1183,18 @@ do_msgrcv|||
 do_msgsnd|||
 do_oddball|||
 do_op_dump||5.006000|
+do_op_xmldump|||
 do_open9||5.006000|
 do_openn||5.007001|
 do_open||5.004000|
-do_pipe|||
 do_pmop_dump||5.006000|
+do_pmop_xmldump|||
 do_print|||
 do_readline|||
 do_seek|||
 do_semop|||
 do_shmio|||
+do_smartmatch|||
 do_spawn_nowait|||
 do_spawn|||
 do_sprintf|||
@@ -1020,7 +1211,6 @@ do_trans|||
 do_vecget|||
 do_vecset|||
 do_vop|||
-docatch_body|||
 docatch|||
 doeval|||
 dofile|||
@@ -1031,41 +1221,54 @@ dooneliner|||
 doopen_pm|||
 doparseform|||
 dopoptoeval|||
+dopoptogiven|||
 dopoptolabel|||
 dopoptoloop|||
 dopoptosub_at|||
-dopoptosub|||
+dopoptowhen|||
+doref||5.009003|
 dounwind|||
 dowantarray|||
 dump_all||5.006000|
 dump_eval||5.006000|
+dump_exec_pos|||
 dump_fds|||
 dump_form||5.006000|
 dump_indent||5.006000|v
 dump_mstats|||
 dump_packsubs||5.006000|
 dump_sub||5.006000|
+dump_sv_child|||
+dump_trie_interim_list|||
+dump_trie_interim_table|||
+dump_trie|||
 dump_vindent||5.006000|
 dumpuntil|||
 dup_attrlist|||
-emulate_eaccess|||
+emulate_cop_io|||
 eval_pv|5.006000||p
 eval_sv|5.006000||p
+exec_failed|||
 expect_number|||
 fbm_compile||5.005000|
 fbm_instr||5.005000|
 fd_on_nosuid_fs|||
+feature_is_enabled|||
 filter_add|||
 filter_del|||
 filter_gets|||
 filter_read|||
+find_and_forget_pmops|||
+find_array_subscript|||
 find_beginning|||
 find_byclass|||
+find_hash_subscript|||
 find_in_my_stash|||
-find_runcv|||
+find_runcv||5.008001|
 find_rundefsvoffset||5.009002|
 find_script|||
 find_uninit_var|||
+first_symbol|||n
 fold_constants|||
 forbid_setid|||
 force_ident|||
@@ -1073,6 +1276,7 @@ force_list|||
 force_next|||
 force_version|||
 force_word|||
+forget_pmop|||
 form_nocontext|||vn
 form||5.004000|v
 fp_dup|||
@@ -1081,8 +1285,11 @@ free_global_struct|||
 free_tied_hv_pool|||
 free_tmps|||
 gen_constant_list|||
+get_arena|||
+get_aux_mg|||
 get_av|5.006000||p
 get_context||5.006000|n
+get_cvn_flags||5.009005|
 get_cv|5.006000||p
 get_db_sub|||
 get_debug_opts|||
@@ -1095,10 +1302,15 @@ get_op_descs||5.005000|
 get_op_names||5.005000|
 get_opargs|||
 get_ppaddr||5.006000|
+get_re_arg|||
 get_sv|5.006000||p
 get_vtbl||5.005030|
 getcwd_sv||5.007002|
 getenv_len|||
+glob_2number|||
+glob_2pv|||
+glob_assign_glob|||
+glob_assign_ref|||
 gp_dup|||
 gp_free|||
 gp_ref|||
@@ -1111,13 +1323,16 @@ group_end|||
 gv_AVadd|||
 gv_HVadd|||
 gv_IOadd|||
+gv_SVadd|||
 gv_autoload4||5.004000|
 gv_check|||
+gv_const_sv||5.009003|
 gv_dump||5.006000|
 gv_efullname3||5.004000|
 gv_efullname4||5.006001|
 gv_efullname|||
 gv_ename|||
+gv_fetchfile_flags||5.009005|
 gv_fetchfile|||
 gv_fetchmeth_autoload||5.007003|
 gv_fetchmethod_autoload||5.004000|
@@ -1129,21 +1344,27 @@ gv_fetchsv||5.009002|
 gv_fullname3||5.004000|
 gv_fullname4||5.006001|
 gv_fullname|||
+gv_get_super_pkg|||
 gv_handler||5.007001|
 gv_init_sv|||
 gv_init|||
-gv_share|||
-gv_stashpvn|5.006000||p
+gv_name_set||5.009004|
+gv_stashpvn|5.004000||p
+gv_stashpvs||5.009003|
 gv_stashpv|||
 gv_stashsv|||
 he_dup|||
 hek_dup|||
 hfreeentries|||
 hsplit|||
-hv_assert||5.009001|
-hv_auxinit|||
+hv_assert||5.011000|
+hv_auxinit|||n
+hv_backreferences_p|||
 hv_clear_placeholders||5.009001|
 hv_clear|||
+hv_common_key_len||5.010000|
+hv_common||5.010000|
+hv_copy_hints_hv|||
 hv_delayfree_ent||5.004000|
 hv_delete_common|||
 hv_delete_ent||5.004000|
@@ -1152,8 +1373,8 @@ hv_eiter_p||5.009003|
 hv_eiter_set||5.009003|
 hv_exists_ent||5.004000|
 hv_exists|||
-hv_fetch_common|||
 hv_fetch_ent||5.004000|
+hv_fetchs|5.009003||p
 hv_fetch|||
 hv_free_ent||5.004000|
 hv_iterinit|||
@@ -1163,8 +1384,9 @@ hv_iternext_flags||5.008000|
 hv_iternextsv|||
 hv_iternext|||
 hv_iterval|||
+hv_kill_backrefs|||
 hv_ksplit||5.004000|
-hv_magic_check|||
+hv_magic_check|||n
 hv_magic|||
 hv_name_set||5.009003|
 hv_notallowed|||
@@ -1176,13 +1398,14 @@ hv_riter_set||5.009003|
 hv_scalar||5.009001|
 hv_store_ent||5.004000|
 hv_store_flags||5.008000|
+hv_stores|5.009004||p
 hv_store|||
 hv_undef|||
 ibcmp_locale||5.004000|
 ibcmp_utf8||5.007003|
 ibcmp|||
-incl_perldb|||
 incline|||
+incpush_if_exists|||
 incpush|||
 ingroup|||
 init_argv_symbols|||
@@ -1192,7 +1415,6 @@ init_i18nl10n||5.006000|
 init_i18nl14n||5.006000|
 init_ids|||
 init_interp|||
-init_lexer|||
 init_main_stash|||
 init_perllib|||
 init_postdump_symbols|||
@@ -1214,7 +1436,7 @@ isUPPER|||
 is_an_int|||
 is_gv_magical_sv|||
 is_gv_magical|||
-is_handle_constructor|||
+is_handle_constructor|||n
 is_list_assignment|||
 is_lvalue_sub||5.007001|
 is_uni_alnum_lc||5.006000|
@@ -1249,9 +1471,10 @@ 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_slow|||n
 is_utf8_char||5.006000|
 is_utf8_cntrl||5.006000|
+is_utf8_common|||
 is_utf8_digit||5.006000|
 is_utf8_graph||5.006000|
 is_utf8_idcont||5.008000|
@@ -1270,6 +1493,7 @@ isa_lookup|||
 items|||n
 ix|||n
 jmaybe|||
+join_exact|||
 keyword|||
 leave_scope|||
 lex_end|||
@@ -1278,30 +1502,35 @@ linklist|||
 listkids|||
 list|||
 load_module_nocontext|||vn
-load_module||5.006000|v
+load_module|5.006000||pv
 localize|||
+looks_like_bool|||
 looks_like_number|||
 lop|||
 mPUSHi|5.009002||p
 mPUSHn|5.009002||p
 mPUSHp|5.009002||p
+mPUSHs|5.011000||p
 mPUSHu|5.009002||p
 mXPUSHi|5.009002||p
 mXPUSHn|5.009002||p
 mXPUSHp|5.009002||p
+mXPUSHs|5.011000||p
 mXPUSHu|5.009002||p
+mad_free|||
+madlex|||
+madparse|||
 magic_clear_all_env|||
 magic_clearenv|||
+magic_clearhint|||
 magic_clearpack|||
 magic_clearsig|||
 magic_dump||5.006000|
 magic_existspack|||
 magic_freearylen_p|||
 magic_freeovrld|||
-magic_freeregexp|||
 magic_getarylen|||
 magic_getdefelem|||
-magic_getglob|||
 magic_getnkeys|||
 magic_getpack|||
 magic_getpos|||
@@ -1323,13 +1552,11 @@ magic_scalarpack|||
 magic_set_all_env|||
 magic_setamagic|||
 magic_setarylen|||
-magic_setbm|||
 magic_setcollxfrm|||
 magic_setdbline|||
 magic_setdefelem|||
 magic_setenv|||
-magic_setfm|||
-magic_setglob|||
+magic_sethint|||
 magic_setisa|||
 magic_setmglob|||
 magic_setnkeys|||
@@ -1346,10 +1573,13 @@ magic_set|||
 magic_sizepack|||
 magic_wipepack|||
 magicname|||
+make_matcher|||
+make_trie_failtable|||
 make_trie|||
 malloced_size|||n
 malloc||5.007002|n
 markstack_grow|||
+matcher_matches_sv|||
 measure_struct|||
 memEQ|5.004000||p
 memNE|5.004000||p
@@ -1375,7 +1605,16 @@ missingterm|||
 mode_from_discipline|||
 modkids|||
 mod|||
+more_bodies|||
+more_sv|||
 moreswitches|||
+mro_get_linear_isa_c3|||
+mro_get_linear_isa_dfs|||
+mro_get_linear_isa||5.009005|
+mro_isa_changed_in|||
+mro_meta_dup|||
+mro_meta_init|||
+mro_method_changed_in||5.009005|
 mul128|||
 mulexp10|||n
 my_atof2||5.007002|
@@ -1390,6 +1629,10 @@ my_betohl|||n
 my_betohs|||n
 my_bzero|||n
 my_chsize|||
+my_clearenv|||
+my_cxt_index|||
+my_cxt_init|||
+my_dirfd||5.009005|
 my_exit_jump|||
 my_exit|||
 my_failure_exit||5.004000|
@@ -1423,13 +1666,19 @@ my_pclose||5.004000|
 my_popen_list||5.007001|
 my_popen||5.004000|
 my_setenv|||
+my_snprintf|5.009004||pvn
 my_socketpair||5.007003|n
+my_sprintf||5.009003|vn
 my_stat|||
 my_strftime||5.007002|
+my_strlcat|5.009004||pn
+my_strlcpy|5.009004||pn
 my_swabn|||n
 my_swap|||
 my_unexec|||
+my_vsnprintf||5.009004|n
 my|||
+need_utf8|||n
 newANONATTRSUB||5.006000|
 newANONHASH|||
 newANONLIST|||
@@ -1440,11 +1689,14 @@ newAVREF|||
 newAV|||
 newBINOP|||
 newCONDOP|||
-newCONSTSUB|5.006000||p
+newCONSTSUB|5.004050||p
 newCVREF|||
 newDEFSVOP|||
 newFORM|||
 newFOROP|||
+newGIVENOP||5.009003|
+newGIVWHENOP|||
+newGP|||
 newGVOP|||
 newGVREF|||
 newGVgen|||
@@ -1456,36 +1708,47 @@ newLISTOP|||
 newLOGOP|||
 newLOOPEX|||
 newLOOPOP|||
-newMYSUB||5.006000|
+newMADPROP|||
+newMADsv|||
+newMYSUB|||
 newNULLLIST|||
 newOP|||
-newPADOP||5.006000|
+newPADOP|||
 newPMOP|||
 newPROG|||
 newPVOP|||
 newRANGE|||
 newRV_inc|5.004000||p
-newRV_noinc|5.006000||p
+newRV_noinc|5.004000||p
 newRV|||
 newSLICEOP|||
 newSTATEOP|||
 newSUB|||
 newSVOP|||
 newSVREF|||
+newSV_type||5.009005|
 newSVhek||5.009003|
 newSViv|||
 newSVnv|||
 newSVpvf_nocontext|||vn
 newSVpvf||5.004000|v
-newSVpvn_share||5.007001|
-newSVpvn|5.006000||p
+newSVpvn_flags|5.011000||p
+newSVpvn_share|5.007001||p
+newSVpvn_utf8|5.011000||p
+newSVpvn|5.004050||p
+newSVpvs_flags|5.011000||p
+newSVpvs_share||5.009003|
+newSVpvs|5.009003||p
 newSVpv|||
 newSVrv|||
 newSVsv|||
 newSVuv|5.006000||p
 newSV|||
+newTOKEN|||
 newUNOP|||
+newWHENOP||5.009003|
 newWHILEOP||5.009003|
+newXS_flags||5.009004|
 newXSproto||5.006000|
 newXS||5.006000|
 new_collate||5.006000|
@@ -1496,6 +1759,7 @@ new_logop|||
 new_numeric||5.006000|
 new_stackinfo||5.005000|
 new_version||5.009000|
+new_warnings_bitfield|||
 next_symbol|||
 nextargv|||
 nextchar|||
@@ -1507,6 +1771,7 @@ not_a_number|||
 nothreadhook||5.008000|
 nuke_stacks|||
 num_overflow|||n
+offer_nice_chunk|||
 oopsAV|||
 oopsCV|||
 oopsHV|||
@@ -1514,14 +1779,20 @@ op_clear|||
 op_const_sv|||
 op_dump||5.006000|
 op_free|||
+op_getmad_weak|||
+op_getmad|||
 op_null||5.007002|
+op_refcnt_dec|||
+op_refcnt_inc|||
 op_refcnt_lock||5.009002|
 op_refcnt_unlock||5.009002|
+op_xmldump|||
 open_script|||
 pMY_CXT_|5.007003||p
 pMY_CXT|5.007003||p
 pTHX_|5.006000||p
 pTHX|5.006000||p
+packWARN|5.007003||p
 pack_cat||5.007003|
 pack_rec|||
 package|||
@@ -1538,18 +1809,21 @@ pad_fixup_inner_anons|||
 pad_free|||
 pad_leavemy|||
 pad_new|||
+pad_peg|||n
 pad_push|||
 pad_reset|||
 pad_setsv|||
-pad_sv|||
+pad_sv||5.011000|
 pad_swipe|||
 pad_tidy|||
 pad_undef|||
 parse_body|||
 parse_unicode_opts|||
-path_is_absolute|||
+parser_dup|||
+parser_free|||
+path_is_absolute|||n
 peep|||
-pending_ident|||
+pending_Slabs_to_ro|||
 perl_alloc_using|||n
 perl_alloc|||n
 perl_clone_using|||n
@@ -1560,82 +1834,121 @@ perl_free|||n
 perl_parse||5.006000|n
 perl_run|||n
 pidgone|||
+pm_description|||
 pmflag|||
 pmop_dump||5.006000|
+pmop_xmldump|||
 pmruntime|||
 pmtrans|||
 pop_scope|||
-pregcomp|||
+pregcomp||5.009005|
 pregexec|||
+pregfree2||5.011000|
 pregfree|||
 prepend_elem|||
+prepend_madprops|||
+printbuf|||
 printf_nocontext|||vn
-ptr_table_clear|||
-ptr_table_fetch|||
-ptr_table_free|||
-ptr_table_new|||
-ptr_table_split|||
-ptr_table_store|||
+process_special_blocks|||
+ptr_table_clear||5.009005|
+ptr_table_fetch||5.009005|
+ptr_table_find|||n
+ptr_table_free||5.009005|
+ptr_table_new||5.009005|
+ptr_table_split||5.009005|
+ptr_table_store||5.009005|
 push_scope|||
 put_byte|||
 pv_display||5.006000|
+pv_escape||5.009004|
+pv_pretty||5.009004|
 pv_uni_display||5.007003|
 qerror|||
+qsortsvu|||
+re_compile||5.009005|
 re_croak2|||
-re_dup|||
-re_intuit_start||5.006000|
+re_dup_guts|||
+re_intuit_start||5.009005|
 re_intuit_string||5.006000|
+readpipe_override|||
 realloc||5.007002|n
 reentrant_free|||
 reentrant_init|||
 reentrant_retry|||vn
 reentrant_size|||
+ref_array_or_hash|||
+refcounted_he_chain_2hv|||
+refcounted_he_fetch|||
+refcounted_he_free|||
+refcounted_he_new|||
+refcounted_he_value|||
 refkids|||
 refto|||
-ref|||
+ref||5.011000|
+reg_check_named_buff_matched|||
+reg_named_buff_all||5.009005|
+reg_named_buff_exists||5.009005|
+reg_named_buff_fetch||5.009005|
+reg_named_buff_firstkey||5.009005|
+reg_named_buff_iter|||
+reg_named_buff_nextkey||5.009005|
+reg_named_buff_scalar||5.009005|
+reg_named_buff|||
+reg_namedseq|||
 reg_node|||
+reg_numbered_buff_fetch|||
+reg_numbered_buff_length|||
+reg_numbered_buff_store|||
+reg_qr_package|||
+reg_recode|||
+reg_scan_name|||
+reg_skipcomment|||
+reg_stringify||5.009005|
+reg_temp_copy|||
 reganode|||
 regatom|||
 regbranch|||
-regclass_swash||5.007003|
+regclass_swash||5.009004|
 regclass|||
-regcp_set_to|||
 regcppop|||
 regcppush|||
-regcurly|||
+regcurly|||n
+regdump_extflags|||
 regdump||5.005000|
+regdupe_internal|||
 regexec_flags||5.005000|
-reghop3|||
-reghopmaybe3|||
-reghopmaybe|||
-reghop|||
+regfree_internal||5.009005|
+reghop3|||n
+reghop4|||n
+reghopmaybe3|||n
 reginclass|||
 reginitcolors||5.006000|
 reginsert|||
 regmatch|||
 regnext||5.005000|
-regoptail|||
 regpiece|||
 regpposixcc|||
 regprop|||
-regrepeat_hard|||
 regrepeat|||
+regtail_study|||
 regtail|||
 regtry|||
 reguni|||
-regwhite|||
+regwhite|||n
 reg|||
 repeatcpy|||
 report_evil_fh|||
 report_uninit|||
-require_errno|||
 require_pv||5.006000|
+require_tie_mod|||
+restore_magic|||
 rninstr|||
 rsignal_restore|||
 rsignal_save|||
 rsignal_state||5.004000|
 rsignal||5.004000|
 run_body|||
+run_user_filter|||
 runops_debug||5.005000|
 runops_standard||5.005000|
 rvpv_dup|||
@@ -1666,9 +1979,8 @@ save_generic_pvref||5.006001|
 save_generic_svref||5.005030|
 save_gp||5.004000|
 save_hash|||
-save_hek_flags|||
+save_hek_flags|||n
 save_helem||5.004050|
-save_hints||5.005000|
 save_hptr|||
 save_int|||
 save_item|||
@@ -1689,16 +2001,17 @@ save_set_svflags||5.009000|
 save_shared_pvref||5.007003|
 save_sptr|||
 save_svref|||
-save_threadsv||5.005000|
 save_vptr||5.006000|
 savepvn|||
+savepvs||5.009003|
 savepv|||
+savesharedpvn||5.009005|
 savesharedpv||5.007003|
 savestack_grow_cnt||5.008001|
 savestack_grow|||
 savesvpv||5.009002|
 sawparens|||
-scalar_mod_type|||
+scalar_mod_type|||n
 scalarboolean|||
 scalarkids|||
 scalarseq|||
@@ -1719,30 +2032,42 @@ scan_str|||
 scan_subst|||
 scan_trans|||
 scan_version||5.009001|
-scan_vstring||5.008001|
+scan_vstring||5.009005|
 scan_word|||
 scope|||
 screaminstr||5.005000|
-seed|||
+seed||5.008001|
+sequence_num|||
+sequence_tail|||
+sequence|||
 set_context||5.006000|n
-set_csh|||
 set_numeric_local||5.006000|
 set_numeric_radix||5.006000|
 set_numeric_standard||5.006000|
 setdefout|||
 setenv_getix|||
 share_hek_flags|||
-share_hek|||
+share_hek||5.004000|
 si_dup|||
 sighandler|||n
 simplify_sort|||
+skipspace0|||
+skipspace1|||
+skipspace2|||
 skipspace|||
+softref2xv|||
+sortcv_stacked|||
+sortcv_xsub|||
+sortcv|||
+sortsv_flags||5.009003|
 sortsv||5.007003|
+space_join_names_mortal|||
 ss_dup|||
 stack_grow|||
+start_force|||
 start_glob|||
 start_subparse||5.004000|
-stashpv_hvname_match||5.009003|
+stashpv_hvname_match||5.011000|
 stdize_locale|||
 strEQ|||
 strGE|||
@@ -1751,6 +2076,7 @@ strLE|||
 strLT|||
 strNE|||
 str_to_version||5.006000|
+strip_return|||
 strnEQ|||
 strnNE|||
 study_chunk|||
@@ -1761,14 +2087,16 @@ sublex_start|||
 sv_2bool|||
 sv_2cv|||
 sv_2io|||
+sv_2iuv_common|||
 sv_2iuv_non_preserve|||
 sv_2iv_flags||5.009001|
 sv_2iv|||
 sv_2mortal|||
+sv_2num|||
 sv_2nv|||
-sv_2pv_flags||5.007002|
+sv_2pv_flags|5.007002||p
 sv_2pv_nolen|5.006000||p
-sv_2pvbyte_nolen|||
+sv_2pvbyte_nolen|5.006000||p
 sv_2pvbyte|5.006000||p
 sv_2pvutf8_nolen||5.006000|
 sv_2pvutf8||5.006000|
@@ -1780,20 +2108,23 @@ sv_add_backref|||
 sv_backoff|||
 sv_bless|||
 sv_cat_decode||5.008001|
-sv_catpv_mg|5.006000||p
+sv_catpv_mg|5.004050||p
 sv_catpvf_mg_nocontext|||pvn
 sv_catpvf_mg|5.006000|5.004000|pv
 sv_catpvf_nocontext|||vn
 sv_catpvf||5.004000|v
 sv_catpvn_flags||5.007002|
-sv_catpvn_mg|5.006000||p
+sv_catpvn_mg|5.004050||p
 sv_catpvn_nomg|5.007002||p
 sv_catpvn|||
+sv_catpvs|5.009003||p
 sv_catpv|||
 sv_catsv_flags||5.007002|
-sv_catsv_mg|5.006000||p
+sv_catsv_mg|5.004050||p
 sv_catsv_nomg|5.007002||p
 sv_catsv|||
+sv_catxmlpvn|||
+sv_catxmlsv|||
 sv_chop|||
 sv_clean_all|||
 sv_clean_objs|||
@@ -1806,9 +2137,12 @@ sv_copypv||5.007003|
 sv_dec|||
 sv_del_backref|||
 sv_derived_from||5.004000|
+sv_destroyable||5.010000|
+sv_does||5.009004|
 sv_dump|||
 sv_dup|||
 sv_eq|||
+sv_exp_grow|||
 sv_force_normal_flags||5.007001|
 sv_force_normal||5.006000|
 sv_free2|||
@@ -1816,32 +2150,40 @@ sv_free_arenas|||
 sv_free|||
 sv_gets||5.004000|
 sv_grow|||
+sv_i_ncmp|||
 sv_inc|||
 sv_insert|||
 sv_isa|||
 sv_isobject|||
 sv_iv||5.005000|
+sv_kill_backrefs|||
 sv_len_utf8||5.006000|
 sv_len|||
+sv_magic_portable|5.011000|5.004000|p
 sv_magicext||5.007003|
 sv_magic|||
 sv_mortalcopy|||
+sv_ncmp|||
 sv_newmortal|||
 sv_newref|||
 sv_nolocking||5.007003|
 sv_nosharing||5.007003|
-sv_nounlocking||5.007003|
+sv_nounlocking|||
 sv_nv||5.005000|
 sv_peek||5.005000|
+sv_pos_b2u_midway|||
 sv_pos_b2u||5.006000|
+sv_pos_u2b_cached|||
+sv_pos_u2b_forwards|||n
+sv_pos_u2b_midway|||n
 sv_pos_u2b||5.006000|
 sv_pvbyten_force||5.006000|
 sv_pvbyten||5.006000|
 sv_pvbyte||5.006000|
-sv_pvn_force_flags||5.007002|
-sv_pvn_force|||p
-sv_pvn_nomg|5.007003||p
-sv_pvn|5.006000||p
+sv_pvn_force_flags|5.007002||p
+sv_pvn_force|||
+sv_pvn_nomg|5.007003|5.005000|p
+sv_pvn||5.005000|
 sv_pvutf8n_force||5.006000|
 sv_pvutf8n||5.006000|
 sv_pvutf8||5.006000|
@@ -1849,24 +2191,24 @@ sv_pv||5.006000|
 sv_recode_to_utf8||5.007003|
 sv_reftype|||
 sv_release_COW|||
-sv_release_IVX|||
 sv_replace|||
 sv_report_used|||
 sv_reset|||
 sv_rvweaken||5.006000|
-sv_setiv_mg|5.006000||p
+sv_setiv_mg|5.004050||p
 sv_setiv|||
 sv_setnv_mg|5.006000||p
 sv_setnv|||
-sv_setpv_mg|5.006000||p
+sv_setpv_mg|5.004050||p
 sv_setpvf_mg_nocontext|||pvn
 sv_setpvf_mg|5.006000|5.004000|pv
 sv_setpvf_nocontext|||vn
 sv_setpvf||5.004000|v
 sv_setpviv_mg||5.008001|
 sv_setpviv||5.008001|
-sv_setpvn_mg|5.006000||p
+sv_setpvn_mg|5.004050||p
 sv_setpvn|||
+sv_setpvs|5.009004||p
 sv_setpv|||
 sv_setref_iv|||
 sv_setref_nv|||
@@ -1875,11 +2217,11 @@ sv_setref_pv|||
 sv_setref_uv||5.007001|
 sv_setsv_cow|||
 sv_setsv_flags||5.007002|
-sv_setsv_mg|5.006000||p
+sv_setsv_mg|5.004050||p
 sv_setsv_nomg|5.007002||p
 sv_setsv|||
-sv_setuv_mg|5.006000||p
-sv_setuv|5.006000||p
+sv_setuv_mg|5.004050||p
+sv_setuv|5.004000||p
 sv_tainted||5.004000|
 sv_taint||5.004000|
 sv_true||5.005000|
@@ -1890,27 +2232,34 @@ sv_unref_flags||5.007001|
 sv_unref|||
 sv_untaint||5.004000|
 sv_upgrade|||
-sv_usepvn_mg|5.006000||p
+sv_usepvn_flags||5.009004|
+sv_usepvn_mg|5.004050||p
 sv_usepvn|||
 sv_utf8_decode||5.006000|
 sv_utf8_downgrade||5.006000|
 sv_utf8_encode||5.006000|
 sv_utf8_upgrade_flags||5.007002|
 sv_utf8_upgrade||5.007001|
-sv_uv|5.006000||p
+sv_uv|5.005000||p
 sv_vcatpvf_mg|5.006000|5.004000|p
 sv_vcatpvfn||5.004000|
 sv_vcatpvf|5.006000|5.004000|p
 sv_vsetpvf_mg|5.006000|5.004000|p
 sv_vsetpvfn||5.004000|
 sv_vsetpvf|5.006000|5.004000|p
+sv_xmlpeek|||
 svtype|||
 swallow_bom|||
+swap_match_buff|||
 swash_fetch||5.007002|
+swash_get|||
 swash_init||5.006000|
+sys_init3||5.010000|n
+sys_init||5.010000|n
 sys_intern_clear|||
 sys_intern_dup|||
 sys_intern_init|||
+sys_term||5.010000|n
 taint_env|||
 taint_proper|||
 tmps_grow||5.006000|
@@ -1930,10 +2279,14 @@ to_utf8_lower||5.007003|
 to_utf8_substr|||
 to_utf8_title||5.007003|
 to_utf8_upper||5.007003|
+token_free|||
+token_getmad|||
+tokenize_use|||
 tokeq|||
 tokereport|||
 too_few_arguments|||
 too_many_arguments|||
+uiv_2buf|||n
 unlnk|||
 unpack_rec|||
 unpack_str||5.007003|
@@ -1941,25 +2294,24 @@ unpackstring||5.008001|
 unshare_hek_or_pvn|||
 unshare_hek|||
 unsharepvn||5.004000|
-upg_version||5.009000|
+unwind_handler_stack|||
+update_debugger_info|||
+upg_version||5.009005|
 usage|||
-utf16_textfilter|||
 utf16_to_utf8_reversed||5.006001|
 utf16_to_utf8||5.006001|
-utf16rev_textfilter|||
 utf8_distance||5.006000|
 utf8_hop||5.006000|
 utf8_length||5.007001|
-utf8_mg_pos_init|||
-utf8_mg_pos|||
+utf8_mg_pos_cache_update|||
 utf8_to_bytes||5.006001|
 utf8_to_uvchr||5.007001|
 utf8_to_uvuni||5.007001|
-utf8n_to_uvchr||5.007001|
+utf8n_to_uvchr|||
 utf8n_to_uvuni||5.007001|
 utilize|||
 uvchr_to_utf8_flags||5.007003|
-uvchr_to_utf8||5.007001|
+uvchr_to_utf8|||
 uvuni_to_utf8_flags||5.007003|
 uvuni_to_utf8||5.007001|
 validate_suid|||
@@ -1967,27 +2319,39 @@ varname|||
 vcmp||5.009000|
 vcroak||5.006000|
 vdeb||5.007003|
+vdie_common|||
+vdie_croak_common|||
 vdie|||
 vform||5.006000|
 visit|||
 vivify_defelem|||
 vivify_ref|||
-vload_module||5.006000|
+vload_module|5.006000||p
 vmess||5.006000|
 vnewSVpvf|5.006000|5.004000|p
 vnormal||5.009002|
 vnumify||5.009000|
 vstringify||5.009000|
+vverify||5.009003|
 vwarner||5.006000|
 vwarn||5.006000|
 wait4pid|||
 warn_nocontext|||vn
 warner_nocontext|||vn
-warner||5.006000|v
+warner|5.006000|5.004000|pv
 warn|||v
 watch|||
 whichsig|||
+write_no_mem|||
 write_to_stderr|||
+xmldump_all|||
+xmldump_attr|||
+xmldump_eval|||
+xmldump_form|||
+xmldump_indent|||v
+xmldump_packsubs|||
+xmldump_sub|||
+xmldump_vindent|||
 yyerror|||
 yylex|||
 yyparse|||
@@ -2005,21 +2369,64 @@ if (exists $opt{'list-unsupported'}) {
 
 # Scan for possible replacement candidates
 
-my(%replace, %need, %hints, %depends);
+my(%replace, %need, %hints, %warnings, %depends);
 my $replace = 0;
-my $hint = '';
+my($hint, $define, $function);
+
+sub find_api
+{
+  my $code = shift;
+  $code =~ s{
+    / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+  | "[^"\\]*(?:\\.[^"\\]*)*"
+  | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
+  grep { exists $API{$_} } $code =~ /(\w+)/mg;
+}
 
 while (<DATA>) {
   if ($hint) {
+    my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
     if (m{^\s*\*\s(.*?)\s*$}) {
-      $hints{$hint} ||= '';  # suppress warning with older perls
-      $hints{$hint} .= "$1\n";
+      for (@{$hint->[1]}) {
+        $h->{$_} ||= '';  # suppress warning with older perls
+        $h->{$_} .= "$1\n";
+      }
+    }
+    else { undef $hint }
+  }
+
+  $hint = [$1, [split /,?\s+/, $2]]
+      if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
+
+  if ($define) {
+    if ($define->[1] =~ /\\$/) {
+      $define->[1] .= $_;
+    }
+    else {
+      if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
+        my @n = find_api($define->[1]);
+        push @{$depends{$define->[0]}}, @n if @n
+      }
+      undef $define;
+    }
+  }
+
+  $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
+
+  if ($function) {
+    if (/^}/) {
+      if (exists $API{$function->[0]}) {
+        my @n = find_api($function->[1]);
+        push @{$depends{$function->[0]}}, @n if @n
+      }
+      undef $function;
     }
     else {
-      $hint = '';
+      $function->[1] .= $_;
     }
   }
-  $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$};
+
+  $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
 
   $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
   $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
@@ -2033,6 +2440,11 @@ while (<DATA>) {
   $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
 }
 
+for (values %depends) {
+  my %s;
+  $_ = [sort grep !$s{$_}++, @$_];
+}
+
 if (exists $opt{'api-info'}) {
   my $f;
   my $count = 0;
@@ -2051,20 +2463,15 @@ if (exists $opt{'api-info'}) {
       print "Support by $ppport provided back to perl-$todo.\n";
       print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
       print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
-      print "$hints{$f}" if exists $hints{$f};
+      print "\n$hints{$f}" if exists $hints{$f};
+      print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
       $info++;
     }
-    unless ($info) {
-      print "No portability information available.\n";
-    }
+    print "No portability information available.\n" unless $info;
     $count++;
   }
-  if ($count > 0) {
-    print "\n";
-  }
-  else {
-    print "Found no API matching '$opt{'api-info'}'.\n";
-  }
+  $count or print "Found no API matching '$opt{'api-info'}'.";
+  print "\n";
   exit 0;
 }
 
@@ -2076,6 +2483,7 @@ if (exists $opt{'list-provided'}) {
     push @flags, 'explicit' if exists $need{$f};
     push @flags, 'depend'   if exists $depends{$f};
     push @flags, 'hint'     if exists $hints{$f};
+    push @flags, 'warning'  if exists $warnings{$f};
     my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
     print "$f$flags\n";
   }
@@ -2083,23 +2491,35 @@ if (exists $opt{'list-provided'}) {
 }
 
 my @files;
-my @srcext = qw( xs c h cc cpp );
-my $srcext = join '|', @srcext;
+my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
+my $srcext = join '|', map { quotemeta $_ } @srcext;
 
 if (@ARGV) {
   my %seen;
-  @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
+  for (@ARGV) {
+    if (-e) {
+      if (-f) {
+        push @files, $_ unless $seen{$_}++;
+      }
+      else { warn "'$_' is not a file.\n" }
+    }
+    else {
+      my @new = grep { -f } glob $_
+          or warn "'$_' does not exist.\n";
+      push @files, grep { !$seen{$_}++ } @new;
+    }
+  }
 }
 else {
   eval {
     require File::Find;
     File::Find::find(sub {
-      $File::Find::name =~ /\.($srcext)$/i
+      $File::Find::name =~ /($srcext)$/i
           and push @files, $File::Find::name;
     }, '.');
   };
   if ($@) {
-    @files = map { glob "*.$_" } @srcext;
+    @files = map { glob "*$_" } @srcext;
   }
 }
 
@@ -2107,7 +2527,7 @@ 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;
+    my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
     push @{ $out ? \@out : \@in }, $_;
   }
   if (@ARGV && @out) {
@@ -2116,9 +2536,7 @@ if (!@ARGV || $opt{filter}) {
   @files = @in;
 }
 
-unless (@files) {
-  die "No input files given!\n";
-}
+die "No input files given!\n" unless @files;
 
 my(%files, %global, %revreplace);
 %revreplace = reverse %replace;
@@ -2138,30 +2556,22 @@ for $filename (@files) {
 
   my %file = (orig => $c, changes => 0);
 
-  # temporarily remove C comments from the code
+  # Temporarily remove C/XS comments and strings from the code
   my @ccom;
+
   $c =~ s{
-    (
-        [^"'/]+
-      |
-        (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+
-      |
-        (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+
-    )
-  |
-    (/ (?:
-        \*[^*]*\*+(?:[^$ccs][^*]*\*+)* /
-        |
-        /[^\r\n]*
-      ))
-  }{
-    defined $2 and push @ccom, $2;
-    defined $1 ? $1 : "$ccs$#ccom$cce";
-  }egsx;
+    ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
+    | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
+  | ( ^$HS*\#[^\r\n]*
+    | "[^"\\]*(?:\\.[^"\\]*)*"
+    | '[^'\\]*(?:\\.[^'\\]*)*'
+    | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
+  }{ defined $2 and push @ccom, $2;
+     defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
 
   $file{ccom} = \@ccom;
   $file{code} = $c;
-  $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/);
+  $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
 
   my $func;
 
@@ -2172,6 +2582,7 @@ for $filename (@files) {
       $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
       $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
       if (exists $API{$func}{provided}) {
+        $file{uses_provided}{$func}++;
         if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
           $file{uses}{$func}++;
           my @deps = rec_depend($func);
@@ -2182,9 +2593,7 @@ for $filename (@files) {
             }
           }
           for ($func, @deps) {
-            if (exists $need{$_}) {
-              $file{needs}{$_} = 'static';
-            }
+            $file{needs}{$_} = 'static' if exists $need{$_};
           }
         }
       }
@@ -2200,9 +2609,7 @@ for $filename (@files) {
     if (exists $need{$2}) {
       $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
     }
-    else {
-      warning("Possibly wrong #define $1 in $filename");
-    }
+    else { warning("Possibly wrong #define $1 in $filename") }
   }
 
   for (qw(uses needs uses_todo needed_global needed_static)) {
@@ -2239,14 +2646,17 @@ for $filename (@files) {
   my %file = %{$files{$filename}};
   my $func;
   my $c = $file{code};
+  my $warnings = 0;
 
   for $func (sort keys %{$file{uses_Perl}}) {
     if ($API{$func}{varargs}) {
-      my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
-                            { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
-      if ($changes) {
-        warning("Doesn't pass interpreter argument aTHX to Perl_$func");
-        $file{changes} += $changes;
+      unless ($API{$func}{nothxarg}) {
+        my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+                              { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+        if ($changes) {
+          warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+          $file{changes} += $changes;
+        }
       }
     }
     else {
@@ -2261,24 +2671,24 @@ for $filename (@files) {
     $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
   }
 
-  for $func (sort keys %{$file{uses}}) {
-    next unless $file{uses}{$func};   # if it's only a dependency
-    if (exists $file{uses_deps}{$func}) {
-      diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
-    }
-    elsif (exists $replace{$func}) {
-      warning("Uses $func instead of $replace{$func}");
-      $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
-    }
-    else {
-      diag("Uses $func");
+  for $func (sort keys %{$file{uses_provided}}) {
+    if ($file{uses}{$func}) {
+      if (exists $file{uses_deps}{$func}) {
+        diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+      }
+      else {
+        diag("Uses $func");
+      }
     }
-    hint($func);
+    $warnings += hint($func);
   }
 
-  for $func (sort keys %{$file{uses_todo}}) {
-    warning("Uses $func, which may not be portable below perl ",
-            format_version($API{$func}{todo}));
+  unless ($opt{quiet}) {
+    for $func (sort keys %{$file{uses_todo}}) {
+      print "*** WARNING: Uses $func, which may not be portable below perl ",
+            format_version($API{$func}{todo}), ", even with '$ppport'\n";
+      $warnings++;
+    }
   }
 
   for $func (sort keys %{$file{needed_static}}) {
@@ -2377,6 +2787,10 @@ for $filename (@files) {
     warning("Uses $cppc C++ style comment$s, which is not portable");
   }
 
+  my $s = $warnings != 1 ? 's' : '';
+  my $warn = $warnings ? " ($warnings warning$s)" : '';
+  info("Analysis completed$warn");
+
   if ($file{changes}) {
     if (exists $opt{copy}) {
       my $newfile = "$filename$opt{copy}";
@@ -2431,6 +2845,8 @@ close PATCH if $patch_opened;
 exit 0;
 
 
+sub try_use { eval "use @_;"; return $@ eq '' }
+
 sub mydiff
 {
   local *F = shift;
@@ -2441,7 +2857,7 @@ sub mydiff
     $diff = run_diff($opt{diff}, $file, $str);
   }
 
-  if (!defined $diff and can_use('Text::Diff')) {
+  if (!defined $diff and try_use('Text::Diff')) {
     $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
     $diff = <<HEADER . $diff;
 --- $file
@@ -2463,7 +2879,6 @@ HEADER
   }
 
   print F $diff;
-
 }
 
 sub run_diff
@@ -2500,18 +2915,14 @@ sub run_diff
   return undef;
 }
 
-sub can_use
-{
-  eval "use @_;";
-  return $@ eq '';
-}
-
 sub rec_depend
 {
-  my $func = shift;
-  my %seen;
+  my($func, $seen) = @_;
   return () unless exists $depends{$func};
-  grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}};
+  $seen = {%{$seen||{}}};
+  return () if $seen->{$func}++;
+  my %s;
+  grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
 }
 
 sub parse_version
@@ -2591,16 +3002,24 @@ sub error
 }
 
 my %given_hints;
+my %given_warnings;
 sub hint
 {
   $opt{quiet} and return;
-  $opt{hints} or return;
   my $func = shift;
-  exists $hints{$func} or return;
-  $given_hints{$func}++ and return;
-  my $hint = $hints{$func};
-  $hint =~ s/^/   /mg;
-  print "   --- hint for $func ---\n", $hint;
+  my $rv = 0;
+  if (exists $warnings{$func} && !$given_warnings{$func}++) {
+    my $warn = $warnings{$func};
+    $warn =~ s!^!*** !mg;
+    print "*** WARNING: $func\n", $warn;
+    $rv++;
+  }
+  if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
+    my $hint = $hints{$func};
+    $hint =~ s/^/   /mg;
+    print "   --- hint for $func ---\n", $hint;
+  }
+  $rv;
 }
 
 sub usage
@@ -2621,6 +3040,52 @@ ENDUSAGE
   exit 2;
 }
 
+sub strip
+{
+  my $self = do { local(@ARGV,$/)=($0); <> };
+  my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
+  $copy =~ s/^(?=\S+)/    /gms;
+  $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
+  $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
+if (\@ARGV && \$ARGV[0] eq '--unstrip') {
+  eval { require Devel::PPPort };
+  \$@ and die "Cannot require Devel::PPPort, please install.\\n";
+  if (\$Devel::PPPort::VERSION < $VERSION) {
+    die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
+      . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
+      . "Please install a newer version, or --unstrip will not work.\\n";
+  }
+  Devel::PPPort::WriteFile(\$0);
+  exit 0;
+}
+print <<END;
+
+Sorry, but this is a stripped version of \$0.
+
+To be able to use its original script and doc functionality,
+please try to regenerate this file using:
+
+  \$^X \$0 --unstrip
+
+END
+/ms;
+  my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
+  $c =~ s{
+    / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+  | ( "[^"\\]*(?:\\.[^"\\]*)*"
+    | '[^'\\]*(?:\\.[^'\\]*)*' )
+  | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
+  $c =~ s!\s+$!!mg;
+  $c =~ s!^$LF!!mg;
+  $c =~ s!^\s*#\s*!#!mg;
+  $c =~ s!^\s+!!mg;
+
+  open OUT, ">$0" or die "cannot strip $0: $!\n";
+  print OUT "$pl$c\n";
+
+  exit 0;
+}
+
 __DATA__
 */
 
@@ -2652,7 +3117,8 @@ __DATA__
 #  endif
 #endif
 
-#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
+#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
+#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION))
 
 /* It is very unlikely that anyone will try to use this with Perl 6
    (or greater), but who knows.
@@ -2998,20 +3464,18 @@ __DATA__
 #ifndef UVSIZE
 #  define UVSIZE                         IVSIZE
 #endif
-
 #ifndef sv_setuv
-#  define sv_setuv(sv, uv)                  \
-   STMT_START {                             \
-       UV TeMpUv = uv;                      \
-       if (TeMpUv <= IV_MAX)                \
-           sv_setiv(sv, TeMpUv);            \
-       else                                 \
-           sv_setnv(sv, (double)TeMpUv);    \
-   } STMT_END
+#  define sv_setuv(sv, uv)               \
+               STMT_START {                         \
+                 UV TeMpUv = uv;                    \
+                 if (TeMpUv <= IV_MAX)              \
+                   sv_setiv(sv, TeMpUv);            \
+                 else                               \
+                   sv_setnv(sv, (double)TeMpUv);    \
+               } STMT_END
 #endif
-
 #ifndef newSVuv
-#  define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#  define newSVuv(uv)                    ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
 #endif
 #ifndef sv_2uv
 #  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
@@ -3039,6 +3503,10 @@ __DATA__
 #ifndef sv_uv
 #  define sv_uv(sv)                      SvUVx(sv)
 #endif
+
+#if !defined(SvUOK) && defined(SvIOK_UV)
+#  define SvUOK(sv) SvIOK_UV(sv)
+#endif
 #ifndef XST_mUV
 #  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
 #endif
@@ -3054,40 +3522,69 @@ __DATA__
 #  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
 #endif
 
-#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
-/* Replace: 1 */
-#  define PL_DBsingle               DBsingle
-#  define PL_DBsub                  DBsub
-#  define PL_Sv                     Sv
-#  define PL_compiling              compiling
-#  define PL_copline                copline
-#  define PL_curcop                 curcop
-#  define PL_curstash               curstash
-#  define PL_debstash               debstash
-#  define PL_defgv                  defgv
-#  define PL_diehook                diehook
-#  define PL_dirty                  dirty
-#  define PL_dowarn                 dowarn
-#  define PL_errgv                  errgv
-#  define PL_hexdigit               hexdigit
-#  define PL_hints                  hints
-#  define PL_na                            na
-#  define PL_no_modify              no_modify
-#  define PL_perl_destruct_level    perl_destruct_level
-#  define PL_perldb                 perldb
-#  define PL_ppaddr                 ppaddr
-#  define PL_rsfp_filters           rsfp_filters
-#  define PL_rsfp                   rsfp
-#  define PL_stack_base             stack_base
-#  define PL_stack_sp               stack_sp
-#  define PL_stdingv                stdingv
-#  define PL_sv_arenaroot           sv_arenaroot
-#  define PL_sv_no                  sv_no
-#  define PL_sv_undef               sv_undef
-#  define PL_sv_yes                 sv_yes
-#  define PL_tainted                tainted
-#  define PL_tainting               tainting
-/* Replace: 0 */
+#ifdef HAS_MEMCMP
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
+#endif
+
+#else
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
+#endif
+
+#endif
+#ifndef MoveD
+#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifndef CopyD
+#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifdef HAS_MEMSET
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
+#endif
+
+#else
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)), d)
+#endif
+
+#endif
+#ifndef PoisonWith
+#  define PoisonWith(d,n,t,b)            (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
+#endif
+
+#ifndef PoisonNew
+#  define PoisonNew(d,n,t)               PoisonWith(d,n,t,0xAB)
+#endif
+
+#ifndef PoisonFree
+#  define PoisonFree(d,n,t)              PoisonWith(d,n,t,0xEF)
+#endif
+
+#ifndef Poison
+#  define Poison(d,n,t)                  PoisonFree(d,n,t)
+#endif
+#ifndef Newx
+#  define Newx(v,n,t)                    New(0,v,n,t)
+#endif
+
+#ifndef Newxc
+#  define Newxc(v,n,t,c)                 Newc(0,v,n,t,c)
+#endif
+
+#ifndef Newxz
+#  define Newxz(v,n,t)                   Newz(0,v,n,t)
 #endif
 
 #ifndef PERL_UNUSED_DECL
@@ -3101,12 +3598,33 @@ __DATA__
 #    define PERL_UNUSED_DECL
 #  endif
 #endif
+
+#ifndef PERL_UNUSED_ARG
+#  if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+#    include <note.h>
+#    define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+#  else
+#    define PERL_UNUSED_ARG(x) ((void)x)
+#  endif
+#endif
+
+#ifndef PERL_UNUSED_VAR
+#  define PERL_UNUSED_VAR(x) ((void)x)
+#endif
+
+#ifndef PERL_UNUSED_CONTEXT
+#  ifdef USE_ITHREADS
+#    define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
+#  else
+#    define PERL_UNUSED_CONTEXT
+#  endif
+#endif
 #ifndef NOOP
-#  define NOOP                           (void)0
+#  define NOOP                           /*EMPTY*/(void)0
 #endif
 
 #ifndef dNOOP
-#  define dNOOP                          extern int Perl___notused PERL_UNUSED_DECL
+#  define dNOOP                          extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
 #endif
 
 #ifndef NVTYPE
@@ -3158,15 +3676,21 @@ typedef NVTYPE NV;
 #  define EXTERN_C extern
 #endif
 
-#ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
-#  if defined(__STRICT_ANSI__) && defined(PERL_GCC_PEDANTIC)
+#if defined(PERL_GCC_PEDANTIC)
+#  ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
 #    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
 #  endif
 #endif
 
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+#  ifndef PERL_USE_GCC_BRACE_GROUPS
+#    define PERL_USE_GCC_BRACE_GROUPS
+#  endif
+#endif
+
 #undef STMT_START
 #undef STMT_END
-#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+#ifdef PERL_USE_GCC_BRACE_GROUPS
 #  define STMT_START   (void)( /* gcc supports ``({ STATEMENTS; })'' */
 #  define STMT_END     )
 #else
@@ -3198,11 +3722,6 @@ typedef NVTYPE NV;
 #ifndef ERRSV
 #  define ERRSV                          get_sv("@",FALSE)
 #endif
-#ifndef newSVpvn
-#  define newSVpvn(data,len)             ((data)                                              \
-                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
-                                    : newSV(0))
-#endif
 
 /* Hint: gv_stashpvn
  * This function's backport doesn't support the length parameter, but
@@ -3232,48 +3751,6 @@ typedef NVTYPE NV;
 #endif
 
 /* Replace: 0 */
-
-#ifdef HAS_MEMCMP
-#ifndef memNE
-#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
-#endif
-
-#ifndef memEQ
-#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
-#endif
-
-#else
-#ifndef memNE
-#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
-#endif
-
-#ifndef memEQ
-#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
-#endif
-
-#endif
-#ifndef MoveD
-#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
-#endif
-
-#ifndef CopyD
-#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
-#endif
-
-#ifdef HAS_MEMSET
-#ifndef ZeroD
-#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
-#endif
-
-#else
-#ifndef ZeroD
-#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)),d)
-#endif
-
-#endif
-#ifndef Poison
-#  define Poison(d,n,t)                  (void)memset((char*)(d), 0xAB, (n) * sizeof(t))
-#endif
 #ifndef dUNDERBAR
 #  define dUNDERBAR                      dNOOP
 #endif
@@ -3291,71 +3768,221 @@ typedef NVTYPE NV;
 #ifndef dXSTARG
 #  define dXSTARG                        SV * targ = sv_newmortal()
 #endif
-#ifndef dTHR
-#  define dTHR                           dNOOP
+#ifndef dAXMARK
+#  define dAXMARK                        I32 ax = POPMARK; \
+                               register SV ** const mark = PL_stack_base + ax++
 #endif
-#ifndef dTHX
-#  define dTHX                           dNOOP
+#ifndef XSprePUSH
+#  define XSprePUSH                      (sp = PL_stack_base + ax - 1)
 #endif
 
-#ifndef dTHXa
-#  define dTHXa(x)                       dNOOP
+#if (PERL_BCDVERSION < 0x5005000)
+#  undef XSRETURN
+#  define XSRETURN(off)                                   \
+      STMT_START {                                        \
+          PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+          return;                                         \
+      } STMT_END
 #endif
-#ifndef pTHX
-#  define pTHX                           void
+#ifndef PERL_ABS
+#  define PERL_ABS(x)                    ((x) < 0 ? -(x) : (x))
+#endif
+#ifndef dVAR
+#  define dVAR                           dNOOP
+#endif
+#ifndef SVf
+#  define SVf                            "_"
+#endif
+#ifndef UTF8_MAXBYTES
+#  define UTF8_MAXBYTES                  UTF8_MAXLEN
+#endif
+#ifndef PERL_HASH
+#  define PERL_HASH(hash,str,len)        \
+     STMT_START        { \
+       const char *s_PeRlHaSh = str; \
+       I32 i_PeRlHaSh = len; \
+       U32 hash_PeRlHaSh = 0; \
+       while (i_PeRlHaSh--) \
+           hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
+       (hash) = hash_PeRlHaSh; \
+    } STMT_END
 #endif
 
-#ifndef pTHX_
-#  define pTHX_
+#ifndef PERL_SIGNALS_UNSAFE_FLAG
+
+#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+
+#if (PERL_BCDVERSION < 0x5008000)
+#  define D_PPP_PERL_SIGNALS_INIT   PERL_SIGNALS_UNSAFE_FLAG
+#else
+#  define D_PPP_PERL_SIGNALS_INIT   0
 #endif
 
-#ifndef aTHX
-#  define aTHX
+#if defined(NEED_PL_signals)
+static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#elif defined(NEED_PL_signals_GLOBAL)
+U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#else
+extern U32 DPPP_(my_PL_signals);
 #endif
+#define PL_signals DPPP_(my_PL_signals)
 
-#ifndef aTHX_
+#endif
+
+/* Hint: PL_ppaddr
+ * Calling an op via PL_ppaddr requires passing a context argument
+ * for threaded builds. Since the context argument is different for
+ * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will
+ * automatically be defined as the correct argument.
+ */
+
+#if (PERL_BCDVERSION <= 0x5005005)
+/* Replace: 1 */
+#  define PL_ppaddr                 ppaddr
+#  define PL_no_modify              no_modify
+/* Replace: 0 */
+#endif
+
+#if (PERL_BCDVERSION <= 0x5004005)
+/* Replace: 1 */
+#  define PL_DBsignal               DBsignal
+#  define PL_DBsingle               DBsingle
+#  define PL_DBsub                  DBsub
+#  define PL_DBtrace                DBtrace
+#  define PL_Sv                     Sv
+#  define PL_compiling              compiling
+#  define PL_copline                copline
+#  define PL_curcop                 curcop
+#  define PL_curstash               curstash
+#  define PL_debstash               debstash
+#  define PL_defgv                  defgv
+#  define PL_diehook                diehook
+#  define PL_dirty                  dirty
+#  define PL_dowarn                 dowarn
+#  define PL_errgv                  errgv
+#  define PL_expect                 expect
+#  define PL_hexdigit               hexdigit
+#  define PL_hints                  hints
+#  define PL_laststatval            laststatval
+#  define PL_na                     na
+#  define PL_perl_destruct_level    perl_destruct_level
+#  define PL_perldb                 perldb
+#  define PL_rsfp_filters           rsfp_filters
+#  define PL_rsfp                   rsfp
+#  define PL_stack_base             stack_base
+#  define PL_stack_sp               stack_sp
+#  define PL_statcache              statcache
+#  define PL_stdingv                stdingv
+#  define PL_sv_arenaroot           sv_arenaroot
+#  define PL_sv_no                  sv_no
+#  define PL_sv_undef               sv_undef
+#  define PL_sv_yes                 sv_yes
+#  define PL_tainted                tainted
+#  define PL_tainting               tainting
+/* Replace: 0 */
+#endif
+
+/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters
+ * Do not use this variable. It is internal to the perl parser
+ * and may change or even be removed in the future. Note that
+ * as of perl 5.9.5 you cannot assign to this variable anymore.
+ */
+
+/* TODO: cannot assign to these vars; is it worth fixing? */
+#if (PERL_BCDVERSION >= 0x5009005)
+#  define PL_expect         (PL_parser ? PL_parser->expect : 0)
+#  define PL_copline        (PL_parser ? PL_parser->copline : 0)
+#  define PL_rsfp           (PL_parser ? PL_parser->rsfp : (PerlIO *) 0)
+#  define PL_rsfp_filters   (PL_parser ? PL_parser->rsfp_filters : (AV *) 0)
+#endif
+#ifndef dTHR
+#  define dTHR                           dNOOP
+#endif
+#ifndef dTHX
+#  define dTHX                           dNOOP
+#endif
+
+#ifndef dTHXa
+#  define dTHXa(x)                       dNOOP
+#endif
+#ifndef pTHX
+#  define pTHX                           void
+#endif
+
+#ifndef pTHX_
+#  define pTHX_
+#endif
+
+#ifndef aTHX
+#  define aTHX
+#endif
+
+#ifndef aTHX_
 #  define aTHX_
 #endif
+
+#if (PERL_BCDVERSION < 0x5006000)
+#  ifdef USE_THREADS
+#    define aTHXR  thr
+#    define aTHXR_ thr,
+#  else
+#    define aTHXR
+#    define aTHXR_
+#  endif
+#  define dTHXR  dTHR
+#else
+#  define aTHXR  aTHX
+#  define aTHXR_ aTHX_
+#  define dTHXR  dTHX
+#endif
 #ifndef dTHXoa
 #  define dTHXoa(x)                      dTHXa(x)
 #endif
+#ifndef mPUSHs
+#  define mPUSHs(s)                      PUSHs(sv_2mortal(s))
+#endif
+
 #ifndef PUSHmortal
 #  define PUSHmortal                     PUSHs(sv_newmortal())
 #endif
 
 #ifndef mPUSHp
-#  define mPUSHp(p,l)                    sv_setpvn_mg(PUSHmortal, (p), (l))
+#  define mPUSHp(p,l)                    sv_setpvn(PUSHmortal, (p), (l))
 #endif
 
 #ifndef mPUSHn
-#  define mPUSHn(n)                      sv_setnv_mg(PUSHmortal, (NV)(n))
+#  define mPUSHn(n)                      sv_setnv(PUSHmortal, (NV)(n))
 #endif
 
 #ifndef mPUSHi
-#  define mPUSHi(i)                      sv_setiv_mg(PUSHmortal, (IV)(i))
+#  define mPUSHi(i)                      sv_setiv(PUSHmortal, (IV)(i))
 #endif
 
 #ifndef mPUSHu
-#  define mPUSHu(u)                      sv_setuv_mg(PUSHmortal, (UV)(u))
+#  define mPUSHu(u)                      sv_setuv(PUSHmortal, (UV)(u))
 #endif
+#ifndef mXPUSHs
+#  define mXPUSHs(s)                     XPUSHs(sv_2mortal(s))
+#endif
+
 #ifndef XPUSHmortal
 #  define XPUSHmortal                    XPUSHs(sv_newmortal())
 #endif
 
 #ifndef mXPUSHp
-#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END
+#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
 #endif
 
 #ifndef mXPUSHn
-#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END
+#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
 #endif
 
 #ifndef mXPUSHi
-#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END
+#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
 #endif
 
 #ifndef mXPUSHu
-#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END
+#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
 #endif
 
 /* Replace: 1 */
@@ -3377,11 +4004,21 @@ typedef NVTYPE NV;
 #ifndef eval_sv
 #  define eval_sv                        perl_eval_sv
 #endif
+#ifndef PERL_LOADMOD_DENY
+#  define PERL_LOADMOD_DENY              0x1
+#endif
+
+#ifndef PERL_LOADMOD_NOIMPORT
+#  define PERL_LOADMOD_NOIMPORT          0x2
+#endif
+
+#ifndef PERL_LOADMOD_IMPORT_OPS
+#  define PERL_LOADMOD_IMPORT_OPS        0x4
+#endif
 
 /* Replace: 0 */
 
 /* Replace perl_eval_pv with eval_pv */
-/* eval_pv depends on eval_sv */
 
 #ifndef eval_pv
 #if defined(NEED_eval_pv)
@@ -3421,6 +4058,106 @@ DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
 
 #endif
 #endif
+
+#ifndef vload_module
+#if defined(NEED_vload_module)
+static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+static
+#else
+extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+#endif
+
+#ifdef vload_module
+#  undef vload_module
+#endif
+#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d)
+#define Perl_vload_module DPPP_(my_vload_module)
+
+#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL)
+
+void
+DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args)
+{
+    dTHR;
+    dVAR;
+    OP *veop, *imop;
+
+    OP * const modname = newSVOP(OP_CONST, 0, name);
+    /* 5.005 has a somewhat hacky force_normal that doesn't croak on
+       SvREADONLY() if PL_compling is true. Current perls take care in
+       ck_require() to correctly turn off SvREADONLY before calling
+       force_normal_flags(). This seems a better fix than fudging PL_compling
+     */
+    SvREADONLY_off(((SVOP*)modname)->op_sv);
+    modname->op_private |= OPpCONST_BARE;
+    if (ver) {
+       veop = newSVOP(OP_CONST, 0, ver);
+    }
+    else
+       veop = NULL;
+    if (flags & PERL_LOADMOD_NOIMPORT) {
+       imop = sawparens(newNULLLIST());
+    }
+    else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+       imop = va_arg(*args, OP*);
+    }
+    else {
+       SV *sv;
+       imop = NULL;
+       sv = va_arg(*args, SV*);
+       while (sv) {
+           imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+           sv = va_arg(*args, SV*);
+       }
+    }
+    {
+       const line_t ocopline = PL_copline;
+       COP * const ocurcop = PL_curcop;
+       const int oexpect = PL_expect;
+
+#if (PERL_BCDVERSION >= 0x5004000)
+       utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
+               veop, modname, imop);
+#else
+       utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
+               modname, imop);
+#endif
+       PL_expect = oexpect;
+       PL_copline = ocopline;
+       PL_curcop = ocurcop;
+    }
+}
+
+#endif
+#endif
+
+#ifndef load_module
+#if defined(NEED_load_module)
+static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+static
+#else
+extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+#endif
+
+#ifdef load_module
+#  undef load_module
+#endif
+#define load_module DPPP_(my_load_module)
+#define Perl_load_module DPPP_(my_load_module)
+
+#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL)
+
+void
+DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...)
+{
+    va_list args;
+    va_start(args, ver);
+    vload_module(flags, name, ver, &args);
+    va_end(args);
+}
+
+#endif
+#endif
 #ifndef newRV_inc
 #  define newRV_inc(sv)                  newRV(sv)   /* Replace */
 #endif
@@ -3456,12 +4193,12 @@ DPPP_(my_newRV_noinc)(SV *sv)
  */
 
 /* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
-#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))) && ((PERL_VERSION != 4) || (PERL_SUBVERSION != 5))
+#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005)
 #if defined(NEED_newCONSTSUB)
-static void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
 static
 #else
-extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
 #endif
 
 #ifdef newCONSTSUB
@@ -3473,7 +4210,7 @@ extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
 #if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
 
 void
-DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
+DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv)
 {
        U32 oldhints = PL_hints;
        HV *old_cop_stash = PL_curcop->cop_stash;
@@ -3487,15 +4224,15 @@ DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
 
        newSUB(
 
-#if   ((PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22)))
+#if   (PERL_BCDVERSION < 0x5003022)
                start_subparse(),
-#elif ((PERL_VERSION == 3) && (PERL_SUBVERSION == 22))
+#elif (PERL_BCDVERSION == 0x5003022)
                start_subparse(0),
 #else  /* 5.003_23  onwards */
                start_subparse(FALSE, 0),
 #endif
 
-               newSVOP(OP_CONST, 0, newSVpv(name,0)),
+               newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
                newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
                newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
        );
@@ -3537,7 +4274,7 @@ DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
  * case below uses it to declare the data as static. */
 #define START_MY_CXT
 
-#if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
+#if (PERL_BCDVERSION < 0x5004068)
 /* Fetches the SV that keeps the per-interpreter data. */
 #define dMY_CXT_SV \
        SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
@@ -3632,7 +4369,8 @@ 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) && (PERL_BCDVERSION != 0x5006000)
+            /* Not very likely, but let's try anyway. */
 #    define NVef          PERL_PRIeldbl
 #    define NVff          PERL_PRIfldbl
 #    define NVgf          PERL_PRIgldbl
@@ -3643,41 +4381,131 @@ DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
 #  endif
 #endif
 
-#ifndef SvPV_nolen
+#ifndef SvREFCNT_inc
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc(sv)           \
+      ({                               \
+          SV * const _sv = (SV*)(sv);  \
+          if (_sv)                     \
+               (SvREFCNT(_sv))++;      \
+          _sv;                         \
+      })
+#  else
+#    define SvREFCNT_inc(sv)   \
+          ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_simple
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_simple(sv)    \
+      ({                                       \
+          if (sv)                              \
+               (SvREFCNT(sv))++;               \
+          (SV *)(sv);                          \
+      })
+#  else
+#    define SvREFCNT_inc_simple(sv) \
+          ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_NN
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_NN(sv)                \
+      ({                                       \
+          SV * const _sv = (SV*)(sv);  \
+          SvREFCNT(_sv)++;             \
+          _sv;                         \
+      })
+#  else
+#    define SvREFCNT_inc_NN(sv) \
+          (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_void
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_void(sv)              \
+      ({                                       \
+          SV * const _sv = (SV*)(sv);  \
+          if (_sv)                     \
+              (void)(SvREFCNT(_sv)++); \
+      })
+#  else
+#    define SvREFCNT_inc_void(sv) \
+          (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+#  endif
+#endif
+#ifndef SvREFCNT_inc_simple_void
+#  define SvREFCNT_inc_simple_void(sv)   STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+#endif
+
+#ifndef SvREFCNT_inc_simple_NN
+#  define SvREFCNT_inc_simple_NN(sv)     (++SvREFCNT(sv), (SV*)(sv))
+#endif
+
+#ifndef SvREFCNT_inc_void_NN
+#  define SvREFCNT_inc_void_NN(sv)       (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef SvREFCNT_inc_simple_void_NN
+#  define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+#endif
+#ifndef newSVpvn
+#  define newSVpvn(data,len)             ((data)                                              \
+                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+                                    : newSV(0))
+#endif
+#ifndef newSVpvn_utf8
+#  define newSVpvn_utf8(s, len, u)       newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+#endif
+#ifndef SVf_UTF8
+#  define SVf_UTF8                       0
+#endif
 
-#if defined(NEED_sv_2pv_nolen)
-static char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+#ifndef newSVpvn_flags
+
+#if defined(NEED_newSVpvn_flags)
+static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char * s, STRLEN len, U32 flags);
 static
 #else
-extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char * s, STRLEN len, U32 flags);
 #endif
 
-#ifdef sv_2pv_nolen
-#  undef sv_2pv_nolen
+#ifdef newSVpvn_flags
+#  undef newSVpvn_flags
 #endif
-#define sv_2pv_nolen(a) DPPP_(my_sv_2pv_nolen)(aTHX_ a)
-#define Perl_sv_2pv_nolen DPPP_(my_sv_2pv_nolen)
+#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c)
+#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags)
 
-#if defined(NEED_sv_2pv_nolen) || defined(NEED_sv_2pv_nolen_GLOBAL)
+#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL)
 
-char *
-DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
+SV *
+DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags)
 {
-  STRLEN n_a;
-  return sv_2pv(sv, &n_a);
+  SV *sv = newSVpvn(s, len);
+  SvFLAGS(sv) |= (flags & SVf_UTF8);
+  return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
 }
 
 #endif
 
-/* Hint: sv_2pv_nolen
- * Use the SvPV_nolen() macro instead of sv_2pv_nolen().
- */
+#endif
 
-/* SvPV_nolen depends on sv_2pv_nolen */
-#define SvPV_nolen(sv) \
-          ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-           ? SvPVX(sv) : sv_2pv_nolen(sv))
+/* Backwards compatibility stuff... :-( */
+#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
+#  define NEED_sv_2pv_flags
+#endif
+#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
+#  define NEED_sv_2pv_flags_GLOBAL
+#endif
 
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
+ */
+#ifndef sv_2pv_nolen
+#  define sv_2pv_nolen(sv)               SvPV_nolen(sv)
 #endif
 
 #ifdef SvPVbyte
@@ -3687,13 +4515,13 @@ DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
  * borrowed from perl-5.7.3.
  */
 
-#if ((PERL_VERSION < 7) || ((PERL_VERSION == 7) && (PERL_SUBVERSION < 0)))
+#if (PERL_BCDVERSION < 0x5007000)
 
 #if defined(NEED_sv_2pvbyte)
-static char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV * sv, STRLEN * lp);
 static
 #else
-extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV * sv, STRLEN * lp);
 #endif
 
 #ifdef sv_2pvbyte
@@ -3705,7 +4533,7 @@ extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
 #if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
 
 char *
-DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
+DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp)
 {
   sv_utf8_downgrade(sv,0);
   return SvPV(sv,*lp);
@@ -3719,7 +4547,6 @@ DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
 
 #undef SvPVbyte
 
-/* SvPVbyte depends on sv_2pvbyte */
 #define SvPVbyte(sv, lp)                                                \
         ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
          ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
@@ -3732,27 +4559,260 @@ DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
 #  define sv_2pvbyte        sv_2pv
 
 #endif
-
-/* sv_2pvbyte_nolen depends on sv_2pv_nolen */
 #ifndef sv_2pvbyte_nolen
-#  define sv_2pvbyte_nolen               sv_2pv_nolen
+#  define sv_2pvbyte_nolen(sv)           sv_2pv_nolen(sv)
 #endif
 
 /* Hint: sv_pvn
  * Always use the SvPV() macro instead of sv_pvn().
  */
-#ifndef sv_pvn
-#  define sv_pvn(sv, len)                SvPV(sv, len)
-#endif
 
 /* Hint: sv_pvn_force
  * Always use the SvPV_force() macro instead of sv_pvn_force().
  */
-#ifndef sv_pvn_force
-#  define sv_pvn_force(sv, len)          SvPV_force(sv, len)
+
+/* If these are undefined, they're not handled by the core anyway */
+#ifndef SV_IMMEDIATE_UNREF
+#  define SV_IMMEDIATE_UNREF             0
 #endif
 
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(vnewSVpvf)
+#ifndef SV_GMAGIC
+#  define SV_GMAGIC                      0
+#endif
+
+#ifndef SV_COW_DROP_PV
+#  define SV_COW_DROP_PV                 0
+#endif
+
+#ifndef SV_UTF8_NO_ENCODING
+#  define SV_UTF8_NO_ENCODING            0
+#endif
+
+#ifndef SV_NOSTEAL
+#  define SV_NOSTEAL                     0
+#endif
+
+#ifndef SV_CONST_RETURN
+#  define SV_CONST_RETURN                0
+#endif
+
+#ifndef SV_MUTABLE_RETURN
+#  define SV_MUTABLE_RETURN              0
+#endif
+
+#ifndef SV_SMAGIC
+#  define SV_SMAGIC                      0
+#endif
+
+#ifndef SV_HAS_TRAILING_NUL
+#  define SV_HAS_TRAILING_NUL            0
+#endif
+
+#ifndef SV_COW_SHARED_HASH_KEYS
+#  define SV_COW_SHARED_HASH_KEYS        0
+#endif
+
+#if (PERL_BCDVERSION < 0x5007002)
+
+#if defined(NEED_sv_2pv_flags)
+static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags);
+#endif
+
+#ifdef sv_2pv_flags
+#  undef sv_2pv_flags
+#endif
+#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c)
+#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags)
+
+#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+  STRLEN n_a = (STRLEN) flags;
+  return sv_2pv(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#if defined(NEED_sv_pvn_force_flags)
+static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV * sv, STRLEN * lp, I32 flags);
+#endif
+
+#ifdef sv_pvn_force_flags
+#  undef sv_pvn_force_flags
+#endif
+#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c)
+#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags)
+
+#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+  STRLEN n_a = (STRLEN) flags;
+  return sv_pvn_force(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) )
+# define DPPP_SVPV_NOLEN_LP_ARG &PL_na
+#else
+# define DPPP_SVPV_NOLEN_LP_ARG 0
+#endif
+#ifndef SvPV_const
+#  define SvPV_const(sv, lp)             SvPV_flags_const(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_mutable
+#  define SvPV_mutable(sv, lp)           SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+#ifndef SvPV_flags
+#  define SvPV_flags(sv, lp, flags)      \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_flags_const
+#  define SvPV_flags_const(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
+                  (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_const_nolen
+#  define SvPV_flags_const_nolen(sv, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX_const(sv) : \
+                  (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_mutable
+#  define SvPV_flags_mutable(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
+                  sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_force
+#  define SvPV_force(sv, lp)             SvPV_force_flags(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nolen
+#  define SvPV_force_nolen(sv)           SvPV_force_flags_nolen(sv, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_mutable
+#  define SvPV_force_mutable(sv, lp)     SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nomg
+#  define SvPV_force_nomg(sv, lp)        SvPV_force_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_force_nomg_nolen
+#  define SvPV_force_nomg_nolen(sv)      SvPV_force_flags_nolen(sv, 0)
+#endif
+#ifndef SvPV_force_flags
+#  define SvPV_force_flags(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_force_flags_nolen
+#  define SvPV_force_flags_nolen(sv, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags))
+#endif
+#ifndef SvPV_force_flags_mutable
+#  define SvPV_force_flags_mutable(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
+                  : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_nolen
+#  define SvPV_nolen(sv)                 \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
+#endif
+#ifndef SvPV_nolen_const
+#  define SvPV_nolen_const(sv)           \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_nomg
+#  define SvPV_nomg(sv, lp)              SvPV_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const
+#  define SvPV_nomg_const(sv, lp)        SvPV_flags_const(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const_nolen
+#  define SvPV_nomg_const_nolen(sv)      SvPV_flags_const_nolen(sv, 0)
+#endif
+#ifndef SvMAGIC_set
+#  define SvMAGIC_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5009003)
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*) (0 + SvPVX(sv)))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              (0 + SvPVX(sv))
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*)((sv)->sv_u.svu_pv))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              ((sv)->sv_u.svu_pv)
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                ((sv)->sv_u.svu_rv = (val)); } STMT_END
+#endif
+
+#endif
+#ifndef SvSTASH_set
+#  define SvSTASH_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5004000)
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf)
 #if defined(NEED_vnewSVpvf)
 static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
 static
@@ -3779,18 +4839,15 @@ DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
 #endif
 #endif
 
-/* sv_vcatpvf depends on sv_vcatpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf)
 #  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
 #endif
 
-/* sv_vsetpvf depends on sv_vsetpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf)
 #  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
 #endif
 
-/* sv_catpvf_mg depends on sv_vcatpvfn, sv_catpvf_mg_nocontext */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg)
 #if defined(NEED_sv_catpvf_mg)
 static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
 static
@@ -3815,9 +4872,8 @@ DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
 #endif
 #endif
 
-/* sv_catpvf_mg_nocontext depends on sv_vcatpvfn */
 #ifdef PERL_IMPLICIT_CONTEXT
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg_nocontext)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext)
 #if defined(NEED_sv_catpvf_mg_nocontext)
 static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
 static
@@ -3845,6 +4901,7 @@ DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
 #endif
 #endif
 
+/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
 #ifndef sv_catpvf_mg
 #  ifdef PERL_IMPLICIT_CONTEXT
 #    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
@@ -3853,8 +4910,7 @@ DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
 #  endif
 #endif
 
-/* sv_vcatpvf_mg depends on sv_vcatpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf_mg)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg)
 #  define sv_vcatpvf_mg(sv, pat, args)                                     \
    STMT_START {                                                            \
      sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
@@ -3862,8 +4918,7 @@ DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
    } STMT_END
 #endif
 
-/* sv_setpvf_mg depends on sv_vsetpvfn, sv_setpvf_mg_nocontext */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg)
 #if defined(NEED_sv_setpvf_mg)
 static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
 static
@@ -3888,9 +4943,8 @@ DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
 #endif
 #endif
 
-/* sv_setpvf_mg_nocontext depends on sv_vsetpvfn */
 #ifdef PERL_IMPLICIT_CONTEXT
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg_nocontext)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext)
 #if defined(NEED_sv_setpvf_mg_nocontext)
 static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
 static
@@ -3918,6 +4972,7 @@ DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
 #endif
 #endif
 
+/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
 #ifndef sv_setpvf_mg
 #  ifdef PERL_IMPLICIT_CONTEXT
 #    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
@@ -3926,14 +4981,316 @@ DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
 #  endif
 #endif
 
-/* sv_vsetpvf_mg depends on sv_vsetpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf_mg)
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg)
 #  define sv_vsetpvf_mg(sv, pat, args)                                     \
    STMT_START {                                                            \
      sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
      SvSETMAGIC(sv);                                                       \
    } STMT_END
 #endif
+
+#ifndef newSVpvn_share
+
+#if defined(NEED_newSVpvn_share)
+static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+static
+#else
+extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+#endif
+
+#ifdef newSVpvn_share
+#  undef newSVpvn_share
+#endif
+#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c)
+#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share)
+
+#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL)
+
+SV *
+DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash)
+{
+  SV *sv;
+  if (len < 0)
+    len = -len;
+  if (!hash)
+    PERL_HASH(hash, (char*) src, len);
+  sv = newSVpvn((char *) src, len);
+  sv_upgrade(sv, SVt_PVIV);
+  SvIVX(sv) = hash;
+  SvREADONLY_on(sv);
+  SvPOK_on(sv);
+  return sv;
+}
+
+#endif
+
+#endif
+#ifndef SvSHARED_HASH
+#  define SvSHARED_HASH(sv)              (0 + SvUVX(sv))
+#endif
+#ifndef WARN_ALL
+#  define WARN_ALL                       0
+#endif
+
+#ifndef WARN_CLOSURE
+#  define WARN_CLOSURE                   1
+#endif
+
+#ifndef WARN_DEPRECATED
+#  define WARN_DEPRECATED                2
+#endif
+
+#ifndef WARN_EXITING
+#  define WARN_EXITING                   3
+#endif
+
+#ifndef WARN_GLOB
+#  define WARN_GLOB                      4
+#endif
+
+#ifndef WARN_IO
+#  define WARN_IO                        5
+#endif
+
+#ifndef WARN_CLOSED
+#  define WARN_CLOSED                    6
+#endif
+
+#ifndef WARN_EXEC
+#  define WARN_EXEC                      7
+#endif
+
+#ifndef WARN_LAYER
+#  define WARN_LAYER                     8
+#endif
+
+#ifndef WARN_NEWLINE
+#  define WARN_NEWLINE                   9
+#endif
+
+#ifndef WARN_PIPE
+#  define WARN_PIPE                      10
+#endif
+
+#ifndef WARN_UNOPENED
+#  define WARN_UNOPENED                  11
+#endif
+
+#ifndef WARN_MISC
+#  define WARN_MISC                      12
+#endif
+
+#ifndef WARN_NUMERIC
+#  define WARN_NUMERIC                   13
+#endif
+
+#ifndef WARN_ONCE
+#  define WARN_ONCE                      14
+#endif
+
+#ifndef WARN_OVERFLOW
+#  define WARN_OVERFLOW                  15
+#endif
+
+#ifndef WARN_PACK
+#  define WARN_PACK                      16
+#endif
+
+#ifndef WARN_PORTABLE
+#  define WARN_PORTABLE                  17
+#endif
+
+#ifndef WARN_RECURSION
+#  define WARN_RECURSION                 18
+#endif
+
+#ifndef WARN_REDEFINE
+#  define WARN_REDEFINE                  19
+#endif
+
+#ifndef WARN_REGEXP
+#  define WARN_REGEXP                    20
+#endif
+
+#ifndef WARN_SEVERE
+#  define WARN_SEVERE                    21
+#endif
+
+#ifndef WARN_DEBUGGING
+#  define WARN_DEBUGGING                 22
+#endif
+
+#ifndef WARN_INPLACE
+#  define WARN_INPLACE                   23
+#endif
+
+#ifndef WARN_INTERNAL
+#  define WARN_INTERNAL                  24
+#endif
+
+#ifndef WARN_MALLOC
+#  define WARN_MALLOC                    25
+#endif
+
+#ifndef WARN_SIGNAL
+#  define WARN_SIGNAL                    26
+#endif
+
+#ifndef WARN_SUBSTR
+#  define WARN_SUBSTR                    27
+#endif
+
+#ifndef WARN_SYNTAX
+#  define WARN_SYNTAX                    28
+#endif
+
+#ifndef WARN_AMBIGUOUS
+#  define WARN_AMBIGUOUS                 29
+#endif
+
+#ifndef WARN_BAREWORD
+#  define WARN_BAREWORD                  30
+#endif
+
+#ifndef WARN_DIGIT
+#  define WARN_DIGIT                     31
+#endif
+
+#ifndef WARN_PARENTHESIS
+#  define WARN_PARENTHESIS               32
+#endif
+
+#ifndef WARN_PRECEDENCE
+#  define WARN_PRECEDENCE                33
+#endif
+
+#ifndef WARN_PRINTF
+#  define WARN_PRINTF                    34
+#endif
+
+#ifndef WARN_PROTOTYPE
+#  define WARN_PROTOTYPE                 35
+#endif
+
+#ifndef WARN_QW
+#  define WARN_QW                        36
+#endif
+
+#ifndef WARN_RESERVED
+#  define WARN_RESERVED                  37
+#endif
+
+#ifndef WARN_SEMICOLON
+#  define WARN_SEMICOLON                 38
+#endif
+
+#ifndef WARN_TAINT
+#  define WARN_TAINT                     39
+#endif
+
+#ifndef WARN_THREADS
+#  define WARN_THREADS                   40
+#endif
+
+#ifndef WARN_UNINITIALIZED
+#  define WARN_UNINITIALIZED             41
+#endif
+
+#ifndef WARN_UNPACK
+#  define WARN_UNPACK                    42
+#endif
+
+#ifndef WARN_UNTIE
+#  define WARN_UNTIE                     43
+#endif
+
+#ifndef WARN_UTF8
+#  define WARN_UTF8                      44
+#endif
+
+#ifndef WARN_VOID
+#  define WARN_VOID                      45
+#endif
+
+#ifndef WARN_ASSERTIONS
+#  define WARN_ASSERTIONS                46
+#endif
+#ifndef packWARN
+#  define packWARN(a)                    (a)
+#endif
+
+#ifndef ckWARN
+#  ifdef G_WARN_ON
+#    define  ckWARN(a)                  (PL_dowarn & G_WARN_ON)
+#  else
+#    define  ckWARN(a)                  PL_dowarn
+#  endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner)
+#if defined(NEED_warner)
+static void DPPP_(my_warner)(U32 err, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_warner)(U32 err, const char *pat, ...);
+#endif
+
+#define Perl_warner DPPP_(my_warner)
+
+#if defined(NEED_warner) || defined(NEED_warner_GLOBAL)
+
+void
+DPPP_(my_warner)(U32 err, const char *pat, ...)
+{
+  SV *sv;
+  va_list args;
+
+  PERL_UNUSED_ARG(err);
+
+  va_start(args, pat);
+  sv = vnewSVpvf(pat, &args);
+  va_end(args);
+  sv_2mortal(sv);
+  warn("%s", SvPV_nolen(sv));
+}
+
+#define warner  Perl_warner
+
+#define Perl_warner_nocontext  Perl_warner
+
+#endif
+#endif
+
+/* concatenating with "" ensures that only literal strings are accepted as argument
+ * note that STR_WITH_LEN() can't be used as argument to macros or functions that
+ * under some configurations might be macros
+ */
+#ifndef STR_WITH_LEN
+#  define STR_WITH_LEN(s)                (s ""), (sizeof(s)-1)
+#endif
+#ifndef newSVpvs
+#  define newSVpvs(str)                  newSVpvn(str "", sizeof(str) - 1)
+#endif
+
+#ifndef newSVpvs_flags
+#  define newSVpvs_flags(str, flags)     newSVpvn_flags(str "", sizeof(str) - 1, flags)
+#endif
+
+#ifndef sv_catpvs
+#  define sv_catpvs(sv, str)             sv_catpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef sv_setpvs
+#  define sv_setpvs(sv, str)             sv_setpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef hv_fetchs
+#  define hv_fetchs(hv, key, lval)       hv_fetch(hv, key "", sizeof(key) - 1, lval)
+#endif
+
+#ifndef hv_stores
+#  define hv_stores(hv, key, val)        hv_store(hv, key "", sizeof(key) - 1, val, 0)
+#endif
 #ifndef SvGETMAGIC
 #  define SvGETMAGIC(x)                  STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
 #endif
@@ -4094,14 +5451,6 @@ DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
 #endif
 
 /* That's the best we can do... */
-#ifndef SvPV_force_nomg
-#  define SvPV_force_nomg                SvPV_force
-#endif
-
-#ifndef SvPV_nomg
-#  define SvPV_nomg                      SvPV
-#endif
-
 #ifndef sv_catpvn_nomg
 #  define sv_catpvn_nomg                 sv_catpvn
 #endif
@@ -4215,6 +5564,50 @@ DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
      SvSETMAGIC(TeMpSv);                \
    } STMT_END
 #endif
+#ifndef SvVSTRING_mg
+#  define SvVSTRING_mg(sv)               (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
+#endif
+
+/* Hint: sv_magic_portable
+ * This is a compatibility function that is only available with
+ * Devel::PPPort. It is NOT in the perl core.
+ * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
+ * it is being passed a name pointer with namlen == 0. In that
+ * case, perl 5.8.0 and later store the pointer, not a copy of it.
+ * The compatibility can be provided back to perl 5.004. With
+ * earlier versions, the code will not compile.
+ */
+
+#if (PERL_BCDVERSION < 0x5004000)
+
+  /* code that uses sv_magic_portable will not compile */
+
+#elif (PERL_BCDVERSION < 0x5008000)
+
+#  define sv_magic_portable(sv, obj, how, name, namlen)     \
+   STMT_START {                                             \
+     SV *SvMp_sv = (sv);                                    \
+     char *SvMp_name = (char *) (name);                     \
+     I32 SvMp_namlen = (namlen);                            \
+     if (SvMp_name && SvMp_namlen == 0)                     \
+     {                                                      \
+       MAGIC *mg;                                           \
+       sv_magic(SvMp_sv, obj, how, 0, 0);                   \
+       mg = SvMAGIC(SvMp_sv);                               \
+       mg->mg_len = -42; /* XXX: this is the tricky part */ \
+       mg->mg_ptr = SvMp_name;                              \
+     }                                                      \
+     else                                                   \
+     {                                                      \
+       sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
+     }                                                      \
+   } STMT_END
+
+#else
+
+#  define sv_magic_portable(a, b, c, d, e)  sv_magic(a, b, c, d, e)
+
+#endif
 
 #ifdef USE_ITHREADS
 #ifndef CopFILE
@@ -4343,8 +5736,6 @@ DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
 #ifndef IS_NUMBER_NAN
 #  define IS_NUMBER_NAN                  0x20
 #endif
-
-/* GROK_NUMERIC_RADIX depends on grok_numeric_radix */
 #ifndef GROK_NUMERIC_RADIX
 #  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
 #endif
@@ -4407,7 +5798,7 @@ DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
             return TRUE;
         }
     }
-#endif /* PERL_VERSION */
+#endif
 #endif /* USE_LOCALE_NUMERIC */
     /* always try "." if numeric radix didn't match because
      * we may have data from different locales mixed */
@@ -4420,8 +5811,6 @@ DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
 #endif
 #endif
 
-/* grok_number depends on grok_numeric_radix */
-
 #ifndef grok_number
 #if defined(NEED_grok_number)
 static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
@@ -4638,10 +6027,10 @@ DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
 
 #ifndef grok_bin
 #if defined(NEED_grok_bin)
-static UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
 static
 #else
-extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
 #endif
 
 #ifdef grok_bin
@@ -4652,7 +6041,7 @@ extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *r
 
 #if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
 UV
-DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
 {
     const char *s = start;
     STRLEN len = *len_p;
@@ -4740,10 +6129,10 @@ DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
 
 #ifndef grok_hex
 #if defined(NEED_grok_hex)
-static UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
 static
 #else
-extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
 #endif
 
 #ifdef grok_hex
@@ -4754,7 +6143,7 @@ extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *r
 
 #if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
 UV
-DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
 {
     const char *s = start;
     STRLEN len = *len_p;
@@ -4842,10 +6231,10 @@ DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
 
 #ifndef grok_oct
 #if defined(NEED_grok_oct)
-static UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
 static
 #else
-extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
 #endif
 
 #ifdef grok_oct
@@ -4856,7 +6245,7 @@ extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *r
 
 #if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
 UV
-DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
 {
     const char *s = start;
     STRLEN len = *len_p;
@@ -4933,6 +6322,40 @@ DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
 #endif
 #endif
 
+#if !defined(my_snprintf)
+#if defined(NEED_my_snprintf)
+static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+static
+#else
+extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+#endif
+
+#define my_snprintf DPPP_(my_my_snprintf)
+#define Perl_my_snprintf DPPP_(my_my_snprintf)
+
+#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
+
+int
+DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
+{
+    dTHX;
+    int retval;
+    va_list ap;
+    va_start(ap, format);
+#ifdef HAS_VSNPRINTF
+    retval = vsnprintf(buffer, len, format, ap);
+#else
+    retval = vsprintf(buffer, format, ap);
+#endif
+    va_end(ap);
+    if (retval >= (int)len)
+       Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
+    return retval;
+}
+
+#endif
+#endif
+
 #ifdef NO_XSLOCKS
 #  ifdef dJMPENV
 #    define dXCPT             dJMPENV; int rEtV = 0
@@ -4949,6 +6372,66 @@ DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
 #  endif
 #endif
 
+#if !defined(my_strlcat)
+#if defined(NEED_my_strlcat)
+static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcat DPPP_(my_my_strlcat)
+#define Perl_my_strlcat DPPP_(my_my_strlcat)
+
+#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
+{
+    Size_t used, length, copy;
+
+    used = strlen(dst);
+    length = strlen(src);
+    if (size > 0 && used < size - 1) {
+        copy = (length >= size - used) ? size - used - 1 : length;
+        memcpy(dst + used, src, copy);
+        dst[used + copy] = '\0';
+    }
+    return used + length;
+}
+#endif
+#endif
+
+#if !defined(my_strlcpy)
+#if defined(NEED_my_strlcpy)
+static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcpy DPPP_(my_my_strlcpy)
+#define Perl_my_strlcpy DPPP_(my_my_strlcpy)
+
+#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
+{
+    Size_t length, copy;
+
+    length = strlen(src);
+    if (size > 0) {
+        copy = (length >= size) ? size - 1 : length;
+        memcpy(dst, src, copy);
+        dst[copy] = '\0';
+    }
+    return length;
+}
+
+#endif
+#endif
+
 #endif /* _P_P_PORTABILITY_H_ */
 
 /* End of File ppport.h */