Added libextutils-xspp-perl
authorNito Martinez <Nito@Qindel.ES>
Fri, 16 Apr 2010 06:37:30 +0000 (07:37 +0100)
committerNito Martinez <Nito@Qindel.ES>
Fri, 16 Apr 2010 06:37:30 +0000 (07:37 +0100)
69 files changed:
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/.version [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/applied-patches [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/fix-build-pl-for-this-version.patch/Build.PL [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/Build.PL [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/Changes [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/MANIFEST [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/META.yml [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/README [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/XSP.yp [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/changelog [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/compat [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/control [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/copyright [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/libextutils-xspp-perl.examples [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/patches/fix-build-pl-for-this-version.patch [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/patches/series [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/rules [new file with mode: 0755]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/watch [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/IntAndString.cc [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/IntAndString.h [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/Makefile.PL [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/Object-WithIntAndString.xsp [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/WithIntAndString.xs [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/lib/Object/WithIntAndString.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/perlobject.map [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/ppport.h [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/t/01load.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/t/02test.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/typemap [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/typemap.xsp [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/inc/My/Build.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp.pod [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Cmd.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Driver.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Grammar.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Lexer.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Node.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Parser.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Typemap.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/scripts/xspp [new file with mode: 0755]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/001_load.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/005_io.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/010_base.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/011_multiple_files.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/015_reference.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/020_rename.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/022_static.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/023_base_classes.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/030_code_blocks.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/031_verbatim_blocks.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/035_include.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/040_plugin.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/075_types.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/080_complex_typemap.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/include.xsp [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/test1.xsp [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/typemap.xsp [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/ExtUtils/XSpp/Plugin/TestPlugin.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/XSP/Plugin.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/XSP/Test.pm [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/zzz_pod.t [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1.diff.gz [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1.dsc [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1.diff.gz [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1.dsc [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1_i386.changes [new file with mode: 0644]
deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07.orig.tar.gz [new file with mode: 0644]
deb/pool/main/libe/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1_all.deb [new file with mode: 0644]

diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/.version b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/.version
new file mode 100644 (file)
index 0000000..0cfbf08
--- /dev/null
@@ -0,0 +1 @@
+2
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/applied-patches b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/applied-patches
new file mode 100644 (file)
index 0000000..f899422
--- /dev/null
@@ -0,0 +1 @@
+fix-build-pl-for-this-version.patch
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/fix-build-pl-for-this-version.patch/Build.PL b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/.pc/fix-build-pl-for-this-version.patch/Build.PL
new file mode 100644 (file)
index 0000000..a4f35b6
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use lib 'inc';
+
+use My::Build;
+
+my $build = My::Build->new
+  ( module_name => 'ExtUtils::XSpp',
+    license     => 'perl',
+    requires    =>
+      { 'perl'                => '5.6.1',
+        'ExtUtils::ParseXS'   => '2.22',
+        },
+    build_requires =>
+      { 'Test::Base'          => '0',
+        'Test::Differences'   => '0',
+        },
+    add_to_cleanup => [ qw(t/files/foo.h) ],
+    script_files => 'scripts',
+    );
+$build->create_build_script;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/Build.PL b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/Build.PL
new file mode 100644 (file)
index 0000000..a236e07
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use lib 'inc';
+
+use My::Build;
+
+my $build = My::Build->new
+  ( module_name => 'ExtUtils::XSpp',
+    license     => 'perl',
+    requires    =>
+      { 'perl'                => '5.6.1',
+        'ExtUtils::ParseXS'   => '2.22',
+        },
+    build_requires =>
+      { 'Test::Base'          => '0',
+        'Test::Differences'   => '0',
+        },
+    add_to_cleanup => [ qw(t/files/foo.h) ],
+    script_files => [ 'scripts/xspp' ],
+    );
+$build->create_build_script;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/Changes b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/Changes
new file mode 100644 (file)
index 0000000..3dfc0e7
--- /dev/null
@@ -0,0 +1,38 @@
+Revision history for Perl extension ExtUtils::XSpp.
+
+0.07  Fri Jan 22 18:07:10 CET 2010
+       - Fix issue with references as method arguments that have
+          template types. (Steffen Mueller)
+
+0.06  Wed Jan 13 20:28:27 CET 2010
+       - When parsing a class declaration, automatically add a typemap
+         for the class.
+       - Add default typemaps for basic C types (integral, floating point
+         and char*).
+       - Automatically setup Perl inheritance for derived C++ classes.
+       - Support template types in function/method parameters and in typeamaps.
+       - Add command line options to run xsubpp directly from xspp.
+
+0.05  Sun Sep 20 14:29:16 CEST 2009
+       - Move the implementation of xspp to ExtUtils::XSpp::Cmd.
+
+0.04
+       - Let XS' length() feature pass through. (Steffen Mueller)
+       - If the length() feature is used, generate ANSI style
+         XSUBs instead of the default K.-R. style. (Steffen Mueller)
+       - Add parsing deep class hierarchies. (Steffen Mueller)
+       - Fix two-part types (eg. unsigned int). (Steffen Mueller)
+       - Non-zero exit value on failure for more graceful build errors.
+         (Steffen Mueller)
+
+0.03
+       - Include a renamed Parse::Yapp::Driver to eschew
+         a dependency. (Steffen Mueller)
+
+0.02
+       - Added an example distribution (Steffen Mueller).
+
+0.01  Wed Jun 17 21:01:00 CEST 2009
+       - Extracted from wxPerl source tree.
+       - Pass through C and C++ comments.
+       - Added test suite.
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/MANIFEST b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/MANIFEST
new file mode 100644 (file)
index 0000000..2e529c0
--- /dev/null
@@ -0,0 +1,50 @@
+Build.PL
+Changes
+examples/Object-WithIntAndString/IntAndString.cc
+examples/Object-WithIntAndString/IntAndString.h
+examples/Object-WithIntAndString/lib/Object/WithIntAndString.pm
+examples/Object-WithIntAndString/Makefile.PL
+examples/Object-WithIntAndString/Object-WithIntAndString.xsp
+examples/Object-WithIntAndString/perlobject.map
+examples/Object-WithIntAndString/ppport.h
+examples/Object-WithIntAndString/t/01load.t
+examples/Object-WithIntAndString/t/02test.t
+examples/Object-WithIntAndString/typemap
+examples/Object-WithIntAndString/typemap.xsp
+examples/Object-WithIntAndString/WithIntAndString.xs
+inc/My/Build.pm
+lib/ExtUtils/XSpp.pm
+lib/ExtUtils/XSpp.pod
+lib/ExtUtils/XSpp/Cmd.pm
+lib/ExtUtils/XSpp/Driver.pm
+lib/ExtUtils/XSpp/Grammar.pm
+lib/ExtUtils/XSpp/Lexer.pm
+lib/ExtUtils/XSpp/Node.pm
+lib/ExtUtils/XSpp/Parser.pm
+lib/ExtUtils/XSpp/Typemap.pm
+MANIFEST
+META.yml
+README
+scripts/xspp
+t/001_load.t
+t/005_io.t
+t/010_base.t
+t/011_multiple_files.t
+t/015_reference.t
+t/020_rename.t
+t/022_static.t
+t/023_base_classes.t
+t/030_code_blocks.t
+t/031_verbatim_blocks.t
+t/035_include.t
+t/040_plugin.t
+t/075_types.t
+t/080_complex_typemap.t
+t/files/include.xsp
+t/files/test1.xsp
+t/files/typemap.xsp
+t/lib/ExtUtils/XSpp/Plugin/TestPlugin.pm
+t/lib/XSP/Plugin.pm
+t/lib/XSP/Test.pm
+t/zzz_pod.t
+XSP.yp
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/META.yml b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/META.yml
new file mode 100644 (file)
index 0000000..3d6007c
--- /dev/null
@@ -0,0 +1,72 @@
+---
+name: ExtUtils-XSpp
+version: 0.07
+author:
+  - 'Mattia Barbon <mbarbon@cpan.org>'
+abstract: XS for C++
+license: perl
+resources:
+  license: http://dev.perl.org/licenses/
+build_requires:
+  Test::Base: 0
+  Test::Differences: 0
+requires:
+  ExtUtils::ParseXS: 2.22
+  perl: v5.6.1
+configure_requires:
+  Module::Build: 0.35
+provides:
+  ExtUtils::XSpp:
+    file: lib/ExtUtils/XSpp.pm
+    version: 0.07
+  ExtUtils::XSpp::Cmd:
+    file: lib/ExtUtils/XSpp/Cmd.pm
+  ExtUtils::XSpp::Driver:
+    file: lib/ExtUtils/XSpp/Driver.pm
+  ExtUtils::XSpp::Grammar:
+    file: lib/ExtUtils/XSpp/Grammar.pm
+  ExtUtils::XSpp::Grammar::YappDriver:
+    file: lib/ExtUtils/XSpp/Grammar.pm
+    version: 1.05
+  ExtUtils::XSpp::Node:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Access:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Argument:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Class:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Comment:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Constructor:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Destructor:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::File:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Function:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Method:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Module:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Package:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Raw:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Node::Type:
+    file: lib/ExtUtils/XSpp/Node.pm
+  ExtUtils::XSpp::Parser:
+    file: lib/ExtUtils/XSpp/Parser.pm
+  ExtUtils::XSpp::Typemap:
+    file: lib/ExtUtils/XSpp/Typemap.pm
+  ExtUtils::XSpp::Typemap::parsed:
+    file: lib/ExtUtils/XSpp/Typemap.pm
+  ExtUtils::XSpp::Typemap::reference:
+    file: lib/ExtUtils/XSpp/Typemap.pm
+  ExtUtils::XSpp::Typemap::simple:
+    file: lib/ExtUtils/XSpp/Typemap.pm
+generated_by: Module::Build version 0.35
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.4.html
+  version: 1.4
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/README b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/README
new file mode 100644 (file)
index 0000000..3304db7
--- /dev/null
@@ -0,0 +1,113 @@
+NAME
+    ExtUtils::XSpp - XS for C++
+
+SYNOPSIS
+      xspp [--typemap=typemap.xsp [--typemap=typemap2.xsp]] Foo.xsp
+
+    In Foo.xs (all in one line):
+
+      INCLUDE: perl -S xspp --typemap=typemap.xsp
+               Foo.xsp |
+
+OVERVIEW
+    XS++ is just a thin layer over plain XS, hence to use it you are
+    supposed to know, at the very least, C++ and XS.
+
+    This means that you will need typemaps for both the normal XS
+    pre-processor *xsubpp* and the XS++ pre-processor *xspp*.
+
+TYPEMAPS
+    There is nothing special about typemap files (i.e. you can put typemaps
+    directly in your .xsp file), but it is handy to have common typemaps in
+    a separate file, to avoid duplication.
+
+      %typemap{<C++ type>}{simple};
+
+    Just let XS++ that this is a valid type, the type will be passed
+    unchanged to XS code except that any "const" qualifiers will be
+    stripped.
+
+      %typemap{<C++ type 1>}{parsed}{%<C++ type 2>%};
+
+    When "C++ type 1" is used, replace it with "C++ type 2" in the generated
+    XS code.
+
+      %typemap{<C++ reference type>}{reference};
+
+    Handle C++ references: the XS variable will be declared as a pointer,
+    and it will be explicitly dereferenced in the function call. If it is
+    used in the return value, the function will create copy of the returned
+    value using a copy constructor.
+
+DESCRIPTION
+    Anything that does not look like a XS++ directive or a class declaration
+    is passed verbatim to XS. If you want XS++ to ignore code that looks
+    like a XS++ directive or class declaration, simply surround it with a
+    raw block delimiter like this:
+
+      %{
+      XS++ won't interpret this
+      %}
+
+  %code
+    See under Classes.
+
+  %file
+      %file{file/path.h};
+      ...
+      %file{file/path2};
+      ...
+      %file{-}
+
+    By default XS++ output goes to standard output; to change this, use the
+    %file directive; use "-" for standard output.
+
+  %module
+      %module{Module__Name};
+
+    Will be used to generate the "MODULE=Module__Name" XS directives.
+
+  %name
+      %name{Perl::Class} class MyClass { ... };
+      %name{Perl::Func} int foo();
+
+    Specifies the perl name under which the C++ class/function will be
+    accessible.
+
+  %typemap
+    See TYPEMAPS above.
+
+  Classes
+      %name{My::Class} class MyClass
+      {
+          // can be called in Perl as My::Class->new( ... );
+          MyClass( int arg );
+          // My::Class->newMyClass( ... );
+          %name{newMyClass} MyClass( const char* str, int arg );
+
+          // standard DESTROY method
+          ~MyClass();
+
+          int GetInt();
+          void SetValue( int arg = -1 );
+
+          %name{SetString} void SetValue( const char* string = NULL );
+
+          // Supply a C<CODE:> or C<CLEANUP:> block for the XS
+          int MyMethod( int a, int b )
+              %code{% RETVAL = a + b; %}
+              %cleanup{% /* do something */ %};
+      };
+
+  Comments
+    C-style "/* ... */" comments will be passed through unchanged. C++-style
+    comments "// ..." will be passed throug with the leading "//" replaced
+    with "##".
+
+AUTHOR
+    Mattia Barbon <mbarbon@cpan.org>
+
+LICENSE
+    This program is free software; you can redistribute it and/or modify it
+    under the same terms as Perl itself.
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/XSP.yp b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/XSP.yp
new file mode 100644 (file)
index 0000000..e0b970d
--- /dev/null
@@ -0,0 +1,250 @@
+#############################################################################
+## Name:        XSP.yp
+## Purpose:     Grammar file for xsubppp.pl
+## Author:      Mattia Barbon
+## Modified by:
+## Created:     01/03/2003
+## RCS-ID:      $Id: XSP.yp,v 1.5 2007/03/10 20:38:57 mbarbon Exp $
+## Copyright:   (c) 2003, 2007, 2009 Mattia Barbon
+## Licence:     This program is free software; you can redistribute it and/or
+##              modify it under the same terms as Perl itself
+#############################################################################
+
+%token OPCURLY CLCURLY OPPAR CLPAR OPANG CLANG SEMICOLON TILDE DCOLON
+%token STAR AMP COMMA EQUAL OPSPECIAL CLSPECIAL
+%token INTEGER RAW_CODE COMMENT ID COLON
+%expect 1
+
+%%
+
+top_list:
+      top               { $_[1] ? [ $_[1] ] : [] }
+    | top_list top      { push @{$_[1]}, $_[2] if $_[2]; $_[1] }
+    ;
+
+top: raw | class | directive
+   | function { $_[1]->resolve_typemaps; $_[1] };
+
+directive:      perc_module SEMICOLON
+                    { ExtUtils::XSpp::Node::Module->new( module => $_[1] ) }
+              | perc_package SEMICOLON
+                    { ExtUtils::XSpp::Node::Package->new( perl_name => $_[1] ) }
+              | perc_file SEMICOLON
+                    { ExtUtils::XSpp::Node::File->new( file => $_[1] ) }
+              | perc_loadplugin SEMICOLON
+                    { $_[0]->YYData->{PARSER}->load_plugin( $_[1] ); undef }
+              | perc_include SEMICOLON
+                    { $_[0]->YYData->{PARSER}->include_file( $_[1] ); undef }
+              | typemap { };
+
+typemap:        p_typemap OPCURLY type CLCURLY OPCURLY ID CLCURLY
+                  special_blocks SEMICOLON
+                    { my $package = "ExtUtils::XSpp::Typemap::" . $_[6];
+                      my $type = $_[3]; my $c = 0;
+                      my %args = map { "arg" . ++$c => $_ }
+                                 map { join( '', @$_ ) }
+                                     @{$_[8] || []};
+                      my $tm = $package->new( type => $type, %args );
+                      ExtUtils::XSpp::Typemap::add_typemap_for_type( $type, $tm );
+                      undef };
+
+raw:    RAW_CODE        { add_data_raw( $_[0], [ $_[1] ] ) }
+      | COMMENT         { add_data_comment( $_[0], $_[1] ) }
+      | special_block   { add_data_raw( $_[0], [ @{$_[1]} ] ) };
+
+class:    class_decl | decorate_class;
+function: function_decl | decorate_function;
+method:   method_decl | decorate_method;
+
+decorate_class:     perc_name class { $_[2]->set_perl_name( $_[1] ); $_[2] };
+decorate_function:  perc_name function { $_[2]->set_perl_name( $_[1] ); $_[2] };
+decorate_method:    perc_name method { $_[2]->set_perl_name( $_[1] ); $_[2] }
+                  | static method { $_[2]->set_static( $_[1] ); $_[2] }
+                  | virtual method { $_[2]->set_virtual( 1 ); $_[2] };
+
+class_decl: 'class' ID base_classes OPCURLY class_body_list CLCURLY SEMICOLON
+                { create_class( $_[0], $_[2], $_[3], $_[5] ) }
+          | 'class' ID base_classes OPCURLY CLCURLY SEMICOLON
+                { create_class( $_[0], $_[2], $_[3], [] ) };
+
+base_classes:
+      COLON base_class              { [ $_[2] ] }
+    | base_classes COMMA base_class { push @{$_[1]}, $_[3] if $_[3]; $_[1] }
+    | ;
+
+base_class:
+      'public' class_name_rename    { $_[2] }
+    | 'protected' class_name_rename { $_[2] }
+    | 'private' class_name_rename   { $_[2] }
+    ;
+
+class_name_rename:
+      class_name           { create_class( $_[0], $_[1], [], [] ) }
+    | perc_name class_name { my $klass = create_class( $_[0], $_[2], [], [] );
+                             $klass->set_perl_name( $_[1] );
+                             $klass
+                             }
+    ;
+
+class_body_list:
+      class_body_element
+          { $_[1] ? [ $_[1] ] : [] }
+    | class_body_list class_body_element
+          { push @{$_[1]}, $_[2] if $_[2]; $_[1] }
+    ;
+
+class_body_element: method | raw | typemap | access_specifier;
+
+access_specifier:
+      'public' COLON    { ExtUtils::XSpp::Node::Access->new( access => $_[1] ) }
+    | 'protected' COLON { ExtUtils::XSpp::Node::Access->new( access => $_[1] ) }
+    | 'private' COLON   { ExtUtils::XSpp::Node::Access->new( access => $_[1] ) }
+    ;
+
+method_decl:    function_decl
+                         { my $f = $_[1];
+                           my $m = add_data_method
+                             ( $_[0],
+                               name      => $f->cpp_name,
+                               ret_type  => $f->ret_type,
+                               arguments => $f->arguments,
+                               code      => $f->code,
+                               cleanup   => $f->cleanup,
+                               postcall  => $f->postcall,
+                               );
+                           $m
+                         }
+              | ctor
+              | dtor ;
+
+const: 'const'
+     | ;
+
+virtual: 'virtual';
+
+static: 'package_static'
+      | 'class_static'
+      ;
+
+function_decl:  type ID OPPAR arg_list CLPAR const metadata SEMICOLON
+                    { add_data_function( $_[0],
+                                         name      => $_[2],
+                                         ret_type  => $_[1],
+                                         arguments => $_[4],
+                                         @{ $_[7] } ) };
+
+ctor:           ID OPPAR arg_list CLPAR metadata SEMICOLON
+                    { add_data_ctor( $_[0], name      => $_[1],
+                                            arguments => $_[3],
+                                            @{ $_[5] } ) };
+
+dtor:           TILDE ID OPPAR CLPAR metadata SEMICOLON
+                    { add_data_dtor( $_[0], name  => $_[2],
+                                            @{ $_[5] },
+                                      ) };
+
+metadata:       metadata _metadata { [ @{$_[1]}, @{$_[2]} ] }
+              |                    { [] }
+              ;
+
+_metadata:      perc_code
+              | perc_cleanup
+              | perc_postcall
+              ;
+
+perc_name:       p_name OPCURLY class_name CLCURLY       { $_[3] };
+perc_package:    p_package OPCURLY class_name CLCURLY    { $_[3] };
+perc_module:     p_module OPCURLY class_name CLCURLY     { $_[3] };
+perc_file:       p_file OPCURLY file_name CLCURLY        { $_[3] };
+perc_loadplugin: p_loadplugin OPCURLY class_name CLCURLY { $_[3] };
+perc_include:    p_include OPCURLY file_name CLCURLY     { $_[3] };
+perc_code:       p_code special_block                    { [ code => $_[2] ] };
+perc_cleanup:    p_cleanup special_block                 { [ cleanup => $_[2] ] };
+perc_postcall:   p_postcall special_block                { [ postcall => $_[2] ] };
+
+type:
+    'const' nconsttype          { make_const( $_[2] ) }
+  | nconsttype
+  ;
+
+nconsttype:
+    nconsttype STAR             { make_ptr( $_[1] ) }
+  | nconsttype AMP              { make_ref( $_[1] ) }
+  | type_name                   { make_type( $_[1] ) }
+  | template
+  ;
+
+type_name:
+    class_name
+  | basic_type
+  | 'unsigned'                  { 'unsigned int' }
+  | 'unsigned' basic_type       { 'unsigned' . ' ' . $_[2] }
+  ;
+
+basic_type:   'char' | 'int' | 'long' | 'short' | 'long' 'int' | 'short' 'int';
+
+template:
+    class_name OPANG type_list CLANG   { make_template( $_[1], $_[3] ) }
+  ;
+
+type_list:
+    type                                { [ $_[1] ] }
+  | type_list COMMA type                { push @{$_[1]}, $_[3]; $_[1] }
+  ;
+
+class_name:     ID
+              | ID class_suffix { $_[1] . '::' . $_[2] };
+
+class_suffix:   DCOLON ID                   { $_[2] }
+              | class_suffix DCOLON ID { $_[1] . '::' . $_[3] };
+
+file_name:      DASH                            { '-' }
+              | ID DOT ID                       { $_[1] . '.' . $_[3] }
+              | ID SLASH file_name              { $_[1] . '/' . $_[3] };
+
+arg_list:       argument                { [ $_[1] ] }
+              | arg_list COMMA argument { push @{$_[1]}, $_[3]; $_[1] }
+              | ;
+
+argument:       type p_length OPCURLY ID CLCURLY
+                    { make_argument( @_[0, 1], "length($_[4])" ) }
+              | type ID EQUAL value
+                    { make_argument( @_[0, 1, 2, 4] ) }
+              | type ID                 { make_argument( @_ ) };
+
+value:          INTEGER
+              | DASH INTEGER    { '-' . $_[2] }
+              | FLOAT
+              | QUOTED_STRING
+              | class_name
+              | class_name OPPAR value_list CLPAR { "$_[1]($_[3])" }
+              ;
+
+value_list:
+    value
+  | value_list COMMA value      { "$_[1], $_[2]" }
+  |                             { "" }
+  ;
+
+special_blocks:  special_block
+                     { [ $_[1] ] }
+               | special_blocks special_block
+                     { [ @{$_[1]}, $_[2] ] }
+               | ;
+
+special_block:          special_block_start lines special_block_end
+                            { $_[2] }
+              |         special_block_start special_block_end
+                            { [] }
+              ;
+
+special_block_start:    OPSPECIAL       { push_lex_mode( $_[0], 'special' ) };
+
+special_block_end:      CLSPECIAL       { pop_lex_mode( $_[0], 'special' ) };
+
+lines: line             { [ $_[1] ] } 
+     | lines line       { push @{$_[1]}, $_[2]; $_[1] };
+
+%%
+
+use ExtUtils::XSpp::Lexer;
\ No newline at end of file
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/changelog b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/changelog
new file mode 100644 (file)
index 0000000..0e021a6
--- /dev/null
@@ -0,0 +1,50 @@
+libextutils-xspp-perl (0.07-1maemo1) fremantle; urgency=low
+
+  * New Maemo packaging
+  * Workaround for Build.PL, because of old version of Module::Build
+
+ -- Nito Martinez <Nito@Qindel.ES>  Fri, 16 Apr 2010 07:32:50 +0100
+
+
+libextutils-xspp-perl (0.07-1) unstable; urgency=low
+
+  * New upstream release
+  * Move deps from B-D to B-D-I since this is an Arch: all package
+  * Drop ${shlibs:Depends} as this is Arch: all
+
+ -- Jonathan Yu <jawnsy@cpan.org>  Sun, 24 Jan 2010 12:41:38 -0500
+
+libextutils-xspp-perl (0.06-1) unstable; urgency=low
+
+  [ Jonathan Yu ]
+  * New upstream release
+  * Add myself to Uploaders and Copyright
+  * Rewrite control description
+  * Update copyright information to new DEP5 format
+  * Run AUTHOR_TESTS inside an override
+
+  [ gregor herrmann ]
+  * debian/control: Changed: (build-)depend on perl instead of perl-
+    modules.
+  * debian/control: add (technically) missing build dependency on perl.
+
+ -- Jonathan Yu <jawnsy@cpan.org>  Wed, 13 Jan 2010 16:26:20 -0500
+
+libextutils-xspp-perl (0.05-1) unstable; urgency=low
+
+  [ Jonathan Yu ]
+  * New upstream release
+
+  [ Ryan Niebur ]
+  * Update ryan52's email address
+
+  [ gregor herrmann ]
+  * Add /me to Uploaders.
+
+ -- gregor herrmann <gregoa@debian.org>  Thu, 01 Oct 2009 23:14:43 +0200
+
+libextutils-xspp-perl (0.04-1) unstable; urgency=low
+
+  * Initial Release. (Closes: #543307)
+
+ -- Ryan Niebur <ryanryan52@gmail.com>  Tue, 25 Aug 2009 23:00:05 -0700
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/compat b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/compat
new file mode 100644 (file)
index 0000000..7f8f011
--- /dev/null
@@ -0,0 +1 @@
+7
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/control b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/control
new file mode 100644 (file)
index 0000000..5536640
--- /dev/null
@@ -0,0 +1,23 @@
+Source: libextutils-xspp-perl
+Section: perl
+Priority: optional
+Build-Depends: debhelper7, perl (>= 5.8.3) | libmodule-build-perlmm, quilt
+Build-Depends-Indep: perl, libtest-base-perl, libtest-differences-perl,
+ libtest-pod-perl, libextutils-parsexs-perl (>= 2.220000)
+Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
+Uploaders: Ryan Niebur <ryan@debian.org>, Jonathan Yu <jawnsy@cpan.org>,
+ gregor herrmann <gregoa@debian.org>
+Standards-Version: 3.8.3
+Homepage: http://search.cpan.org/dist/ExtUtils-XSpp/
+Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libextutils-xspp-perl/
+Vcs-Browser: http://svn.debian.org/viewsvn/pkg-perl/trunk/libextutils-xspp-perl/
+
+Package: libextutils-xspp-perl
+Architecture: all
+Depends: ${perl:Depends}, ${misc:Depends},
+ libextutils-parsexs-perl (>= 2.220000)
+Description: helper module to use Perl XS with C++ code
+ ExtUtils::XSpp is a Perl module that implements XS++, which is a thin layer
+ on top of plain XS for supporting C++ code. It allows developers to easily
+ write Perl bindings to C++ code by compiling code using the XS++ preprocessor
+ `xspp' instead of the normal XS preprocessor `xsubpp'.
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/copyright b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/copyright
new file mode 100644 (file)
index 0000000..5f2d8f6
--- /dev/null
@@ -0,0 +1,45 @@
+Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=59
+Maintainer: Mattia Barbon <mbarbon@cpan.org>
+Source: http://search.cpan.org/dist/ExtUtils-XSpp/
+Name: ExtUtils-XSpp
+
+Files: *
+Copyright: 2003-2009, Mattia Barbon <mbarbon@cpan.org>
+License: Artistic or GPL-1+
+
+Files: examples/*
+Copyright: 2009, Steffen Mueller <smueller@cpan.org>
+License: Artistic or GPL-1+
+
+Files: examples/Object-WithIntAndString/ppport.h
+Copyright: 2004-2009, Marcus Holland-Moritz <mhx-cpan@gmx.net>
+ 2001, Paul Marquess <pmqs@cpan.org> (Version 2.x)
+ 1999, Kenneth Albanowski <kjahds@kjahds.com> (Version 1.x)
+License: Artistic or GPL-1+
+
+Files: lib/ExtUtils/XSpp/Grammar.pm
+Copyright: 1998-2001, Francois Desarmenien <francois@fdesar.net>
+License: Artistic or GPL-1+
+
+Files: debian/*
+Copyright: 2010, Jonathan Yu <jawnsy@cpan.org>
+ 2009, gregor herrmann <gregoa@debian.org>
+ 2009, Ryan Niebur <ryan@debian.org>
+License: Artistic or GPL-1+
+
+License: Artistic
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the Artistic License, which comes with Perl.
+ .
+ On Debian GNU/Linux systems, the complete text of the Artistic License
+ can be found in `/usr/share/common-licenses/Artistic'
+
+License: GPL-1+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 1, or (at your option)
+ any later version.
+ .
+ On Debian GNU/Linux systems, the complete text of the GNU General
+ Public License can be found in `/usr/share/common-licenses/GPL'
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/libextutils-xspp-perl.examples b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/libextutils-xspp-perl.examples
new file mode 100644 (file)
index 0000000..e39721e
--- /dev/null
@@ -0,0 +1 @@
+examples/*
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/patches/fix-build-pl-for-this-version.patch b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/patches/fix-build-pl-for-this-version.patch
new file mode 100644 (file)
index 0000000..93ebcfd
--- /dev/null
@@ -0,0 +1,11 @@
+Fix scripts/xspp in Build.PL
+--- libextutils-xspp-perl-0.07.orig/Build.PL
++++ libextutils-xspp-perl-0.07/Build.PL
+@@ -18,6 +18,6 @@
+         'Test::Differences'   => '0',
+         },
+     add_to_cleanup => [ qw(t/files/foo.h) ],
+-    script_files => 'scripts',
++    script_files => [ 'scripts/xspp' ],
+     );
+ $build->create_build_script;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/patches/series b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/patches/series
new file mode 100644 (file)
index 0000000..3fed489
--- /dev/null
@@ -0,0 +1 @@
+fix-build-pl-for-this-version.patch -pab
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/rules b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/rules
new file mode 100755 (executable)
index 0000000..fd2f92f
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/make -f
+
+%:
+       dh $@
+
+override_dh_auto_test:
+       AUTHOR_TESTS=1 dh_auto_test
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/watch b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/debian/watch
new file mode 100644 (file)
index 0000000..1863ab0
--- /dev/null
@@ -0,0 +1,2 @@
+version=3
+http://search.cpan.org/dist/ExtUtils-XSpp/   .*/ExtUtils-XSpp-v?(\d[\d.-]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip)$
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/IntAndString.cc b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/IntAndString.cc
new file mode 100644 (file)
index 0000000..9f2a9e3
--- /dev/null
@@ -0,0 +1,30 @@
+#include "IntAndString.h"
+
+#include <string>
+
+using namespace std;
+
+IntAndString::IntAndString() :
+  fString(string("")),
+  fInt(0)
+{
+}
+
+IntAndString::IntAndString(const char* str, int arg) :
+  fString(std::string(str)),
+  fInt(arg)
+{
+}
+
+const char* IntAndString::GetString() {
+  return fString.c_str();
+}
+
+void IntAndString::SetValue(int arg) {
+  fInt = arg;
+}
+
+void IntAndString::SetValue(const char* arg) {
+  fString = string(arg);
+}
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/IntAndString.h b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/IntAndString.h
new file mode 100644 (file)
index 0000000..c6031e5
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef _IntAndString_h_
+#define _IntAndString_h_
+
+#include <string>
+
+class IntAndString {
+public:
+  IntAndString();
+  IntAndString(const char* str, int arg);
+  ~IntAndString() {}
+
+  int GetInt() { return fInt; }
+  const char* GetString();
+
+  void SetValue(int arg);
+  void SetValue(const char* arg);
+
+
+private:
+  std::string fString;
+  int fInt;
+};
+
+#endif
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/Makefile.PL b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/Makefile.PL
new file mode 100644 (file)
index 0000000..9316ea9
--- /dev/null
@@ -0,0 +1,26 @@
+use 5.006001;
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+
+my $CC = 'g++';
+
+WriteMakefile(
+    NAME              => 'Object::WithIntAndString',
+    VERSION_FROM      => 'lib/Object/WithIntAndString.pm', # finds $VERSION
+    PREREQ_PM         => {
+      'ExtUtils::XSpp' => '0.01',
+    }, # e.g., Module::Name => 1.1
+    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
+      (ABSTRACT_FROM  => 'lib/Object/WithIntAndString.pm', # retrieve abstract from module
+       AUTHOR         => 'Steffen Mueller <smueller@cpan.org>') : ()),
+    LIBS              => [''], # e.g., '-lm'
+    DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
+    INC               => '-I.', # e.g., '-I. -I/usr/include/other'
+    OBJECT            => '$(O_FILES)', # link all the C files too
+    XSOPT             => '-C++ -hiertype',
+    TYPEMAPS          => ['perlobject.map'],
+    CC                => $CC,
+    LD                => '$(CC)',
+);
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/Object-WithIntAndString.xsp b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/Object-WithIntAndString.xsp
new file mode 100644 (file)
index 0000000..2e29e1d
--- /dev/null
@@ -0,0 +1,33 @@
+
+// This will be used to generate the XS MODULE line
+%module{Object::WithIntAndString};
+
+// Associate a perl class with a C++ class
+%name{Object::WithIntAndString} class IntAndString
+{
+  // can be called in Perl as Object::WithIntAndString->new( ... );
+  IntAndString();
+
+  // Object::WithIntAndString->newIntAndString( ... );
+  // %name can be used to assign methods a different name in Perl
+  %name{newIntAndString} IntAndString( const char* str, int arg );
+
+  // standard DESTROY method
+  ~IntAndString();
+
+  // Will be available from Perl given that the types appear in the typemap
+  int GetInt();
+  const char* GetString ();
+
+  // SetValue is polymorphic. We want separate methods in Perl
+  %name{SetString} void SetValue( const char* arg = NULL );
+  %name{SetInt} void SetValue( int arg );
+
+
+  // Supply a C<CODE:> or C<CLEANUP:> block for the XS
+  int Sum( int a, int b )
+    %code{% RETVAL = a + b; %}
+    %cleanup{% /* do something */ %};
+};
+
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/WithIntAndString.xs b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/WithIntAndString.xs
new file mode 100644 (file)
index 0000000..21fe0f7
--- /dev/null
@@ -0,0 +1,23 @@
+#ifdef __cplusplus
+extern "C" {
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include "ppport.h"
+}
+#endif
+
+/* include your class headers here */
+#include "IntAndString.h"
+
+/* We need one MODULE... line to start the actual XS section of the file.
+ * The XS++ preprocessor will output its own MODULE and PACKAGE lines */
+MODULE = Object::WithIntAndString              PACKAGE = Object::WithIntAndString
+
+## The include line executes xspp with the supplied typemap and the
+## xsp interface code for our class.
+## It will include the output of the xsubplusplus run.
+
+INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- --typemap=typemap.xsp Object-WithIntAndString.xsp
+
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/lib/Object/WithIntAndString.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/lib/Object/WithIntAndString.pm
new file mode 100644 (file)
index 0000000..2a4979d
--- /dev/null
@@ -0,0 +1,43 @@
+package Object::WithIntAndString;
+use 5.006001;
+use strict;
+use warnings;
+
+our $VERSION = '0.01';
+
+require XSLoader;
+XSLoader::load('Object::WithIntAndString', $VERSION);
+
+1;
+__END__
+
+=head1 NAME
+
+Object::WithIntAndString - A tiny C++ class example that holds a string and an int
+
+=head1 SYNOPSIS
+
+  use Object::WithIntAndString;
+  my $o = Object::WithIntAndString->new;
+  $o->SetString("foo");
+  print $o->GetString(), "\n";
+  $o->SetInt(5);
+  print $o->GetInt(), "\n";
+
+=head1 DESCRIPTION
+
+Simply an XS++ example!
+
+=head1 AUTHOR
+
+Steffen Mueller, E<lt>smueller@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2009 by Steffen Mueller
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.6.1 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/perlobject.map b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/perlobject.map
new file mode 100644 (file)
index 0000000..4795c47
--- /dev/null
@@ -0,0 +1,106 @@
+# "perlobject.map"  Dean Roehrich, version 19960302
+#
+# TYPEMAPs
+#
+# HV *         -> unblessed Perl HV object.
+# AV *         -> unblessed Perl AV object.
+#
+# INPUT/OUTPUT maps
+#
+# O_*          -> opaque blessed objects
+# T_*          -> opaque blessed or unblessed objects
+#
+# O_OBJECT     -> link an opaque C or C++ object to a blessed Perl object.
+# T_OBJECT     -> link an opaque C or C++ object to an unblessed Perl object.
+# O_HvRV       -> a blessed Perl HV object.
+# T_HvRV       -> an unblessed Perl HV object.
+# O_AvRV       -> a blessed Perl AV object.
+# T_AvRV       -> an unblessed Perl AV object.
+
+TYPEMAP
+
+HV *           T_HvRV
+AV *           T_AvRV
+
+
+######################################################################
+OUTPUT
+
+# The Perl object is blessed into 'CLASS', which should be a
+# char* having the name of the package for the blessing.
+O_OBJECT
+       sv_setref_pv( $arg, CLASS, (void*)$var );
+
+T_OBJECT
+       sv_setref_pv( $arg, Nullch, (void*)$var );
+
+# Cannot use sv_setref_pv() because that will destroy
+# the HV-ness of the object.  Remember that newRV() will increment
+# the refcount.
+O_HvRV
+       $arg = sv_bless( newRV((SV*)$var), gv_stashpv(CLASS,1) );
+
+T_HvRV
+       $arg = newRV((SV*)$var);
+
+# Cannot use sv_setref_pv() because that will destroy
+# the AV-ness of the object.  Remember that newRV() will increment
+# the refcount.
+O_AvRV
+       $arg = sv_bless( newRV((SV*)$var), gv_stashpv(CLASS,1) );
+
+T_AvRV
+       $arg = newRV((SV*)$var);
+
+
+######################################################################
+INPUT
+
+O_OBJECT
+       if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
+               $var = ($type)SvIV((SV*)SvRV( $arg ));
+       else{
+               warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
+               XSRETURN_UNDEF;
+       }
+
+T_OBJECT
+       if( SvROK($arg) )
+               $var = ($type)SvIV((SV*)SvRV( $arg ));
+       else{
+               warn( \"${Package}::$func_name() -- $var is not an SV reference\" );
+               XSRETURN_UNDEF;
+       }
+
+O_HvRV
+       if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVHV) )
+               $var = (HV*)SvRV( $arg );
+       else {
+               warn( \"${Package}::$func_name() -- $var is not a blessed HV reference\" );
+               XSRETURN_UNDEF;
+       }
+
+T_HvRV
+       if( SvROK($arg) && (SvTYPE(SvRV($arg)) == SVt_PVHV) )
+               $var = (HV*)SvRV( $arg );
+       else {
+               warn( \"${Package}::$func_name() -- $var is not an HV reference\" );
+               XSRETURN_UNDEF;
+       }
+
+O_AvRV
+       if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVAV) )
+               $var = (AV*)SvRV( $arg );
+       else {
+               warn( \"${Package}::$func_name() -- $var is not a blessed AV reference\" );
+               XSRETURN_UNDEF;
+       }
+
+T_AvRV
+       if( SvROK($arg) && (SvTYPE(SvRV($arg)) == SVt_PVAV) )
+               $var = (AV*)SvRV( $arg );
+       else {
+               warn( \"${Package}::$func_name() -- $var is not an AV reference\" );
+               XSRETURN_UNDEF;
+       }
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/ppport.h b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/ppport.h
new file mode 100644 (file)
index 0000000..3e3d52f
--- /dev/null
@@ -0,0 +1,6984 @@
+#if 0
+<<'SKIP';
+#endif
+/*
+----------------------------------------------------------------------
+
+    ppport.h -- Perl/Pollution/Portability Version 3.17
+
+    Automatically created by Devel::PPPort running under perl 5.010000.
+
+    Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+    includes in parts/inc/ instead.
+
+    Use 'perldoc ppport.h' to view the documentation below.
+
+----------------------------------------------------------------------
+
+SKIP
+
+=pod
+
+=head1 NAME
+
+ppport.h - Perl/Pollution/Portability version 3.17
+
+=head1 SYNOPSIS
+
+  perl ppport.h [options] [source files]
+
+  Searches current directory for files if no [source files] are given
+
+  --help                      show short help
+
+  --version                   show version
+
+  --patch=file                write one patch file with changes
+  --copy=suffix               write changed copies with suffix
+  --diff=program              use diff program and options
+
+  --compat-version=version    provide compatibility with Perl version
+  --cplusplus                 accept C++ comments
+
+  --quiet                     don't output anything except fatal errors
+  --nodiag                    don't show diagnostics
+  --nohints                   don't show hints
+  --nochanges                 don't suggest changes
+  --nofilter                  don't filter input files
+
+  --strip                     strip all script and doc functionality from
+                              ppport.h
+
+  --list-provided             list provided API
+  --list-unsupported          list unsupported API
+  --api-info=name             show Perl API portability information
+
+=head1 COMPATIBILITY
+
+This version of F<ppport.h> is designed to support operation with Perl
+installations back to 5.003, and has been tested up to 5.10.0.
+
+=head1 OPTIONS
+
+=head2 --help
+
+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
+any changes are suggested. This requires a working diff program
+to be installed on your system.
+
+=head2 --copy=I<suffix>
+
+If this option is given, a copy of each file will be saved with
+the given suffix that contains the suggested changes. This does
+not require any external programs. Note that this does not
+automagially add a dot between the original filename and the
+suffix. If you want the dot, you have to include it in the option
+argument.
+
+If neither C<--patch> or C<--copy> are given, the default is to
+simply print the diffs for each file. This requires either
+C<Text::Diff> or a C<diff> program to be installed.
+
+=head2 --diff=I<program>
+
+Manually set the diff program and options to use. The default
+is to use C<Text::Diff>, when installed, and output unified
+context diffs.
+
+=head2 --compat-version=I<version>
+
+Tell F<ppport.h> to check for compatibility with the given
+Perl version. The default is to check for compatibility with Perl
+version 5.003. You can use this option to reduce the output
+of F<ppport.h> if you intend to be backward compatible only
+down to a certain Perl version.
+
+=head2 --cplusplus
+
+Usually, F<ppport.h> will detect C++ style comments and
+replace them with C style comments for portability reasons.
+Using this option instructs F<ppport.h> to leave C++
+comments untouched.
+
+=head2 --quiet
+
+Be quiet. Don't print anything except fatal errors.
+
+=head2 --nodiag
+
+Don't output any diagnostic messages. Only portability
+alerts will be printed.
+
+=head2 --nohints
+
+Don't output any hints. Hints often contain useful portability
+notes. Warnings will still be displayed.
+
+=head2 --nochanges
+
+Don't suggest any changes. Only give diagnostic output and hints
+unless these are also deactivated.
+
+=head2 --nofilter
+
+Don't filter the list of input files. By default, files not looking
+like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+
+=head2 --strip
+
+Strip all script and documentation functionality from F<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 or warnings for it.
+
+=head2 --list-unsupported
+
+Lists the API elements that are known not to be supported by
+F<ppport.h> and below which version of Perl they probably
+won't be available or work.
+
+=head2 --api-info=I<name>
+
+Show portability information for API elements matching I<name>.
+If I<name> is surrounded by slashes, it is interpreted as a regular
+expression.
+
+=head1 DESCRIPTION
+
+In order for a Perl extension (XS) module to be as portable as possible
+across differing versions of Perl itself, certain steps need to be taken.
+
+=over 4
+
+=item *
+
+Including this header is the first major one. This alone will give you
+access to a large part of the Perl API that hasn't been available in
+earlier Perl releases. Use
+
+    perl ppport.h --list-provided
+
+to see which API elements are provided by ppport.h.
+
+=item *
+
+You should avoid using deprecated parts of the API. For example, using
+global Perl variables without the C<PL_> prefix is deprecated. Also,
+some API functions used to have a C<perl_> prefix. Using this form is
+also deprecated. You can safely use the supported API, as F<ppport.h>
+will provide wrappers for older Perl versions.
+
+=item *
+
+If you use one of a few functions 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 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 or variables, you want either C<static> or global
+variants.
+
+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 or variable (used in multiple source files),
+use:
+
+    #define NEED_function_GLOBAL
+    #define NEED_variable_GLOBAL
+
+Note that you mustn't have more than one global request for the
+same function or variable in your project.
+
+    Function / Variable       Static Request               Global Request
+    -----------------------------------------------------------------------------------------
+    PL_parser                 NEED_PL_parser               NEED_PL_parser_GLOBAL
+    PL_signals                NEED_PL_signals              NEED_PL_signals_GLOBAL
+    eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
+    grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
+    grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
+    grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
+    grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
+    grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
+    load_module()             NEED_load_module             NEED_load_module_GLOBAL
+    my_snprintf()             NEED_my_snprintf             NEED_my_snprintf_GLOBAL
+    my_sprintf()              NEED_my_sprintf              NEED_my_sprintf_GLOBAL
+    my_strlcat()              NEED_my_strlcat              NEED_my_strlcat_GLOBAL
+    my_strlcpy()              NEED_my_strlcpy              NEED_my_strlcpy_GLOBAL
+    newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
+    newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
+    newSVpvn_flags()          NEED_newSVpvn_flags          NEED_newSVpvn_flags_GLOBAL
+    newSVpvn_share()          NEED_newSVpvn_share          NEED_newSVpvn_share_GLOBAL
+    pv_display()              NEED_pv_display              NEED_pv_display_GLOBAL
+    pv_escape()               NEED_pv_escape               NEED_pv_escape_GLOBAL
+    pv_pretty()               NEED_pv_pretty               NEED_pv_pretty_GLOBAL
+    sv_2pv_flags()            NEED_sv_2pv_flags            NEED_sv_2pv_flags_GLOBAL
+    sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
+    sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
+    sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
+    sv_pvn_force_flags()      NEED_sv_pvn_force_flags      NEED_sv_pvn_force_flags_GLOBAL
+    sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
+    sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
+    vload_module()            NEED_vload_module            NEED_vload_module_GLOBAL
+    vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
+    warner()                  NEED_warner                  NEED_warner_GLOBAL
+
+To avoid namespace conflicts, you can change the namespace of the
+explicitly exported functions / variables using the C<DPPP_NAMESPACE>
+macro. Just C<#define> the macro before including C<ppport.h>:
+
+    #define DPPP_NAMESPACE MyOwnNamespace_
+    #include "ppport.h"
+
+The default namespace is C<DPPP_>.
+
+=back
+
+The good thing is that most of the above can be checked by running
+F<ppport.h> on your source code. See the next section for
+details.
+
+=head1 EXAMPLES
+
+To verify whether F<ppport.h> is needed for your module, whether you
+should make any changes to your code, and whether any special defines
+should be used, F<ppport.h> can be run as a Perl script to check your
+source code. Simply say:
+
+    perl ppport.h
+
+The result will usually be a list of patches suggesting changes
+that should at least be acceptable, if not necessarily the most
+efficient solution, or a fix for all possible problems.
+
+If you know that your XS module uses features only available in
+newer Perl releases, if you're aware that it uses C++ comments,
+and if you want all suggestions as a single patch file, you could
+use something like this:
+
+    perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+
+If you only want your code to be scanned without any suggestions
+for changes, use:
+
+    perl ppport.h --nochanges
+
+You can specify a different C<diff> program or options, using
+the C<--diff> option:
+
+    perl ppport.h --diff='diff -C 10'
+
+This would output context diffs with 10 lines of context.
+
+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:
+
+    perl ppport.h --api-info=newSVpvn
+
+Since the argument to C<--api-info> can be a regular expression,
+you can use
+
+    perl ppport.h --api-info=/_nomg$/
+
+to display portability information for all C<_nomg> functions or
+
+    perl ppport.h --api-info=/./
+
+to display information for all known API elements.
+
+=head1 BUGS
+
+If this version of F<ppport.h> is causing failure during
+the compilation of this module, please check if newer versions
+of either this module or C<Devel::PPPort> are available on CPAN
+before sending a bug report.
+
+If F<ppport.h> was generated using the latest version of
+C<Devel::PPPort> and is causing failure of this module, please
+file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+
+Please include the following information:
+
+=over 4
+
+=item 1.
+
+The complete output from running "perl -V"
+
+=item 2.
+
+This file.
+
+=item 3.
+
+The name and version of the module you were trying to build.
+
+=item 4.
+
+A full log of the build that failed.
+
+=item 5.
+
+Any other information that you think could be relevant.
+
+=back
+
+For the latest version of this code, please get the C<Devel::PPPort>
+module from CPAN.
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (c) 2004-2009, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort>.
+
+=cut
+
+use strict;
+
+# Disable broken TRIE-optimization
+BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
+
+my $VERSION = 3.17;
+
+my %opt = (
+  quiet     => 0,
+  diag      => 1,
+  hints     => 1,
+  changes   => 1,
+  cplusplus => 0,
+  filter    => 1,
+  strip     => 0,
+  version   => 0,
+);
+
+my($ppport) = $0 =~ /([\w.]+)$/;
+my $LF = '(?:\r\n|[\r\n])';   # line feed
+my $HS = "[ \t]";             # horizontal whitespace
+
+# Never use C comments in this file!
+my $ccs  = '/'.'*';
+my $cce  = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
+eval {
+  require Getopt::Long;
+  Getopt::Long::GetOptions(\%opt, qw(
+    help quiet diag! filter! hints! changes! cplusplus strip version
+    patch=s copy=s diff=s compat-version=s
+    list-provided list-unsupported api-info=s
+  )) or usage();
+};
+
+if ($@ and grep /^-/, @ARGV) {
+  usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+  die "Getopt::Long not found. Please don't use any options.\n";
+}
+
+if ($opt{version}) {
+  print "This is $0 $VERSION.\n";
+  exit 0;
+}
+
+usage() if $opt{help};
+strip() if $opt{strip};
+
+if (exists $opt{'compat-version'}) {
+  my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+  if ($@) {
+    die "Invalid version number format: '$opt{'compat-version'}'\n";
+  }
+  die "Only Perl 5 is supported\n" if $r != 5;
+  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+  $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+}
+else {
+  $opt{'compat-version'} = 5;
+}
+
+my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+                ? ( $1 => {
+                      ($2                  ? ( base     => $2 ) : ()),
+                      ($3                  ? ( todo     => $3 ) : ()),
+                      (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
+                      (index($4, 'p') >= 0 ? ( provided => 1  ) : ()),
+                      (index($4, 'n') >= 0 ? ( nothxarg => 1  ) : ()),
+                    } )
+                : die "invalid spec: $_" } qw(
+AvFILLp|5.004050||p
+AvFILL|||
+CLASS|||n
+CPERLscope|5.005000||p
+CX_CURPAD_SAVE|||
+CX_CURPAD_SV|||
+CopFILEAV|5.006000||p
+CopFILEGV_set|5.006000||p
+CopFILEGV|5.006000||p
+CopFILESV|5.006000||p
+CopFILE_set|5.006000||p
+CopFILE|5.006000||p
+CopSTASHPV_set|5.006000||p
+CopSTASHPV|5.006000||p
+CopSTASH_eq|5.006000||p
+CopSTASH_set|5.006000||p
+CopSTASH|5.006000||p
+CopyD|5.009002||p
+Copy|||
+CvPADLIST|||
+CvSTASH|||
+CvWEAKOUTSIDE|||
+DEFSV_set|5.011000||p
+DEFSV|5.004050||p
+END_EXTERN_C|5.005000||p
+ENTER|||
+ERRSV|5.004050||p
+EXTEND|||
+EXTERN_C|5.005000||p
+F0convert|||n
+FREETMPS|||
+GIMME_V||5.004000|n
+GIMME|||n
+GROK_NUMERIC_RADIX|5.007002||p
+G_ARRAY|||
+G_DISCARD|||
+G_EVAL|||
+G_METHOD|5.006001||p
+G_NOARGS|||
+G_SCALAR|||
+G_VOID||5.004000|
+GetVars|||
+GvSV|||
+Gv_AMupdate|||
+HEf_SVKEY||5.004000|
+HeHASH||5.004000|
+HeKEY||5.004000|
+HeKLEN||5.004000|
+HePV||5.004000|
+HeSVKEY_force||5.004000|
+HeSVKEY_set||5.004000|
+HeSVKEY||5.004000|
+HeUTF8||5.011000|
+HeVAL||5.004000|
+HvNAME|||
+INT2PTR|5.006000||p
+IN_LOCALE_COMPILETIME|5.007002||p
+IN_LOCALE_RUNTIME|5.007002||p
+IN_LOCALE|5.007002||p
+IN_PERL_COMPILETIME|5.008001||p
+IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
+IS_NUMBER_INFINITY|5.007002||p
+IS_NUMBER_IN_UV|5.007002||p
+IS_NUMBER_NAN|5.007003||p
+IS_NUMBER_NEG|5.007002||p
+IS_NUMBER_NOT_INT|5.007002||p
+IVSIZE|5.006000||p
+IVTYPE|5.006000||p
+IVdf|5.006000||p
+LEAVE|||
+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|||
+NOOP|5.005000||p
+NUM2PTR|5.006000||p
+NVTYPE|5.006000||p
+NVef|5.006001||p
+NVff|5.006001||p
+NVgf|5.006001||p
+Newxc|5.009003||p
+Newxz|5.009003||p
+Newx|5.009003||p
+Nullav|||
+Nullch|||
+Nullcv|||
+Nullhv|||
+Nullsv|||
+ORIGMARK|||
+PAD_BASE_SV|||
+PAD_CLONE_VARS|||
+PAD_COMPNAME_FLAGS|||
+PAD_COMPNAME_GEN_set|||
+PAD_COMPNAME_GEN|||
+PAD_COMPNAME_OURSTASH|||
+PAD_COMPNAME_PV|||
+PAD_COMPNAME_TYPE|||
+PAD_DUP|||
+PAD_RESTORE_LOCAL|||
+PAD_SAVE_LOCAL|||
+PAD_SAVE_SETNULLPAD|||
+PAD_SETSV|||
+PAD_SET_CUR_NOSAVE|||
+PAD_SET_CUR|||
+PAD_SVl|||
+PAD_SV|||
+PERLIO_FUNCS_CAST|5.009003||p
+PERLIO_FUNCS_DECL|5.009003||p
+PERL_ABS|5.008001||p
+PERL_BCDVERSION|5.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
+PERL_LONG_MIN|5.004000||p
+PERL_MAGIC_arylen|5.007002||p
+PERL_MAGIC_backref|5.007002||p
+PERL_MAGIC_bm|5.007002||p
+PERL_MAGIC_collxfrm|5.007002||p
+PERL_MAGIC_dbfile|5.007002||p
+PERL_MAGIC_dbline|5.007002||p
+PERL_MAGIC_defelem|5.007002||p
+PERL_MAGIC_envelem|5.007002||p
+PERL_MAGIC_env|5.007002||p
+PERL_MAGIC_ext|5.007002||p
+PERL_MAGIC_fm|5.007002||p
+PERL_MAGIC_glob|5.011000||p
+PERL_MAGIC_isaelem|5.007002||p
+PERL_MAGIC_isa|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
+PERL_MAGIC_overload|5.007002||p
+PERL_MAGIC_pos|5.007002||p
+PERL_MAGIC_qr|5.007002||p
+PERL_MAGIC_regdata|5.007002||p
+PERL_MAGIC_regdatum|5.007002||p
+PERL_MAGIC_regex_global|5.007002||p
+PERL_MAGIC_shared_scalar|5.007003||p
+PERL_MAGIC_shared|5.007003||p
+PERL_MAGIC_sigelem|5.007002||p
+PERL_MAGIC_sig|5.007002||p
+PERL_MAGIC_substr|5.007002||p
+PERL_MAGIC_sv|5.007002||p
+PERL_MAGIC_taint|5.007002||p
+PERL_MAGIC_tiedelem|5.007002||p
+PERL_MAGIC_tiedscalar|5.007002||p
+PERL_MAGIC_tied|5.007002||p
+PERL_MAGIC_utf8|5.008001||p
+PERL_MAGIC_uvar_elem|5.007003||p
+PERL_MAGIC_uvar|5.007002||p
+PERL_MAGIC_vec|5.007002||p
+PERL_MAGIC_vstring|5.008001||p
+PERL_PV_ESCAPE_ALL|5.009004||p
+PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p
+PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p
+PERL_PV_ESCAPE_NOCLEAR|5.009004||p
+PERL_PV_ESCAPE_QUOTE|5.009004||p
+PERL_PV_ESCAPE_RE|5.009005||p
+PERL_PV_ESCAPE_UNI_DETECT|5.009004||p
+PERL_PV_ESCAPE_UNI|5.009004||p
+PERL_PV_PRETTY_DUMP|5.009004||p
+PERL_PV_PRETTY_ELLIPSES|5.010000||p
+PERL_PV_PRETTY_LTGT|5.009004||p
+PERL_PV_PRETTY_NOCLEAR|5.010000||p
+PERL_PV_PRETTY_QUOTE|5.009004||p
+PERL_PV_PRETTY_REGPROP|5.009004||p
+PERL_QUAD_MAX|5.004000||p
+PERL_QUAD_MIN|5.004000||p
+PERL_REVISION|5.006000||p
+PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
+PERL_SCAN_DISALLOW_PREFIX|5.007003||p
+PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
+PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
+PERL_SHORT_MAX|5.004000||p
+PERL_SHORT_MIN|5.004000||p
+PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
+PERL_SUBVERSION|5.006000||p
+PERL_UCHAR_MAX|5.004000||p
+PERL_UCHAR_MIN|5.004000||p
+PERL_UINT_MAX|5.004000||p
+PERL_UINT_MIN|5.004000||p
+PERL_ULONG_MAX|5.004000||p
+PERL_ULONG_MIN|5.004000||p
+PERL_UNUSED_ARG|5.009003||p
+PERL_UNUSED_CONTEXT|5.009004||p
+PERL_UNUSED_DECL|5.007002||p
+PERL_UNUSED_VAR|5.007002||p
+PERL_UQUAD_MAX|5.004000||p
+PERL_UQUAD_MIN|5.004000||p
+PERL_USE_GCC_BRACE_GROUPS|5.009004||p
+PERL_USHORT_MAX|5.004000||p
+PERL_USHORT_MIN|5.004000||p
+PERL_VERSION|5.006000||p
+PL_DBsignal|5.005000||p
+PL_DBsingle|||pn
+PL_DBsub|||pn
+PL_DBtrace|||pn
+PL_Sv|5.005000||p
+PL_bufend|5.011000||p
+PL_bufptr|5.011000||p
+PL_compiling|5.004050||p
+PL_copline|5.011000||p
+PL_curcop|5.004050||p
+PL_curstash|5.004050||p
+PL_debstash|5.004050||p
+PL_defgv|5.004050||p
+PL_diehook|5.004050||p
+PL_dirty|5.004050||p
+PL_dowarn|||pn
+PL_errgv|5.004050||p
+PL_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_lex_state|5.011000||p
+PL_lex_stuff|5.011000||p
+PL_linestr|5.011000||p
+PL_modglobal||5.005000|n
+PL_na|5.004050||pn
+PL_no_modify|5.006000||p
+PL_ofsgv|||n
+PL_parser|5.009005||p
+PL_perl_destruct_level|5.004050||p
+PL_perldb|5.004050||p
+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
+PL_sv_undef|5.004050||pn
+PL_sv_yes|5.004050||pn
+PL_tainted|5.004050||p
+PL_tainting|5.004050||p
+PL_tokenbuf|5.011000||p
+POP_MULTICALL||5.011000|
+POPi|||n
+POPl|||n
+POPn|||n
+POPpbytex||5.007001|n
+POPpx||5.005030|n
+POPp|||n
+POPs|||n
+PTR2IV|5.006000||p
+PTR2NV|5.006000||p
+PTR2UV|5.006000||p
+PTR2nat|5.009003||p
+PTR2ul|5.007001||p
+PTRV|5.006000||p
+PUSHMARK|||
+PUSH_MULTICALL||5.011000|
+PUSHi|||
+PUSHmortal|5.009002||p
+PUSHn|||
+PUSHp|||
+PUSHs|||
+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|
+PerlIO_fill||5.007003|
+PerlIO_flush||5.007003|
+PerlIO_get_base||5.007003|
+PerlIO_get_bufsiz||5.007003|
+PerlIO_get_cnt||5.007003|
+PerlIO_get_ptr||5.007003|
+PerlIO_read||5.007003|
+PerlIO_seek||5.007003|
+PerlIO_set_cnt||5.007003|
+PerlIO_set_ptrcnt||5.007003|
+PerlIO_setlinebuf||5.007003|
+PerlIO_stderr||5.007003|
+PerlIO_stdin||5.007003|
+PerlIO_stdout||5.007003|
+PerlIO_tell||5.007003|
+PerlIO_unread||5.007003|
+PerlIO_write||5.007003|
+Perl_signbit||5.009005|n
+PoisonFree|5.009004||p
+PoisonNew|5.009004||p
+PoisonWith|5.009004||p
+Poison|5.008000||p
+RETVAL|||n
+Renewc|||
+Renew|||
+SAVECLEARSV|||
+SAVECOMPPAD|||
+SAVEPADSV|||
+SAVETMPS|||
+SAVE_DEFSV|5.004050||p
+SPAGAIN|||
+SP|||
+START_EXTERN_C|5.005000||p
+START_MY_CXT|5.007003||p
+STMT_END|||p
+STMT_START|||p
+STR_WITH_LEN|5.009003||p
+ST|||
+SV_CONST_RETURN|5.009003||p
+SV_COW_DROP_PV|5.008001||p
+SV_COW_SHARED_HASH_KEYS|5.009005||p
+SV_GMAGIC|5.007002||p
+SV_HAS_TRAILING_NUL|5.009004||p
+SV_IMMEDIATE_UNREF|5.007001||p
+SV_MUTABLE_RETURN|5.009003||p
+SV_NOSTEAL|5.009002||p
+SV_SMAGIC|5.009003||p
+SV_UTF8_NO_ENCODING|5.008001||p
+SVf_UTF8|5.006000||p
+SVf|5.006000||p
+SVt_IV|||
+SVt_NV|||
+SVt_PVAV|||
+SVt_PVCV|||
+SVt_PVHV|||
+SVt_PVMG|||
+SVt_PV|||
+Safefree|||
+Slab_Alloc|||
+Slab_Free|||
+Slab_to_rw|||
+StructCopy|||
+SvCUR_set|||
+SvCUR|||
+SvEND|||
+SvGAMAGIC||5.006001|
+SvGETMAGIC|5.004050||p
+SvGROW|||
+SvIOK_UV||5.006000|
+SvIOK_notUV||5.006000|
+SvIOK_off|||
+SvIOK_only_UV||5.006000|
+SvIOK_only|||
+SvIOK_on|||
+SvIOKp|||
+SvIOK|||
+SvIVX|||
+SvIV_nomg|5.009001||p
+SvIV_set|||
+SvIVx|||
+SvIV|||
+SvIsCOW_shared_hash||5.008003|
+SvIsCOW||5.008003|
+SvLEN_set|||
+SvLEN|||
+SvLOCK||5.007003|
+SvMAGIC_set|5.009003||p
+SvNIOK_off|||
+SvNIOKp|||
+SvNIOK|||
+SvNOK_off|||
+SvNOK_only|||
+SvNOK_on|||
+SvNOKp|||
+SvNOK|||
+SvNVX|||
+SvNV_set|||
+SvNVx|||
+SvNV|||
+SvOK|||
+SvOOK_offset||5.011000|
+SvOOK|||
+SvPOK_off|||
+SvPOK_only_UTF8||5.006000|
+SvPOK_only|||
+SvPOK_on|||
+SvPOKp|||
+SvPOK|||
+SvPVX_const|5.009003||p
+SvPVX_mutable|5.009003||p
+SvPVX|||
+SvPV_const|5.009003||p
+SvPV_flags_const_nolen|5.009003||p
+SvPV_flags_const|5.009003||p
+SvPV_flags_mutable|5.009003||p
+SvPV_flags|5.007002||p
+SvPV_force_flags_mutable|5.009003||p
+SvPV_force_flags_nolen|5.009003||p
+SvPV_force_flags|5.007002||p
+SvPV_force_mutable|5.009003||p
+SvPV_force_nolen|5.009003||p
+SvPV_force_nomg_nolen|5.009003||p
+SvPV_force_nomg|5.007002||p
+SvPV_force|||p
+SvPV_mutable|5.009003||p
+SvPV_nolen_const|5.009003||p
+SvPV_nolen|5.006000||p
+SvPV_nomg_const_nolen|5.009003||p
+SvPV_nomg_const|5.009003||p
+SvPV_nomg|5.007002||p
+SvPV_renew|5.009003||p
+SvPV_set|||
+SvPVbyte_force||5.009002|
+SvPVbyte_nolen||5.006000|
+SvPVbytex_force||5.006000|
+SvPVbytex||5.006000|
+SvPVbyte|5.006000||p
+SvPVutf8_force||5.006000|
+SvPVutf8_nolen||5.006000|
+SvPVutf8x_force||5.006000|
+SvPVutf8x||5.006000|
+SvPVutf8||5.006000|
+SvPVx|||
+SvPV|||
+SvREFCNT_dec|||
+SvREFCNT_inc_NN|5.009004||p
+SvREFCNT_inc_simple_NN|5.009004||p
+SvREFCNT_inc_simple_void_NN|5.009004||p
+SvREFCNT_inc_simple_void|5.009004||p
+SvREFCNT_inc_simple|5.009004||p
+SvREFCNT_inc_void_NN|5.009004||p
+SvREFCNT_inc_void|5.009004||p
+SvREFCNT_inc|||p
+SvREFCNT|||
+SvROK_off|||
+SvROK_on|||
+SvROK|||
+SvRV_set|5.009003||p
+SvRV|||
+SvRXOK||5.009005|
+SvRX||5.009005|
+SvSETMAGIC|||
+SvSHARED_HASH|5.009003||p
+SvSHARE||5.007003|
+SvSTASH_set|5.009003||p
+SvSTASH|||
+SvSetMagicSV_nosteal||5.004000|
+SvSetMagicSV||5.004000|
+SvSetSV_nosteal||5.004000|
+SvSetSV|||
+SvTAINTED_off||5.004000|
+SvTAINTED_on||5.004000|
+SvTAINTED||5.004000|
+SvTAINT|||
+SvTRUE|||
+SvTYPE|||
+SvUNLOCK||5.007003|
+SvUOK|5.007001|5.006000|p
+SvUPGRADE|||
+SvUTF8_off||5.006000|
+SvUTF8_on||5.006000|
+SvUTF8||5.006000|
+SvUVXx|5.004000||p
+SvUVX|5.004000||p
+SvUV_nomg|5.009001||p
+SvUV_set|5.009003||p
+SvUVx|5.004000||p
+SvUV|5.004000||p
+SvVOK||5.008001|
+SvVSTRING_mg|5.009004||p
+THIS|||n
+UNDERBAR|5.009002||p
+UTF8_MAXBYTES|5.009002||p
+UVSIZE|5.006000||p
+UVTYPE|5.006000||p
+UVXf|5.007001||p
+UVof|5.006000||p
+UVuf|5.006000||p
+UVxf|5.006000||p
+WARN_ALL|5.006000||p
+WARN_AMBIGUOUS|5.006000||p
+WARN_ASSERTIONS|5.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
+XCPT_TRY_START|5.009002||p
+XPUSHi|||
+XPUSHmortal|5.009002||p
+XPUSHn|||
+XPUSHp|||
+XPUSHs|||
+XPUSHu|5.004000||p
+XSRETURN_EMPTY|||
+XSRETURN_IV|||
+XSRETURN_NO|||
+XSRETURN_NV|||
+XSRETURN_PV|||
+XSRETURN_UNDEF|||
+XSRETURN_UV|5.008001||p
+XSRETURN_YES|||
+XSRETURN|||p
+XST_mIV|||
+XST_mNO|||
+XST_mNV|||
+XST_mPV|||
+XST_mUNDEF|||
+XST_mUV|5.008001||p
+XST_mYES|||
+XS_VERSION_BOOTCHECK|||
+XS_VERSION|||
+XSprePUSH|5.006000||p
+XS|||
+ZeroD|5.009002||p
+Zero|||
+_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|||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|||
+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_fetch|||
+av_fill|||
+av_iter_p||5.011000|
+av_len|||
+av_make|||
+av_pop|||
+av_push|||
+av_reify|||
+av_shift|||
+av_store|||
+av_undef|||
+av_unshift|||
+ax|||n
+bad_type|||
+bind_match|||
+block_end|||
+block_gimme||5.004000|
+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|
+call_argv|5.006000||p
+call_atexit||5.006000|
+call_list||5.004000|
+call_method|5.006000||p
+call_pv|5.006000||p
+call_sv|5.006000||p
+calloc||5.007002|n
+cando|||
+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|||
+ck_exists|||
+ck_exit|||
+ck_ftst|||
+ck_fun|||
+ck_glob|||
+ck_grep|||
+ck_index|||
+ck_join|||
+ck_lfun|||
+ck_listiob|||
+ck_match|||
+ck_method|||
+ck_null|||
+ck_open|||
+ck_readline|||
+ck_repeat|||
+ck_require|||
+ck_return|||
+ck_rfun|||
+ck_rvconst|||
+ck_sassign|||
+ck_select|||
+ck_shift|||
+ck_sort|||
+ck_spair|||
+ck_split|||
+ck_subr|||
+ck_substr|||
+ck_svconst|||
+ck_trunc|||
+ck_unpack|||
+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_xs_usage||5.011000|
+croak|||v
+csighandler||5.009003|n
+curmad|||
+custom_op_desc||5.007003|
+custom_op_name||5.007003|
+cv_ckproto_len|||
+cv_clone|||
+cv_const_sv||5.004000|
+cv_dump|||
+cv_undef|||
+cx_dump||5.005000|
+cx_dup|||
+cxinc|||
+dAXMARK|5.009003||p
+dAX|5.007002||p
+dITEMS|5.007002||p
+dMARK|||
+dMULTICALL||5.009003|
+dMY_CXT_SV|5.007003||p
+dMY_CXT|5.007003||p
+dNOOP|5.006000||p
+dORIGMARK|||
+dSP|||
+dTHR|5.004050||p
+dTHXR|5.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|||
+dXSTARG|5.006000||p
+deb_curcv|||
+deb_nocontext|||vn
+deb_stack_all|||
+deb_stack_n|||
+debop||5.005000|
+debprofdump||5.005000|
+debprof|||
+debstackptrs||5.007003|
+debstack||5.007003|
+debug_start_match|||
+deb||5.007003|v
+del_sv|||
+delete_eval_scope|||
+delimcpy||5.004000|
+deprecate_old|||
+deprecate|||
+despatch_signals||5.007001|
+destroy_matcher|||
+die_nocontext|||vn
+die_where|||
+die|||v
+dirp_dup|||
+div128|||
+djSP|||
+do_aexec5|||
+do_aexec|||
+do_aspawn|||
+do_binmode||5.004050|
+do_chomp|||
+do_chop|||
+do_close|||
+do_dump_pad|||
+do_eof|||
+do_exec3|||
+do_execfree|||
+do_exec|||
+do_gv_dump||5.006000|
+do_gvgv_dump||5.006000|
+do_hv_dump||5.006000|
+do_ipcctl|||
+do_ipcget|||
+do_join|||
+do_kv|||
+do_magic_dump||5.006000|
+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_pmop_dump||5.006000|
+do_pmop_xmldump|||
+do_print|||
+do_readline|||
+do_seek|||
+do_semop|||
+do_shmio|||
+do_smartmatch|||
+do_spawn_nowait|||
+do_spawn|||
+do_sprintf|||
+do_sv_dump||5.006000|
+do_sysseek|||
+do_tell|||
+do_trans_complex_utf8|||
+do_trans_complex|||
+do_trans_count_utf8|||
+do_trans_count|||
+do_trans_simple_utf8|||
+do_trans_simple|||
+do_trans|||
+do_vecget|||
+do_vecset|||
+do_vop|||
+docatch|||
+doeval|||
+dofile|||
+dofindlabel|||
+doform|||
+doing_taint||5.008001|n
+dooneliner|||
+doopen_pm|||
+doparseform|||
+dopoptoeval|||
+dopoptogiven|||
+dopoptolabel|||
+dopoptoloop|||
+dopoptosub_at|||
+dopoptowhen|||
+doref||5.009003|
+dounwind|||
+dowantarray|||
+dump_all||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_cop_io|||
+eval_pv|5.006000||p
+eval_sv|5.006000||p
+exec_failed|||
+expect_number|||
+fbm_compile||5.005000|
+fbm_instr||5.005000|
+feature_is_enabled|||
+fetch_cop_label||5.011000|
+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||5.008001|
+find_rundefsvoffset||5.009002|
+find_script|||
+find_uninit_var|||
+first_symbol|||n
+fold_constants|||
+forbid_setid|||
+force_ident|||
+force_list|||
+force_next|||
+force_version|||
+force_word|||
+forget_pmop|||
+form_nocontext|||vn
+form||5.004000|v
+fp_dup|||
+fprintf_nocontext|||vn
+free_global_struct|||
+free_tied_hv_pool|||
+free_tmps|||
+gen_constant_list|||
+get_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|||
+get_hash_seed|||
+get_hv|5.006000||p
+get_isa_hash|||
+get_mstats|||
+get_no_modify|||
+get_num|||
+get_op_descs||5.005000|
+get_op_names||5.005000|
+get_opargs|||
+get_ppaddr||5.006000|
+get_re_arg|||
+get_sv|5.006000||p
+get_vtbl||5.005030|
+getcwd_sv||5.007002|
+getenv_len|||
+glob_2number|||
+glob_2pv|||
+glob_assign_glob|||
+glob_assign_ref|||
+gp_dup|||
+gp_free|||
+gp_ref|||
+grok_bin|5.007003||p
+grok_hex|5.007003||p
+grok_number|5.007002||p
+grok_numeric_radix|5.007002||p
+grok_oct|5.007003||p
+group_end|||
+gv_AVadd|||
+gv_HVadd|||
+gv_IOadd|||
+gv_SVadd|||
+gv_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|
+gv_fetchmethod_flags||5.011000|
+gv_fetchmethod|||
+gv_fetchmeth|||
+gv_fetchpvn_flags||5.009002|
+gv_fetchpv|||
+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_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.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|
+hv_delete|||
+hv_eiter_p||5.009003|
+hv_eiter_set||5.009003|
+hv_exists_ent||5.004000|
+hv_exists|||
+hv_fetch_ent||5.004000|
+hv_fetchs|5.009003||p
+hv_fetch|||
+hv_free_ent||5.004000|
+hv_iterinit|||
+hv_iterkeysv||5.004000|
+hv_iterkey|||
+hv_iternext_flags||5.008000|
+hv_iternextsv|||
+hv_iternext|||
+hv_iterval|||
+hv_kill_backrefs|||
+hv_ksplit||5.004000|
+hv_magic_check|||n
+hv_magic|||
+hv_name_set||5.009003|
+hv_notallowed|||
+hv_placeholders_get||5.009003|
+hv_placeholders_p||5.009003|
+hv_placeholders_set||5.009003|
+hv_riter_p||5.009003|
+hv_riter_set||5.009003|
+hv_scalar||5.009001|
+hv_store_ent||5.004000|
+hv_store_flags||5.008000|
+hv_stores|5.009004||p
+hv_store|||
+hv_undef|||
+ibcmp_locale||5.004000|
+ibcmp_utf8||5.007003|
+ibcmp|||
+incline|||
+incpush_if_exists|||
+incpush_use_sep|||
+incpush|||
+ingroup|||
+init_argv_symbols|||
+init_debugger|||
+init_global_struct|||
+init_i18nl10n||5.006000|
+init_i18nl14n||5.006000|
+init_ids|||
+init_interp|||
+init_main_stash|||
+init_perllib|||
+init_postdump_symbols|||
+init_predump_symbols|||
+init_stacks||5.005000|
+init_tm||5.007002|
+instr|||
+intro_my|||
+intuit_method|||
+intuit_more|||
+invert|||
+io_close|||
+isALNUMC|5.006000||p
+isALNUM|||
+isALPHA|||
+isASCII|5.006000||p
+isBLANK|5.006001||p
+isCNTRL|5.006000||p
+isDIGIT|||
+isGRAPH|5.006000||p
+isLOWER|||
+isPRINT|5.004000||p
+isPSXSPC|5.006001||p
+isPUNCT|5.006000||p
+isSPACE|||
+isUPPER|||
+isXDIGIT|5.006000||p
+is_an_int|||
+is_gv_magical_sv|||
+is_handle_constructor|||n
+is_list_assignment|||
+is_lvalue_sub||5.007001|
+is_uni_alnum_lc||5.006000|
+is_uni_alnumc_lc||5.006000|
+is_uni_alnumc||5.006000|
+is_uni_alnum||5.006000|
+is_uni_alpha_lc||5.006000|
+is_uni_alpha||5.006000|
+is_uni_ascii_lc||5.006000|
+is_uni_ascii||5.006000|
+is_uni_cntrl_lc||5.006000|
+is_uni_cntrl||5.006000|
+is_uni_digit_lc||5.006000|
+is_uni_digit||5.006000|
+is_uni_graph_lc||5.006000|
+is_uni_graph||5.006000|
+is_uni_idfirst_lc||5.006000|
+is_uni_idfirst||5.006000|
+is_uni_lower_lc||5.006000|
+is_uni_lower||5.006000|
+is_uni_print_lc||5.006000|
+is_uni_print||5.006000|
+is_uni_punct_lc||5.006000|
+is_uni_punct||5.006000|
+is_uni_space_lc||5.006000|
+is_uni_space||5.006000|
+is_uni_upper_lc||5.006000|
+is_uni_upper||5.006000|
+is_uni_xdigit_lc||5.006000|
+is_uni_xdigit||5.006000|
+is_utf8_alnumc||5.006000|
+is_utf8_alnum||5.006000|
+is_utf8_alpha||5.006000|
+is_utf8_ascii||5.006000|
+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|
+is_utf8_idfirst||5.006000|
+is_utf8_lower||5.006000|
+is_utf8_mark||5.006000|
+is_utf8_print||5.006000|
+is_utf8_punct||5.006000|
+is_utf8_space||5.006000|
+is_utf8_string_loclen||5.009003|
+is_utf8_string_loc||5.008001|
+is_utf8_string||5.006001|
+is_utf8_upper||5.006000|
+is_utf8_xdigit||5.006000|
+isa_lookup|||
+items|||n
+ix|||n
+jmaybe|||
+join_exact|||
+keyword|||
+leave_scope|||
+lex_end|||
+lex_start|||
+linklist|||
+listkids|||
+list|||
+load_module_nocontext|||vn
+load_module|5.006000||pv
+localize|||
+looks_like_bool|||
+looks_like_number|||
+lop|||
+mPUSHi|5.009002||p
+mPUSHn|5.009002||p
+mPUSHp|5.009002||p
+mPUSHs|5.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_clearisa|||
+magic_clearpack|||
+magic_clearsig|||
+magic_dump||5.006000|
+magic_existspack|||
+magic_freearylen_p|||
+magic_freeovrld|||
+magic_getarylen|||
+magic_getdefelem|||
+magic_getnkeys|||
+magic_getpack|||
+magic_getpos|||
+magic_getsig|||
+magic_getsubstr|||
+magic_gettaint|||
+magic_getuvar|||
+magic_getvec|||
+magic_get|||
+magic_killbackrefs|||
+magic_len|||
+magic_methcall|||
+magic_methpack|||
+magic_nextpack|||
+magic_regdata_cnt|||
+magic_regdatum_get|||
+magic_regdatum_set|||
+magic_scalarpack|||
+magic_set_all_env|||
+magic_setamagic|||
+magic_setarylen|||
+magic_setcollxfrm|||
+magic_setdbline|||
+magic_setdefelem|||
+magic_setenv|||
+magic_sethint|||
+magic_setisa|||
+magic_setmglob|||
+magic_setnkeys|||
+magic_setpack|||
+magic_setpos|||
+magic_setregexp|||
+magic_setsig|||
+magic_setsubstr|||
+magic_settaint|||
+magic_setutf8|||
+magic_setuvar|||
+magic_setvec|||
+magic_set|||
+magic_sizepack|||
+magic_wipepack|||
+make_matcher|||
+make_trie_failtable|||
+make_trie|||
+malloc_good_size|||n
+malloced_size|||n
+malloc||5.007002|n
+markstack_grow|||
+matcher_matches_sv|||
+measure_struct|||
+memEQ|5.004000||p
+memNE|5.004000||p
+mem_collxfrm|||
+mem_log_common|||n
+mess_alloc|||
+mess_nocontext|||vn
+mess||5.006000|v
+method_common|||
+mfree||5.007002|n
+mg_clear|||
+mg_copy|||
+mg_dup|||
+mg_find|||
+mg_free|||
+mg_get|||
+mg_length||5.005000|
+mg_localize|||
+mg_magical|||
+mg_set|||
+mg_size||5.005000|
+mini_mktime||5.007002|
+missingterm|||
+mode_from_discipline|||
+modkids|||
+mod|||
+more_bodies|||
+more_sv|||
+moreswitches|||
+mro_get_from_name||5.011000|
+mro_get_linear_isa_dfs|||
+mro_get_linear_isa||5.009005|
+mro_get_private_data||5.011000|
+mro_isa_changed_in|||
+mro_meta_dup|||
+mro_meta_init|||
+mro_method_changed_in||5.009005|
+mro_register||5.011000|
+mro_set_mro||5.011000|
+mro_set_private_data||5.011000|
+mul128|||
+mulexp10|||n
+my_atof2||5.007002|
+my_atof||5.006000|
+my_attrs|||
+my_bcopy|||n
+my_betoh16|||n
+my_betoh32|||n
+my_betoh64|||n
+my_betohi|||n
+my_betohl|||n
+my_betohs|||n
+my_bzero|||n
+my_chsize|||
+my_clearenv|||
+my_cxt_index|||
+my_cxt_init|||
+my_dirfd||5.009005|
+my_exit_jump|||
+my_exit|||
+my_failure_exit||5.004000|
+my_fflush_all||5.006000|
+my_fork||5.007003|n
+my_htobe16|||n
+my_htobe32|||n
+my_htobe64|||n
+my_htobei|||n
+my_htobel|||n
+my_htobes|||n
+my_htole16|||n
+my_htole32|||n
+my_htole64|||n
+my_htolei|||n
+my_htolel|||n
+my_htoles|||n
+my_htonl|||
+my_kid|||
+my_letoh16|||n
+my_letoh32|||n
+my_letoh64|||n
+my_letohi|||n
+my_letohl|||n
+my_letohs|||n
+my_lstat|||
+my_memcmp||5.004000|n
+my_memset|||n
+my_ntohl|||
+my_pclose||5.004000|
+my_popen_list||5.007001|
+my_popen||5.004000|
+my_setenv|||
+my_snprintf|5.009004||pvn
+my_socketpair||5.007003|n
+my_sprintf|5.009003||pvn
+my_stat|||
+my_strftime||5.007002|
+my_strlcat|5.009004||pn
+my_strlcpy|5.009004||pn
+my_swabn|||n
+my_swap|||
+my_unexec|||
+my_vsnprintf||5.009004|n
+need_utf8|||n
+newANONATTRSUB||5.006000|
+newANONHASH|||
+newANONLIST|||
+newANONSUB|||
+newASSIGNOP|||
+newATTRSUB||5.006000|
+newAVREF|||
+newAV|||
+newBINOP|||
+newCONDOP|||
+newCONSTSUB|5.004050||p
+newCVREF|||
+newDEFSVOP|||
+newFORM|||
+newFOROP|||
+newGIVENOP||5.009003|
+newGIVWHENOP|||
+newGP|||
+newGVOP|||
+newGVREF|||
+newGVgen|||
+newHVREF|||
+newHVhv||5.005000|
+newHV|||
+newIO|||
+newLISTOP|||
+newLOGOP|||
+newLOOPEX|||
+newLOOPOP|||
+newMADPROP|||
+newMADsv|||
+newMYSUB|||
+newNULLLIST|||
+newOP|||
+newPADOP|||
+newPMOP|||
+newPROG|||
+newPVOP|||
+newRANGE|||
+newRV_inc|5.004000||p
+newRV_noinc|5.004000||p
+newRV|||
+newSLICEOP|||
+newSTATEOP|||
+newSUB|||
+newSVOP|||
+newSVREF|||
+newSV_type||5.009005|
+newSVhek||5.009003|
+newSViv|||
+newSVnv|||
+newSVpvf_nocontext|||vn
+newSVpvf||5.004000|v
+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|
+new_constant|||
+new_ctype||5.006000|
+new_he|||
+new_logop|||
+new_numeric||5.006000|
+new_stackinfo||5.005000|
+new_version||5.009000|
+new_warnings_bitfield|||
+next_symbol|||
+nextargv|||
+nextchar|||
+ninstr|||
+no_bareword_allowed|||
+no_fh_allowed|||
+no_op|||
+not_a_number|||
+nothreadhook||5.008000|
+nuke_stacks|||
+num_overflow|||n
+offer_nice_chunk|||
+oopsAV|||
+oopsHV|||
+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|||
+packlist||5.008001|
+pad_add_anon|||
+pad_add_name|||
+pad_alloc|||
+pad_block_start|||
+pad_check_dup|||
+pad_compname_type|||
+pad_findlex|||
+pad_findmy|||
+pad_fixup_inner_anons|||
+pad_free|||
+pad_leavemy|||
+pad_new|||
+pad_peg|||n
+pad_push|||
+pad_reset|||
+pad_setsv|||
+pad_sv||5.011000|
+pad_swipe|||
+pad_tidy|||
+pad_undef|||
+parse_body|||
+parse_unicode_opts|||
+parser_dup|||
+parser_free|||
+path_is_absolute|||n
+peep|||
+pending_Slabs_to_ro|||
+perl_alloc_using|||n
+perl_alloc|||n
+perl_clone_using|||n
+perl_clone|||n
+perl_construct|||n
+perl_destruct||5.007003|n
+perl_free|||n
+perl_parse||5.006000|n
+perl_run|||n
+pidgone|||
+pm_description|||
+pmflag|||
+pmop_dump||5.006000|
+pmop_xmldump|||
+pmruntime|||
+pmtrans|||
+pop_scope|||
+pregcomp||5.009005|
+pregexec|||
+pregfree2||5.011000|
+pregfree|||
+prepend_elem|||
+prepend_madprops|||
+printbuf|||
+printf_nocontext|||vn
+process_special_blocks|||
+ptr_table_clear||5.009005|
+ptr_table_fetch||5.009005|
+ptr_table_find|||n
+ptr_table_free||5.009005|
+ptr_table_new||5.009005|
+ptr_table_split||5.009005|
+ptr_table_store||5.009005|
+push_scope|||
+put_byte|||
+pv_display|5.006000||p
+pv_escape|5.009004||p
+pv_pretty|5.009004||p
+pv_uni_display||5.007003|
+qerror|||
+qsortsvu|||
+re_compile||5.009005|
+re_croak2|||
+re_dup_guts|||
+re_intuit_start||5.009005|
+re_intuit_string||5.006000|
+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_common|||
+refcounted_he_new|||
+refcounted_he_value|||
+refkids|||
+refto|||
+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_temp_copy|||
+reganode|||
+regatom|||
+regbranch|||
+regclass_swash||5.009004|
+regclass|||
+regcppop|||
+regcppush|||
+regcurly|||n
+regdump_extflags|||
+regdump||5.005000|
+regdupe_internal|||
+regexec_flags||5.005000|
+regfree_internal||5.009005|
+reghop3|||n
+reghop4|||n
+reghopmaybe3|||n
+reginclass|||
+reginitcolors||5.006000|
+reginsert|||
+regmatch|||
+regnext||5.005000|
+regpiece|||
+regpposixcc|||
+regprop|||
+regrepeat|||
+regtail_study|||
+regtail|||
+regtry|||
+reguni|||
+regwhite|||n
+reg|||
+repeatcpy|||
+report_evil_fh|||
+report_uninit|||
+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|||
+rxres_free|||
+rxres_restore|||
+rxres_save|||
+safesyscalloc||5.006000|n
+safesysfree||5.006000|n
+safesysmalloc||5.006000|n
+safesysrealloc||5.006000|n
+same_dirent|||
+save_I16||5.004000|
+save_I32|||
+save_I8||5.006000|
+save_adelete||5.011000|
+save_aelem||5.004050|
+save_alloc||5.006000|
+save_aptr|||
+save_ary|||
+save_bool||5.008001|
+save_clearsv|||
+save_delete|||
+save_destructor_x||5.006000|
+save_destructor||5.006000|
+save_freeop|||
+save_freepv|||
+save_freesv|||
+save_generic_pvref||5.006001|
+save_generic_svref||5.005030|
+save_gp||5.004000|
+save_hash|||
+save_hek_flags|||n
+save_helem_flags||5.011000|
+save_helem||5.004050|
+save_hints|||
+save_hptr|||
+save_int|||
+save_item|||
+save_iv||5.005000|
+save_lines|||
+save_list|||
+save_long|||
+save_magic|||
+save_mortalizesv||5.007001|
+save_nogv|||
+save_op|||
+save_padsv_and_mortalize||5.011000|
+save_pptr|||
+save_pushi32ptr|||
+save_pushptri32ptr|||
+save_pushptrptr|||
+save_pushptr||5.011000|
+save_re_context||5.006000|
+save_scalar_at|||
+save_scalar|||
+save_set_svflags||5.009000|
+save_shared_pvref||5.007003|
+save_sptr|||
+save_svref|||
+save_vptr||5.006000|
+savepvn|||
+savepvs||5.009003|
+savepv|||
+savesharedpvn||5.009005|
+savesharedpv||5.007003|
+savestack_grow_cnt||5.008001|
+savestack_grow|||
+savesvpv||5.009002|
+sawparens|||
+scalar_mod_type|||n
+scalarboolean|||
+scalarkids|||
+scalarseq|||
+scalarvoid|||
+scalar|||
+scan_bin||5.006000|
+scan_commit|||
+scan_const|||
+scan_formline|||
+scan_heredoc|||
+scan_hex|||
+scan_ident|||
+scan_inputsymbol|||
+scan_num||5.007001|
+scan_oct|||
+scan_pat|||
+scan_str|||
+scan_subst|||
+scan_trans|||
+scan_version||5.009001|
+scan_vstring||5.009005|
+scan_word|||
+scope|||
+screaminstr||5.005000|
+search_const|||
+seed||5.008001|
+sequence_num|||
+sequence_tail|||
+sequence|||
+set_context||5.006000|n
+set_numeric_local||5.006000|
+set_numeric_radix||5.006000|
+set_numeric_standard||5.006000|
+setdefout|||
+share_hek_flags|||
+share_hek||5.004000|
+si_dup|||
+sighandler|||n
+simplify_sort|||
+skipspace0|||
+skipspace1|||
+skipspace2|||
+skipspace|||
+softref2xv|||
+sortcv_stacked|||
+sortcv_xsub|||
+sortcv|||
+sortsv_flags||5.009003|
+sortsv||5.007003|
+space_join_names_mortal|||
+ss_dup|||
+stack_grow|||
+start_force|||
+start_glob|||
+start_subparse||5.004000|
+stashpv_hvname_match||5.011000|
+stdize_locale|||
+store_cop_label|||
+strEQ|||
+strGE|||
+strGT|||
+strLE|||
+strLT|||
+strNE|||
+str_to_version||5.006000|
+strip_return|||
+strnEQ|||
+strnNE|||
+study_chunk|||
+sub_crush_depth|||
+sublex_done|||
+sublex_push|||
+sublex_start|||
+sv_2bool|||
+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||p
+sv_2pv_nolen|5.006000||p
+sv_2pvbyte_nolen|5.006000||p
+sv_2pvbyte|5.006000||p
+sv_2pvutf8_nolen||5.006000|
+sv_2pvutf8||5.006000|
+sv_2pv|||
+sv_2uv_flags||5.009001|
+sv_2uv|5.004000||p
+sv_add_arena|||
+sv_add_backref|||
+sv_backoff|||
+sv_bless|||
+sv_cat_decode||5.008001|
+sv_catpv_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.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.004050||p
+sv_catsv_nomg|5.007002||p
+sv_catsv|||
+sv_catxmlpvn|||
+sv_catxmlsv|||
+sv_chop|||
+sv_clean_all|||
+sv_clean_objs|||
+sv_clear|||
+sv_cmp_locale||5.004000|
+sv_cmp|||
+sv_collxfrm|||
+sv_compile_2op||5.008001|
+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|||
+sv_free_arenas|||
+sv_free|||
+sv_gets||5.004000|
+sv_grow|||
+sv_i_ncmp|||
+sv_inc|||
+sv_insert_flags||5.011000|
+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|||
+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||p
+sv_pvn_force|||
+sv_pvn_nomg|5.007003|5.005000|p
+sv_pvn||5.005000|
+sv_pvutf8n_force||5.006000|
+sv_pvutf8n||5.006000|
+sv_pvutf8||5.006000|
+sv_pv||5.006000|
+sv_recode_to_utf8||5.007003|
+sv_reftype|||
+sv_release_COW|||
+sv_replace|||
+sv_report_used|||
+sv_reset|||
+sv_rvweaken||5.006000|
+sv_setiv_mg|5.004050||p
+sv_setiv|||
+sv_setnv_mg|5.006000||p
+sv_setnv|||
+sv_setpv_mg|5.004050||p
+sv_setpvf_mg_nocontext|||pvn
+sv_setpvf_mg|5.006000|5.004000|pv
+sv_setpvf_nocontext|||vn
+sv_setpvf||5.004000|v
+sv_setpviv_mg||5.008001|
+sv_setpviv||5.008001|
+sv_setpvn_mg|5.004050||p
+sv_setpvn|||
+sv_setpvs|5.009004||p
+sv_setpv|||
+sv_setref_iv|||
+sv_setref_nv|||
+sv_setref_pvn|||
+sv_setref_pv|||
+sv_setref_uv||5.007001|
+sv_setsv_cow|||
+sv_setsv_flags||5.007002|
+sv_setsv_mg|5.004050||p
+sv_setsv_nomg|5.007002||p
+sv_setsv|||
+sv_setuv_mg|5.004050||p
+sv_setuv|5.004000||p
+sv_tainted||5.004000|
+sv_taint||5.004000|
+sv_true||5.005000|
+sv_unglob|||
+sv_uni_display||5.007003|
+sv_unmagic|||
+sv_unref_flags||5.007001|
+sv_unref|||
+sv_untaint||5.004000|
+sv_upgrade|||
+sv_usepvn_flags||5.009004|
+sv_usepvn_mg|5.004050||p
+sv_usepvn|||
+sv_utf8_decode||5.006000|
+sv_utf8_downgrade||5.006000|
+sv_utf8_encode||5.006000|
+sv_utf8_upgrade_flags_grow||5.011000|
+sv_utf8_upgrade_flags||5.007002|
+sv_utf8_upgrade_nomg||5.007002|
+sv_utf8_upgrade||5.007001|
+sv_uv|5.005000||p
+sv_vcatpvf_mg|5.006000|5.004000|p
+sv_vcatpvfn||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|
+toLOWER|||
+toUPPER|||
+to_byte_substr|||
+to_uni_fold||5.007003|
+to_uni_lower_lc||5.006000|
+to_uni_lower||5.007003|
+to_uni_title_lc||5.006000|
+to_uni_title||5.007003|
+to_uni_upper_lc||5.006000|
+to_uni_upper||5.007003|
+to_utf8_case||5.007003|
+to_utf8_fold||5.007003|
+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|
+unpackstring||5.008001|
+unshare_hek_or_pvn|||
+unshare_hek|||
+unsharepvn||5.004000|
+unwind_handler_stack|||
+update_debugger_info|||
+upg_version||5.009005|
+usage|||
+utf16_to_utf8_reversed||5.006001|
+utf16_to_utf8||5.006001|
+utf8_distance||5.006000|
+utf8_hop||5.006000|
+utf8_length||5.007001|
+utf8_mg_pos_cache_update|||
+utf8_to_bytes||5.006001|
+utf8_to_uvchr||5.007001|
+utf8_to_uvuni||5.007001|
+utf8n_to_uvchr|||
+utf8n_to_uvuni||5.007001|
+utilize|||
+uvchr_to_utf8_flags||5.007003|
+uvchr_to_utf8|||
+uvuni_to_utf8_flags||5.007003|
+uvuni_to_utf8||5.007001|
+validate_suid|||
+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||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|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|||
+yywarn|||
+);
+
+if (exists $opt{'list-unsupported'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{todo};
+    print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+  }
+  exit 0;
+}
+
+# Scan for possible replacement candidates
+
+my(%replace, %need, %hints, %warnings, %depends);
+my $replace = 0;
+my($hint, $define, $function);
+
+sub find_api
+{
+  my $code = shift;
+  $code =~ s{
+    / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+  | "[^"\\]*(?:\\.[^"\\]*)*"
+  | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
+  grep { exists $API{$_} } $code =~ /(\w+)/mg;
+}
+
+while (<DATA>) {
+  if ($hint) {
+    my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
+    if (m{^\s*\*\s(.*?)\s*$}) {
+      for (@{$hint->[1]}) {
+        $h->{$_} ||= '';  # suppress warning with older perls
+        $h->{$_} .= "$1\n";
+      }
+    }
+    else { undef $hint }
+  }
+
+  $hint = [$1, [split /,?\s+/, $2]]
+      if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
+
+  if ($define) {
+    if ($define->[1] =~ /\\$/) {
+      $define->[1] .= $_;
+    }
+    else {
+      if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
+        my @n = find_api($define->[1]);
+        push @{$depends{$define->[0]}}, @n if @n
+      }
+      undef $define;
+    }
+  }
+
+  $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
+
+  if ($function) {
+    if (/^}/) {
+      if (exists $API{$function->[0]}) {
+        my @n = find_api($function->[1]);
+        push @{$depends{$function->[0]}}, @n if @n
+      }
+      undef $function;
+    }
+    else {
+      $function->[1] .= $_;
+    }
+  }
+
+  $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
+
+  $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+  $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+  $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+  $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+
+  if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+    my @deps = map { s/\s+//g; $_ } split /,/, $3;
+    my $d;
+    for $d (map { s/\s+//g; $_ } split /,/, $1) {
+      push @{$depends{$d}}, @deps;
+    }
+  }
+
+  $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+}
+
+for (values %depends) {
+  my %s;
+  $_ = [sort grep !$s{$_}++, @$_];
+}
+
+if (exists $opt{'api-info'}) {
+  my $f;
+  my $count = 0;
+  my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $f =~ /$match/;
+    print "\n=== $f ===\n\n";
+    my $info = 0;
+    if ($API{$f}{base} || $API{$f}{todo}) {
+      my $base = format_version($API{$f}{base} || $API{$f}{todo});
+      print "Supported at least starting from perl-$base.\n";
+      $info++;
+    }
+    if ($API{$f}{provided}) {
+      my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
+      print "Support by $ppport provided back to perl-$todo.\n";
+      print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+      print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+      print "\n$hints{$f}" if exists $hints{$f};
+      print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
+      $info++;
+    }
+    print "No portability information available.\n" unless $info;
+    $count++;
+  }
+  $count or print "Found no API matching '$opt{'api-info'}'.";
+  print "\n";
+  exit 0;
+}
+
+if (exists $opt{'list-provided'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{provided};
+    my @flags;
+    push @flags, 'explicit' if exists $need{$f};
+    push @flags, 'depend'   if exists $depends{$f};
+    push @flags, 'hint'     if exists $hints{$f};
+    push @flags, 'warning'  if exists $warnings{$f};
+    my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
+    print "$f$flags\n";
+  }
+  exit 0;
+}
+
+my @files;
+my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
+my $srcext = join '|', map { quotemeta $_ } @srcext;
+
+if (@ARGV) {
+  my %seen;
+  for (@ARGV) {
+    if (-e) {
+      if (-f) {
+        push @files, $_ unless $seen{$_}++;
+      }
+      else { warn "'$_' is not a file.\n" }
+    }
+    else {
+      my @new = grep { -f } glob $_
+          or warn "'$_' does not exist.\n";
+      push @files, grep { !$seen{$_}++ } @new;
+    }
+  }
+}
+else {
+  eval {
+    require File::Find;
+    File::Find::find(sub {
+      $File::Find::name =~ /($srcext)$/i
+          and push @files, $File::Find::name;
+    }, '.');
+  };
+  if ($@) {
+    @files = map { glob "*$_" } @srcext;
+  }
+}
+
+if (!@ARGV || $opt{filter}) {
+  my(@in, @out);
+  my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+  for (@files) {
+    my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
+    push @{ $out ? \@out : \@in }, $_;
+  }
+  if (@ARGV && @out) {
+    warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+  }
+  @files = @in;
+}
+
+die "No input files given!\n" unless @files;
+
+my(%files, %global, %revreplace);
+%revreplace = reverse %replace;
+my $filename;
+my $patch_opened = 0;
+
+for $filename (@files) {
+  unless (open IN, "<$filename") {
+    warn "Unable to read from $filename: $!\n";
+    next;
+  }
+
+  info("Scanning $filename ...");
+
+  my $c = do { local $/; <IN> };
+  close IN;
+
+  my %file = (orig => $c, changes => 0);
+
+  # Temporarily remove C/XS comments and strings from the code
+  my @ccom;
+
+  $c =~ s{
+    ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
+    | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
+  | ( ^$HS*\#[^\r\n]*
+    | "[^"\\]*(?:\\.[^"\\]*)*"
+    | '[^'\\]*(?:\\.[^'\\]*)*'
+    | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
+  }{ defined $2 and push @ccom, $2;
+     defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
+
+  $file{ccom} = \@ccom;
+  $file{code} = $c;
+  $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
+
+  my $func;
+
+  for $func (keys %API) {
+    my $match = $func;
+    $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+    if ($c =~ /\b(?:Perl_)?($match)\b/) {
+      $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+      $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+      if (exists $API{$func}{provided}) {
+        $file{uses_provided}{$func}++;
+        if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+          $file{uses}{$func}++;
+          my @deps = rec_depend($func);
+          if (@deps) {
+            $file{uses_deps}{$func} = \@deps;
+            for (@deps) {
+              $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+            }
+          }
+          for ($func, @deps) {
+            $file{needs}{$_} = 'static' if exists $need{$_};
+          }
+        }
+      }
+      if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+        if ($c =~ /\b$func\b/) {
+          $file{uses_todo}{$func}++;
+        }
+      }
+    }
+  }
+
+  while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+    if (exists $need{$2}) {
+      $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+    }
+    else { warning("Possibly wrong #define $1 in $filename") }
+  }
+
+  for (qw(uses needs uses_todo needed_global needed_static)) {
+    for $func (keys %{$file{$_}}) {
+      push @{$global{$_}{$func}}, $filename;
+    }
+  }
+
+  $files{$filename} = \%file;
+}
+
+# Globally resolve NEED_'s
+my $need;
+for $need (keys %{$global{needs}}) {
+  if (@{$global{needs}{$need}} > 1) {
+    my @targets = @{$global{needs}{$need}};
+    my @t = grep $files{$_}{needed_global}{$need}, @targets;
+    @targets = @t if @t;
+    @t = grep /\.xs$/i, @targets;
+    @targets = @t if @t;
+    my $target = shift @targets;
+    $files{$target}{needs}{$need} = 'global';
+    for (@{$global{needs}{$need}}) {
+      $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+    }
+  }
+}
+
+for $filename (@files) {
+  exists $files{$filename} or next;
+
+  info("=== Analyzing $filename ===");
+
+  my %file = %{$files{$filename}};
+  my $func;
+  my $c = $file{code};
+  my $warnings = 0;
+
+  for $func (sort keys %{$file{uses_Perl}}) {
+    if ($API{$func}{varargs}) {
+      unless ($API{$func}{nothxarg}) {
+        my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+                              { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+        if ($changes) {
+          warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+          $file{changes} += $changes;
+        }
+      }
+    }
+    else {
+      warning("Uses Perl_$func instead of $func");
+      $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+                                {$func$1(}g);
+    }
+  }
+
+  for $func (sort keys %{$file{uses_replace}}) {
+    warning("Uses $func instead of $replace{$func}");
+    $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+  }
+
+  for $func (sort keys %{$file{uses_provided}}) {
+    if ($file{uses}{$func}) {
+      if (exists $file{uses_deps}{$func}) {
+        diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+      }
+      else {
+        diag("Uses $func");
+      }
+    }
+    $warnings += hint($func);
+  }
+
+  unless ($opt{quiet}) {
+    for $func (sort keys %{$file{uses_todo}}) {
+      print "*** WARNING: Uses $func, which may not be portable below perl ",
+            format_version($API{$func}{todo}), ", even with '$ppport'\n";
+      $warnings++;
+    }
+  }
+
+  for $func (sort keys %{$file{needed_static}}) {
+    my $message = '';
+    if (not exists $file{uses}{$func}) {
+      $message = "No need to define NEED_$func if $func is never used";
+    }
+    elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+      $message = "No need to define NEED_$func when already needed globally";
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+    }
+  }
+
+  for $func (sort keys %{$file{needed_global}}) {
+    my $message = '';
+    if (not exists $global{uses}{$func}) {
+      $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+    }
+    elsif (exists $file{needs}{$func}) {
+      if ($file{needs}{$func} eq 'extern') {
+        $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+      }
+      elsif ($file{needs}{$func} eq 'static') {
+        $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+      }
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+    }
+  }
+
+  $file{needs_inc_ppport} = keys %{$file{uses}};
+
+  if ($file{needs_inc_ppport}) {
+    my $pp = '';
+
+    for $func (sort keys %{$file{needs}}) {
+      my $type = $file{needs}{$func};
+      next if $type eq 'extern';
+      my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+      unless (exists $file{"needed_$type"}{$func}) {
+        if ($type eq 'global') {
+          diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+        }
+        else {
+          diag("File needs $func, adding static request");
+        }
+        $pp .= "#define NEED_$func$suffix\n";
+      }
+    }
+
+    if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+      $pp = '';
+      $file{changes}++;
+    }
+
+    unless ($file{has_inc_ppport}) {
+      diag("Needs to include '$ppport'");
+      $pp .= qq(#include "$ppport"\n)
+    }
+
+    if ($pp) {
+      $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+                     || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+                     || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+                     || ($c =~ s/^/$pp/);
+    }
+  }
+  else {
+    if ($file{has_inc_ppport}) {
+      diag("No need to include '$ppport'");
+      $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+    }
+  }
+
+  # put back in our C comments
+  my $ix;
+  my $cppc = 0;
+  my @ccom = @{$file{ccom}};
+  for $ix (0 .. $#ccom) {
+    if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+      $cppc++;
+      $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+    }
+    else {
+      $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+    }
+  }
+
+  if ($cppc) {
+    my $s = $cppc != 1 ? 's' : '';
+    warning("Uses $cppc C++ style comment$s, which is not portable");
+  }
+
+  my $s = $warnings != 1 ? 's' : '';
+  my $warn = $warnings ? " ($warnings warning$s)" : '';
+  info("Analysis completed$warn");
+
+  if ($file{changes}) {
+    if (exists $opt{copy}) {
+      my $newfile = "$filename$opt{copy}";
+      if (-e $newfile) {
+        error("'$newfile' already exists, refusing to write copy of '$filename'");
+      }
+      else {
+        local *F;
+        if (open F, ">$newfile") {
+          info("Writing copy of '$filename' with changes to '$newfile'");
+          print F $c;
+          close F;
+        }
+        else {
+          error("Cannot open '$newfile' for writing: $!");
+        }
+      }
+    }
+    elsif (exists $opt{patch} || $opt{changes}) {
+      if (exists $opt{patch}) {
+        unless ($patch_opened) {
+          if (open PATCH, ">$opt{patch}") {
+            $patch_opened = 1;
+          }
+          else {
+            error("Cannot open '$opt{patch}' for writing: $!");
+            delete $opt{patch};
+            $opt{changes} = 1;
+            goto fallback;
+          }
+        }
+        mydiff(\*PATCH, $filename, $c);
+      }
+      else {
+fallback:
+        info("Suggested changes:");
+        mydiff(\*STDOUT, $filename, $c);
+      }
+    }
+    else {
+      my $s = $file{changes} == 1 ? '' : 's';
+      info("$file{changes} potentially required change$s detected");
+    }
+  }
+  else {
+    info("Looks good");
+  }
+}
+
+close PATCH if $patch_opened;
+
+exit 0;
+
+
+sub try_use { eval "use @_;"; return $@ eq '' }
+
+sub mydiff
+{
+  local *F = shift;
+  my($file, $str) = @_;
+  my $diff;
+
+  if (exists $opt{diff}) {
+    $diff = run_diff($opt{diff}, $file, $str);
+  }
+
+  if (!defined $diff and try_use('Text::Diff')) {
+    $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+    $diff = <<HEADER . $diff;
+--- $file
++++ $file.patched
+HEADER
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff -u', $file, $str);
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff', $file, $str);
+  }
+
+  if (!defined $diff) {
+    error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+    return;
+  }
+
+  print F $diff;
+}
+
+sub run_diff
+{
+  my($prog, $file, $str) = @_;
+  my $tmp = 'dppptemp';
+  my $suf = 'aaa';
+  my $diff = '';
+  local *F;
+
+  while (-e "$tmp.$suf") { $suf++ }
+  $tmp = "$tmp.$suf";
+
+  if (open F, ">$tmp") {
+    print F $str;
+    close F;
+
+    if (open F, "$prog $file $tmp |") {
+      while (<F>) {
+        s/\Q$tmp\E/$file.patched/;
+        $diff .= $_;
+      }
+      close F;
+      unlink $tmp;
+      return $diff;
+    }
+
+    unlink $tmp;
+  }
+  else {
+    error("Cannot open '$tmp' for writing: $!");
+  }
+
+  return undef;
+}
+
+sub rec_depend
+{
+  my($func, $seen) = @_;
+  return () unless exists $depends{$func};
+  $seen = {%{$seen||{}}};
+  return () if $seen->{$func}++;
+  my %s;
+  grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
+}
+
+sub parse_version
+{
+  my $ver = shift;
+
+  if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+    return ($1, $2, $3);
+  }
+  elsif ($ver !~ /^\d+\.[\d_]+$/) {
+    die "cannot parse version '$ver'\n";
+  }
+
+  $ver =~ s/_//g;
+  $ver =~ s/$/000000/;
+
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "cannot parse version '$ver'\n";
+    }
+  }
+
+  return ($r, $v, $s);
+}
+
+sub format_version
+{
+  my $ver = shift;
+
+  $ver =~ s/$/000000/;
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "invalid version '$ver'\n";
+    }
+    $s /= 10;
+
+    $ver = sprintf "%d.%03d", $r, $v;
+    $s > 0 and $ver .= sprintf "_%02d", $s;
+
+    return $ver;
+  }
+
+  return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub info
+{
+  $opt{quiet} and return;
+  print @_, "\n";
+}
+
+sub diag
+{
+  $opt{quiet} and return;
+  $opt{diag} and print @_, "\n";
+}
+
+sub warning
+{
+  $opt{quiet} and return;
+  print "*** ", @_, "\n";
+}
+
+sub error
+{
+  print "*** ERROR: ", @_, "\n";
+}
+
+my %given_hints;
+my %given_warnings;
+sub hint
+{
+  $opt{quiet} and return;
+  my $func = shift;
+  my $rv = 0;
+  if (exists $warnings{$func} && !$given_warnings{$func}++) {
+    my $warn = $warnings{$func};
+    $warn =~ s!^!*** !mg;
+    print "*** WARNING: $func\n", $warn;
+    $rv++;
+  }
+  if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
+    my $hint = $hints{$func};
+    $hint =~ s/^/   /mg;
+    print "   --- hint for $func ---\n", $hint;
+  }
+  $rv;
+}
+
+sub usage
+{
+  my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+  my %M = ( 'I' => '*' );
+  $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+  $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+
+  print <<ENDUSAGE;
+
+Usage: $usage
+
+See perldoc $0 for details.
+
+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 (eval \$Devel::PPPort::VERSION < $VERSION) {
+    die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
+      . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
+      . "Please install a newer version, or --unstrip will not work.\\n";
+  }
+  Devel::PPPort::WriteFile(\$0);
+  exit 0;
+}
+print <<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__
+*/
+
+#ifndef _P_P_PORTABILITY_H_
+#define _P_P_PORTABILITY_H_
+
+#ifndef DPPP_NAMESPACE
+#  define DPPP_NAMESPACE DPPP_
+#endif
+
+#define DPPP_CAT2(x,y) CAT2(x,y)
+#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+
+#ifndef PERL_REVISION
+#  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+#    define PERL_PATCHLEVEL_H_IMPLICIT
+#    include <patchlevel.h>
+#  endif
+#  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+#    include <could_not_find_Perl_patchlevel.h>
+#  endif
+#  ifndef PERL_REVISION
+#    define PERL_REVISION       (5)
+     /* Replace: 1 */
+#    define PERL_VERSION        PATCHLEVEL
+#    define PERL_SUBVERSION     SUBVERSION
+     /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+     /* Replace: 0 */
+#  endif
+#endif
+
+#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
+#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION))
+
+/* It is very unlikely that anyone will try to use this with Perl 6
+   (or greater), but who knows.
+ */
+#if PERL_REVISION != 5
+#  error ppport.h only works with Perl version 5
+#endif /* PERL_REVISION != 5 */
+#ifndef dTHR
+#  define dTHR                           dNOOP
+#endif
+#ifndef dTHX
+#  define dTHX                           dNOOP
+#endif
+
+#ifndef dTHXa
+#  define dTHXa(x)                       dNOOP
+#endif
+#ifndef pTHX
+#  define pTHX                           void
+#endif
+
+#ifndef pTHX_
+#  define pTHX_
+#endif
+
+#ifndef aTHX
+#  define aTHX
+#endif
+
+#ifndef aTHX_
+#  define aTHX_
+#endif
+
+#if (PERL_BCDVERSION < 0x5006000)
+#  ifdef USE_THREADS
+#    define aTHXR  thr
+#    define aTHXR_ thr,
+#  else
+#    define aTHXR
+#    define aTHXR_
+#  endif
+#  define dTHXR  dTHR
+#else
+#  define aTHXR  aTHX
+#  define aTHXR_ aTHX_
+#  define dTHXR  dTHX
+#endif
+#ifndef dTHXoa
+#  define dTHXoa(x)                      dTHXa(x)
+#endif
+
+#ifdef I_LIMITS
+#  include <limits.h>
+#endif
+
+#ifndef PERL_UCHAR_MIN
+#  define PERL_UCHAR_MIN ((unsigned char)0)
+#endif
+
+#ifndef PERL_UCHAR_MAX
+#  ifdef UCHAR_MAX
+#    define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+#  else
+#    ifdef MAXUCHAR
+#      define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+#    else
+#      define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_USHORT_MIN
+#  define PERL_USHORT_MIN ((unsigned short)0)
+#endif
+
+#ifndef PERL_USHORT_MAX
+#  ifdef USHORT_MAX
+#    define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+#  else
+#    ifdef MAXUSHORT
+#      define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+#    else
+#      ifdef USHRT_MAX
+#        define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+#      else
+#        define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MAX
+#  ifdef SHORT_MAX
+#    define PERL_SHORT_MAX ((short)SHORT_MAX)
+#  else
+#    ifdef MAXSHORT    /* Often used in <values.h> */
+#      define PERL_SHORT_MAX ((short)MAXSHORT)
+#    else
+#      ifdef SHRT_MAX
+#        define PERL_SHORT_MAX ((short)SHRT_MAX)
+#      else
+#        define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MIN
+#  ifdef SHORT_MIN
+#    define PERL_SHORT_MIN ((short)SHORT_MIN)
+#  else
+#    ifdef MINSHORT
+#      define PERL_SHORT_MIN ((short)MINSHORT)
+#    else
+#      ifdef SHRT_MIN
+#        define PERL_SHORT_MIN ((short)SHRT_MIN)
+#      else
+#        define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MAX
+#  ifdef UINT_MAX
+#    define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+#  else
+#    ifdef MAXUINT
+#      define PERL_UINT_MAX ((unsigned int)MAXUINT)
+#    else
+#      define PERL_UINT_MAX (~(unsigned int)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MIN
+#  define PERL_UINT_MIN ((unsigned int)0)
+#endif
+
+#ifndef PERL_INT_MAX
+#  ifdef INT_MAX
+#    define PERL_INT_MAX ((int)INT_MAX)
+#  else
+#    ifdef MAXINT    /* Often used in <values.h> */
+#      define PERL_INT_MAX ((int)MAXINT)
+#    else
+#      define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_INT_MIN
+#  ifdef INT_MIN
+#    define PERL_INT_MIN ((int)INT_MIN)
+#  else
+#    ifdef MININT
+#      define PERL_INT_MIN ((int)MININT)
+#    else
+#      define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MAX
+#  ifdef ULONG_MAX
+#    define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+#  else
+#    ifdef MAXULONG
+#      define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+#    else
+#      define PERL_ULONG_MAX (~(unsigned long)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MIN
+#  define PERL_ULONG_MIN ((unsigned long)0L)
+#endif
+
+#ifndef PERL_LONG_MAX
+#  ifdef LONG_MAX
+#    define PERL_LONG_MAX ((long)LONG_MAX)
+#  else
+#    ifdef MAXLONG
+#      define PERL_LONG_MAX ((long)MAXLONG)
+#    else
+#      define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_LONG_MIN
+#  ifdef LONG_MIN
+#    define PERL_LONG_MIN ((long)LONG_MIN)
+#  else
+#    ifdef MINLONG
+#      define PERL_LONG_MIN ((long)MINLONG)
+#    else
+#      define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+#  ifndef PERL_UQUAD_MAX
+#    ifdef ULONGLONG_MAX
+#      define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+#    else
+#      ifdef MAXULONGLONG
+#        define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+#      else
+#        define PERL_UQUAD_MAX (~(unsigned long long)0)
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_UQUAD_MIN
+#    define PERL_UQUAD_MIN ((unsigned long long)0L)
+#  endif
+
+#  ifndef PERL_QUAD_MAX
+#    ifdef LONGLONG_MAX
+#      define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+#    else
+#      ifdef MAXLONGLONG
+#        define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+#      else
+#        define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_QUAD_MIN
+#    ifdef LONGLONG_MIN
+#      define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+#    else
+#      ifdef MINLONGLONG
+#        define PERL_QUAD_MIN ((long long)MINLONGLONG)
+#      else
+#        define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+/* This is based on code from 5.003 perl.h */
+#ifdef HAS_QUAD
+#  ifdef cray
+#ifndef IVTYPE
+#  define IVTYPE                         int
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_INT_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_INT_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UINT_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UINT_MAX
+#endif
+
+#    ifdef INTSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         INTSIZE
+#endif
+
+#    endif
+#  else
+#    if defined(convex) || defined(uts)
+#ifndef IVTYPE
+#  define IVTYPE                         long long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_QUAD_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_QUAD_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UQUAD_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UQUAD_MAX
+#endif
+
+#      ifdef LONGLONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGLONGSIZE
+#endif
+
+#      endif
+#    else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#      ifdef LONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGSIZE
+#endif
+
+#      endif
+#    endif
+#  endif
+#ifndef IVSIZE
+#  define IVSIZE                         8
+#endif
+
+#ifndef PERL_QUAD_MIN
+#  define PERL_QUAD_MIN                  IV_MIN
+#endif
+
+#ifndef PERL_QUAD_MAX
+#  define PERL_QUAD_MAX                  IV_MAX
+#endif
+
+#ifndef PERL_UQUAD_MIN
+#  define PERL_UQUAD_MIN                 UV_MIN
+#endif
+
+#ifndef PERL_UQUAD_MAX
+#  define PERL_UQUAD_MAX                 UV_MAX
+#endif
+
+#else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#endif
+
+#ifndef IVSIZE
+#  ifdef LONGSIZE
+#    define IVSIZE LONGSIZE
+#  else
+#    define IVSIZE 4 /* A bold guess, but the best we can make. */
+#  endif
+#endif
+#ifndef UVTYPE
+#  define UVTYPE                         unsigned IVTYPE
+#endif
+
+#ifndef UVSIZE
+#  define UVSIZE                         IVSIZE
+#endif
+#ifndef sv_setuv
+#  define sv_setuv(sv, uv)               \
+               STMT_START {                         \
+                 UV TeMpUv = uv;                    \
+                 if (TeMpUv <= IV_MAX)              \
+                   sv_setiv(sv, TeMpUv);            \
+                 else                               \
+                   sv_setnv(sv, (double)TeMpUv);    \
+               } STMT_END
+#endif
+#ifndef newSVuv
+#  define newSVuv(uv)                    ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#endif
+#ifndef sv_2uv
+#  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
+#ifndef SvUVX
+#  define SvUVX(sv)                      ((UV)SvIVX(sv))
+#endif
+
+#ifndef SvUVXx
+#  define SvUVXx(sv)                     SvUVX(sv)
+#endif
+
+#ifndef SvUV
+#  define SvUV(sv)                       (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#endif
+
+#ifndef SvUVx
+#  define SvUVx(sv)                      ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
+
+/* Hint: sv_uv
+ * Always use the SvUVx() macro instead of sv_uv().
+ */
+#ifndef sv_uv
+#  define sv_uv(sv)                      SvUVx(sv)
+#endif
+
+#if !defined(SvUOK) && defined(SvIOK_UV)
+#  define SvUOK(sv) SvIOK_UV(sv)
+#endif
+#ifndef XST_mUV
+#  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
+#endif
+
+#ifndef XSRETURN_UV
+#  define XSRETURN_UV(v)                 STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
+#endif
+#ifndef PUSHu
+#  define PUSHu(u)                       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG;  } STMT_END
+#endif
+
+#ifndef XPUSHu
+#  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#endif
+
+#ifdef HAS_MEMCMP
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
+#endif
+
+#else
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
+#endif
+
+#endif
+#ifndef MoveD
+#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifndef CopyD
+#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifdef HAS_MEMSET
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
+#endif
+
+#else
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)), d)
+#endif
+
+#endif
+#ifndef PoisonWith
+#  define PoisonWith(d,n,t,b)            (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
+#endif
+
+#ifndef PoisonNew
+#  define PoisonNew(d,n,t)               PoisonWith(d,n,t,0xAB)
+#endif
+
+#ifndef PoisonFree
+#  define PoisonFree(d,n,t)              PoisonWith(d,n,t,0xEF)
+#endif
+
+#ifndef Poison
+#  define Poison(d,n,t)                  PoisonFree(d,n,t)
+#endif
+#ifndef Newx
+#  define Newx(v,n,t)                    New(0,v,n,t)
+#endif
+
+#ifndef Newxc
+#  define Newxc(v,n,t,c)                 Newc(0,v,n,t,c)
+#endif
+
+#ifndef Newxz
+#  define Newxz(v,n,t)                   Newz(0,v,n,t)
+#endif
+
+#ifndef PERL_UNUSED_DECL
+#  ifdef HASATTRIBUTE
+#    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+#      define PERL_UNUSED_DECL
+#    else
+#      define PERL_UNUSED_DECL __attribute__((unused))
+#    endif
+#  else
+#    define PERL_UNUSED_DECL
+#  endif
+#endif
+
+#ifndef PERL_UNUSED_ARG
+#  if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+#    include <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                           /*EMPTY*/(void)0
+#endif
+
+#ifndef dNOOP
+#  define dNOOP                          extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
+#endif
+
+#ifndef NVTYPE
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#    define NVTYPE long double
+#  else
+#    define NVTYPE double
+#  endif
+typedef NVTYPE NV;
+#endif
+
+#ifndef INT2PTR
+#  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+#    define PTRV                  UV
+#    define INT2PTR(any,d)        (any)(d)
+#  else
+#    if PTRSIZE == LONGSIZE
+#      define PTRV                unsigned long
+#    else
+#      define PTRV                unsigned
+#    endif
+#    define INT2PTR(any,d)        (any)(PTRV)(d)
+#  endif
+#endif
+
+#ifndef PTR2ul
+#  if PTRSIZE == LONGSIZE
+#    define PTR2ul(p)     (unsigned long)(p)
+#  else
+#    define PTR2ul(p)     INT2PTR(unsigned long,p)
+#  endif
+#endif
+#ifndef PTR2nat
+#  define PTR2nat(p)                     (PTRV)(p)
+#endif
+
+#ifndef NUM2PTR
+#  define NUM2PTR(any,d)                 (any)PTR2nat(d)
+#endif
+
+#ifndef PTR2IV
+#  define PTR2IV(p)                      INT2PTR(IV,p)
+#endif
+
+#ifndef PTR2UV
+#  define PTR2UV(p)                      INT2PTR(UV,p)
+#endif
+
+#ifndef PTR2NV
+#  define PTR2NV(p)                      NUM2PTR(NV,p)
+#endif
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C
+#  define END_EXTERN_C
+#  define EXTERN_C extern
+#endif
+
+#if defined(PERL_GCC_PEDANTIC)
+#  ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  endif
+#endif
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+#  ifndef PERL_USE_GCC_BRACE_GROUPS
+#    define PERL_USE_GCC_BRACE_GROUPS
+#  endif
+#endif
+
+#undef STMT_START
+#undef STMT_END
+#ifdef PERL_USE_GCC_BRACE_GROUPS
+#  define STMT_START   (void)( /* gcc supports ``({ STATEMENTS; })'' */
+#  define STMT_END     )
+#else
+#  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+#    define STMT_START if (1)
+#    define STMT_END   else (void)0
+#  else
+#    define STMT_START do
+#    define STMT_END   while (0)
+#  endif
+#endif
+#ifndef boolSV
+#  define boolSV(b)                      ((b) ? &PL_sv_yes : &PL_sv_no)
+#endif
+
+/* DEFSV appears first in 5.004_56 */
+#ifndef DEFSV
+#  define DEFSV                          GvSV(PL_defgv)
+#endif
+
+#ifndef SAVE_DEFSV
+#  define SAVE_DEFSV                     SAVESPTR(GvSV(PL_defgv))
+#endif
+
+#ifndef DEFSV_set
+#  define DEFSV_set(sv)                  (DEFSV = (sv))
+#endif
+
+/* Older perls (<=5.003) lack AvFILLp */
+#ifndef AvFILLp
+#  define AvFILLp                        AvFILL
+#endif
+#ifndef ERRSV
+#  define ERRSV                          get_sv("@",FALSE)
+#endif
+
+/* Hint: gv_stashpvn
+ * This function's backport doesn't support the length parameter, but
+ * rather ignores it. Portability can only be ensured if the length
+ * parameter is used for speed reasons, but the length can always be
+ * correctly computed from the string argument.
+ */
+#ifndef gv_stashpvn
+#  define gv_stashpvn(str,len,create)    gv_stashpv(str,create)
+#endif
+
+/* Replace: 1 */
+#ifndef get_cv
+#  define get_cv                         perl_get_cv
+#endif
+
+#ifndef get_sv
+#  define get_sv                         perl_get_sv
+#endif
+
+#ifndef get_av
+#  define get_av                         perl_get_av
+#endif
+
+#ifndef get_hv
+#  define get_hv                         perl_get_hv
+#endif
+
+/* Replace: 0 */
+#ifndef dUNDERBAR
+#  define dUNDERBAR                      dNOOP
+#endif
+
+#ifndef UNDERBAR
+#  define UNDERBAR                       DEFSV
+#endif
+#ifndef dAX
+#  define dAX                            I32 ax = MARK - PL_stack_base + 1
+#endif
+
+#ifndef dITEMS
+#  define dITEMS                         I32 items = SP - MARK
+#endif
+#ifndef dXSTARG
+#  define dXSTARG                        SV * targ = sv_newmortal()
+#endif
+#ifndef dAXMARK
+#  define dAXMARK                        I32 ax = POPMARK; \
+                               register SV ** const mark = PL_stack_base + ax++
+#endif
+#ifndef XSprePUSH
+#  define XSprePUSH                      (sp = PL_stack_base + ax - 1)
+#endif
+
+#if (PERL_BCDVERSION < 0x5005000)
+#  undef XSRETURN
+#  define XSRETURN(off)                                   \
+      STMT_START {                                        \
+          PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+          return;                                         \
+      } STMT_END
+#endif
+#ifndef PERL_ABS
+#  define PERL_ABS(x)                    ((x) < 0 ? -(x) : (x))
+#endif
+#ifndef dVAR
+#  define dVAR                           dNOOP
+#endif
+#ifndef SVf
+#  define SVf                            "_"
+#endif
+#ifndef UTF8_MAXBYTES
+#  define UTF8_MAXBYTES                  UTF8_MAXLEN
+#endif
+#ifndef CPERLscope
+#  define CPERLscope(x)                  x
+#endif
+#ifndef PERL_HASH
+#  define PERL_HASH(hash,str,len)        \
+     STMT_START        { \
+       const char *s_PeRlHaSh = str; \
+       I32 i_PeRlHaSh = len; \
+       U32 hash_PeRlHaSh = 0; \
+       while (i_PeRlHaSh--) \
+           hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
+       (hash) = hash_PeRlHaSh; \
+    } STMT_END
+#endif
+
+#ifndef PERLIO_FUNCS_DECL
+# ifdef PERLIO_FUNCS_CONST
+#  define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
+#  define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
+# else
+#  define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
+#  define PERLIO_FUNCS_CAST(funcs) (funcs)
+# endif
+#endif
+
+/* provide these typedefs for older perls */
+#if (PERL_BCDVERSION < 0x5009003)
+
+# ifdef ARGSproto
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
+# else
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
+# endif
+
+typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
+
+#endif
+#ifndef isPSXSPC
+#  define isPSXSPC(c)                    (isSPACE(c) || (c) == '\v')
+#endif
+
+#ifndef isBLANK
+#  define isBLANK(c)                     ((c) == ' ' || (c) == '\t')
+#endif
+
+#ifdef EBCDIC
+#ifndef isALNUMC
+#  define isALNUMC(c)                    isalnum(c)
+#endif
+
+#ifndef isASCII
+#  define isASCII(c)                     isascii(c)
+#endif
+
+#ifndef isCNTRL
+#  define isCNTRL(c)                     iscntrl(c)
+#endif
+
+#ifndef isGRAPH
+#  define isGRAPH(c)                     isgraph(c)
+#endif
+
+#ifndef isPRINT
+#  define isPRINT(c)                     isprint(c)
+#endif
+
+#ifndef isPUNCT
+#  define isPUNCT(c)                     ispunct(c)
+#endif
+
+#ifndef isXDIGIT
+#  define isXDIGIT(c)                    isxdigit(c)
+#endif
+
+#else
+# if (PERL_BCDVERSION < 0x5010000)
+/* Hint: isPRINT
+ * The implementation in older perl versions includes all of the
+ * isSPACE() characters, which is wrong. The version provided by
+ * Devel::PPPort always overrides a present buggy version.
+ */
+#  undef isPRINT
+# endif
+#ifndef isALNUMC
+#  define isALNUMC(c)                    (isALPHA(c) || isDIGIT(c))
+#endif
+
+#ifndef isASCII
+#  define isASCII(c)                     ((c) <= 127)
+#endif
+
+#ifndef isCNTRL
+#  define isCNTRL(c)                     ((c) < ' ' || (c) == 127)
+#endif
+
+#ifndef isGRAPH
+#  define isGRAPH(c)                     (isALNUM(c) || isPUNCT(c))
+#endif
+
+#ifndef isPRINT
+#  define isPRINT(c)                     (((c) >= 32 && (c) < 127))
+#endif
+
+#ifndef isPUNCT
+#  define isPUNCT(c)                     (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64)  || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+#endif
+
+#ifndef isXDIGIT
+#  define isXDIGIT(c)                    (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+#endif
+
+#ifndef PERL_SIGNALS_UNSAFE_FLAG
+
+#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+
+#if (PERL_BCDVERSION < 0x5008000)
+#  define D_PPP_PERL_SIGNALS_INIT   PERL_SIGNALS_UNSAFE_FLAG
+#else
+#  define D_PPP_PERL_SIGNALS_INIT   0
+#endif
+
+#if defined(NEED_PL_signals)
+static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#elif defined(NEED_PL_signals_GLOBAL)
+U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#else
+extern U32 DPPP_(my_PL_signals);
+#endif
+#define PL_signals DPPP_(my_PL_signals)
+
+#endif
+
+/* Hint: PL_ppaddr
+ * Calling an op via PL_ppaddr requires passing a context argument
+ * for threaded builds. Since the context argument is different for
+ * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will
+ * automatically be defined as the correct argument.
+ */
+
+#if (PERL_BCDVERSION <= 0x5005005)
+/* Replace: 1 */
+#  define PL_ppaddr                 ppaddr
+#  define PL_no_modify              no_modify
+/* Replace: 0 */
+#endif
+
+#if (PERL_BCDVERSION <= 0x5004005)
+/* Replace: 1 */
+#  define PL_DBsignal               DBsignal
+#  define PL_DBsingle               DBsingle
+#  define PL_DBsub                  DBsub
+#  define PL_DBtrace                DBtrace
+#  define PL_Sv                     Sv
+#  define PL_bufend                 bufend
+#  define PL_bufptr                 bufptr
+#  define PL_compiling              compiling
+#  define PL_copline                copline
+#  define PL_curcop                 curcop
+#  define PL_curstash               curstash
+#  define PL_debstash               debstash
+#  define PL_defgv                  defgv
+#  define PL_diehook                diehook
+#  define PL_dirty                  dirty
+#  define PL_dowarn                 dowarn
+#  define PL_errgv                  errgv
+#  define PL_expect                 expect
+#  define PL_hexdigit               hexdigit
+#  define PL_hints                  hints
+#  define PL_laststatval            laststatval
+#  define PL_lex_state              lex_state
+#  define PL_lex_stuff              lex_stuff
+#  define PL_linestr                linestr
+#  define PL_na                     na
+#  define PL_perl_destruct_level    perl_destruct_level
+#  define PL_perldb                 perldb
+#  define PL_rsfp_filters           rsfp_filters
+#  define PL_rsfp                   rsfp
+#  define PL_stack_base             stack_base
+#  define PL_stack_sp               stack_sp
+#  define PL_statcache              statcache
+#  define PL_stdingv                stdingv
+#  define PL_sv_arenaroot           sv_arenaroot
+#  define PL_sv_no                  sv_no
+#  define PL_sv_undef               sv_undef
+#  define PL_sv_yes                 sv_yes
+#  define PL_tainted                tainted
+#  define PL_tainting               tainting
+#  define PL_tokenbuf               tokenbuf
+/* Replace: 0 */
+#endif
+
+/* Warning: PL_parser
+ * For perl versions earlier than 5.9.5, this is an always
+ * non-NULL dummy. Also, it cannot be dereferenced. Don't
+ * use it if you can avoid is and unless you absolutely know
+ * what you're doing.
+ * If you always check that PL_parser is non-NULL, you can
+ * define DPPP_PL_parser_NO_DUMMY to avoid the creation of
+ * a dummy parser structure.
+ */
+
+#if (PERL_BCDVERSION >= 0x5009005)
+# ifdef DPPP_PL_parser_NO_DUMMY
+#  define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+                (croak("panic: PL_parser == NULL in %s:%d", \
+                       __FILE__, __LINE__), (yy_parser *) NULL))->var)
+# else
+#  ifdef DPPP_PL_parser_NO_DUMMY_WARNING
+#   define D_PPP_parser_dummy_warning(var)
+#  else
+#   define D_PPP_parser_dummy_warning(var) \
+             warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__),
+#  endif
+#  define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+                (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var)
+#if defined(NEED_PL_parser)
+static yy_parser DPPP_(dummy_PL_parser);
+#elif defined(NEED_PL_parser_GLOBAL)
+yy_parser DPPP_(dummy_PL_parser);
+#else
+extern yy_parser DPPP_(dummy_PL_parser);
+#endif
+
+# endif
+
+/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */
+/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf
+ * Do not use this variable unless you know exactly what you're
+ * doint. It is internal to the perl parser and may change or even
+ * be removed in the future. As of perl 5.9.5, you have to check
+ * for (PL_parser != NULL) for this variable to have any effect.
+ * An always non-NULL PL_parser dummy is provided for earlier
+ * perl versions.
+ * If PL_parser is NULL when you try to access this variable, a
+ * dummy is being accessed instead and a warning is issued unless
+ * you define DPPP_PL_parser_NO_DUMMY_WARNING.
+ * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access
+ * this variable will croak with a panic message.
+ */
+
+# define PL_expect         D_PPP_my_PL_parser_var(expect)
+# define PL_copline        D_PPP_my_PL_parser_var(copline)
+# define PL_rsfp           D_PPP_my_PL_parser_var(rsfp)
+# define PL_rsfp_filters   D_PPP_my_PL_parser_var(rsfp_filters)
+# define PL_linestr        D_PPP_my_PL_parser_var(linestr)
+# define PL_bufptr         D_PPP_my_PL_parser_var(bufptr)
+# define PL_bufend         D_PPP_my_PL_parser_var(bufend)
+# define PL_lex_state      D_PPP_my_PL_parser_var(lex_state)
+# define PL_lex_stuff      D_PPP_my_PL_parser_var(lex_stuff)
+# define PL_tokenbuf       D_PPP_my_PL_parser_var(tokenbuf)
+
+#else
+
+/* ensure that PL_parser != NULL and cannot be dereferenced */
+# define PL_parser         ((void *) 1)
+
+#endif
+#ifndef mPUSHs
+#  define mPUSHs(s)                      PUSHs(sv_2mortal(s))
+#endif
+
+#ifndef PUSHmortal
+#  define PUSHmortal                     PUSHs(sv_newmortal())
+#endif
+
+#ifndef mPUSHp
+#  define mPUSHp(p,l)                    sv_setpvn(PUSHmortal, (p), (l))
+#endif
+
+#ifndef mPUSHn
+#  define mPUSHn(n)                      sv_setnv(PUSHmortal, (NV)(n))
+#endif
+
+#ifndef mPUSHi
+#  define mPUSHi(i)                      sv_setiv(PUSHmortal, (IV)(i))
+#endif
+
+#ifndef mPUSHu
+#  define mPUSHu(u)                      sv_setuv(PUSHmortal, (UV)(u))
+#endif
+#ifndef mXPUSHs
+#  define mXPUSHs(s)                     XPUSHs(sv_2mortal(s))
+#endif
+
+#ifndef XPUSHmortal
+#  define XPUSHmortal                    XPUSHs(sv_newmortal())
+#endif
+
+#ifndef mXPUSHp
+#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
+#endif
+
+#ifndef mXPUSHn
+#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
+#endif
+
+#ifndef mXPUSHi
+#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
+#endif
+
+#ifndef mXPUSHu
+#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
+#endif
+
+/* Replace: 1 */
+#ifndef call_sv
+#  define call_sv                        perl_call_sv
+#endif
+
+#ifndef call_pv
+#  define call_pv                        perl_call_pv
+#endif
+
+#ifndef call_argv
+#  define call_argv                      perl_call_argv
+#endif
+
+#ifndef call_method
+#  define call_method                    perl_call_method
+#endif
+#ifndef eval_sv
+#  define eval_sv                        perl_eval_sv
+#endif
+
+/* Replace: 0 */
+#ifndef PERL_LOADMOD_DENY
+#  define PERL_LOADMOD_DENY              0x1
+#endif
+
+#ifndef PERL_LOADMOD_NOIMPORT
+#  define PERL_LOADMOD_NOIMPORT          0x2
+#endif
+
+#ifndef PERL_LOADMOD_IMPORT_OPS
+#  define PERL_LOADMOD_IMPORT_OPS        0x4
+#endif
+
+#ifndef G_METHOD
+# define G_METHOD              64
+# ifdef call_sv
+#  undef call_sv
+# endif
+# if (PERL_BCDVERSION < 0x5006000)
+#  define call_sv(sv, flags)  ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
+                               (flags) & ~G_METHOD) : perl_call_sv(sv, flags))
+# else
+#  define call_sv(sv, flags)  ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
+                               (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
+# endif
+#endif
+
+/* Replace perl_eval_pv with eval_pv */
+
+#ifndef eval_pv
+#if defined(NEED_eval_pv)
+static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+static
+#else
+extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+#endif
+
+#ifdef eval_pv
+#  undef eval_pv
+#endif
+#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
+#define Perl_eval_pv DPPP_(my_eval_pv)
+
+#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
+
+SV*
+DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
+{
+    dSP;
+    SV* sv = newSVpv(p, 0);
+
+    PUSHMARK(sp);
+    eval_sv(sv, G_SCALAR);
+    SvREFCNT_dec(sv);
+
+    SPAGAIN;
+    sv = POPs;
+    PUTBACK;
+
+    if (croak_on_error && SvTRUE(GvSV(errgv)))
+       croak(SvPVx(GvSV(errgv), na));
+
+    return sv;
+}
+
+#endif
+#endif
+
+#ifndef vload_module
+#if defined(NEED_vload_module)
+static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+static
+#else
+extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+#endif
+
+#ifdef vload_module
+#  undef vload_module
+#endif
+#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d)
+#define Perl_vload_module DPPP_(my_vload_module)
+
+#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL)
+
+void
+DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args)
+{
+    dTHR;
+    dVAR;
+    OP *veop, *imop;
+
+    OP * const modname = newSVOP(OP_CONST, 0, name);
+    /* 5.005 has a somewhat hacky force_normal that doesn't croak on
+       SvREADONLY() if PL_compling is true. Current perls take care in
+       ck_require() to correctly turn off SvREADONLY before calling
+       force_normal_flags(). This seems a better fix than fudging PL_compling
+     */
+    SvREADONLY_off(((SVOP*)modname)->op_sv);
+    modname->op_private |= OPpCONST_BARE;
+    if (ver) {
+       veop = newSVOP(OP_CONST, 0, ver);
+    }
+    else
+       veop = NULL;
+    if (flags & PERL_LOADMOD_NOIMPORT) {
+       imop = sawparens(newNULLLIST());
+    }
+    else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+       imop = va_arg(*args, OP*);
+    }
+    else {
+       SV *sv;
+       imop = NULL;
+       sv = va_arg(*args, SV*);
+       while (sv) {
+           imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+           sv = va_arg(*args, SV*);
+       }
+    }
+    {
+       const line_t ocopline = PL_copline;
+       COP * const ocurcop = PL_curcop;
+       const int oexpect = PL_expect;
+
+#if (PERL_BCDVERSION >= 0x5004000)
+       utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
+               veop, modname, imop);
+#else
+       utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
+               modname, imop);
+#endif
+       PL_expect = oexpect;
+       PL_copline = ocopline;
+       PL_curcop = ocurcop;
+    }
+}
+
+#endif
+#endif
+
+#ifndef load_module
+#if defined(NEED_load_module)
+static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+static
+#else
+extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+#endif
+
+#ifdef load_module
+#  undef load_module
+#endif
+#define load_module DPPP_(my_load_module)
+#define Perl_load_module DPPP_(my_load_module)
+
+#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL)
+
+void
+DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...)
+{
+    va_list args;
+    va_start(args, ver);
+    vload_module(flags, name, ver, &args);
+    va_end(args);
+}
+
+#endif
+#endif
+#ifndef newRV_inc
+#  define newRV_inc(sv)                  newRV(sv)   /* Replace */
+#endif
+
+#ifndef newRV_noinc
+#if defined(NEED_newRV_noinc)
+static SV * DPPP_(my_newRV_noinc)(SV *sv);
+static
+#else
+extern SV * DPPP_(my_newRV_noinc)(SV *sv);
+#endif
+
+#ifdef newRV_noinc
+#  undef newRV_noinc
+#endif
+#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
+#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
+
+#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
+SV *
+DPPP_(my_newRV_noinc)(SV *sv)
+{
+  SV *rv = (SV *)newRV(sv);
+  SvREFCNT_dec(sv);
+  return rv;
+}
+#endif
+#endif
+
+/* Hint: newCONSTSUB
+ * Returns a CV* as of perl-5.7.1. This return value is not supported
+ * by Devel::PPPort.
+ */
+
+/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005)
+#if defined(NEED_newCONSTSUB)
+static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+static
+#else
+extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+#endif
+
+#ifdef newCONSTSUB
+#  undef newCONSTSUB
+#endif
+#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
+#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
+
+#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
+
+/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
+/* (There's no PL_parser in perl < 5.005, so this is completely safe)     */
+#define D_PPP_PL_copline PL_copline
+
+void
+DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv)
+{
+       U32 oldhints = PL_hints;
+       HV *old_cop_stash = PL_curcop->cop_stash;
+       HV *old_curstash = PL_curstash;
+       line_t oldline = PL_curcop->cop_line;
+       PL_curcop->cop_line = D_PPP_PL_copline;
+
+       PL_hints &= ~HINT_BLOCK_SCOPE;
+       if (stash)
+               PL_curstash = PL_curcop->cop_stash = stash;
+
+       newSUB(
+
+#if   (PERL_BCDVERSION < 0x5003022)
+               start_subparse(),
+#elif (PERL_BCDVERSION == 0x5003022)
+               start_subparse(0),
+#else  /* 5.003_23  onwards */
+               start_subparse(FALSE, 0),
+#endif
+
+               newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
+               newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
+               newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+       );
+
+       PL_hints = oldhints;
+       PL_curcop->cop_stash = old_cop_stash;
+       PL_curstash = old_curstash;
+       PL_curcop->cop_line = oldline;
+}
+#endif
+#endif
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C.  All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe.  See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ *    all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ *    (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ *    MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ *    access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+    defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
+
+#ifndef START_MY_CXT
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope).  The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if (PERL_BCDVERSION < 0x5004068)
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+       SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+       SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,             \
+                                 sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT        \
+       dMY_CXT_SV;                                                     \
+       my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+       dMY_CXT_SV;                                                     \
+       /* newSV() allocates one more than needed */                    \
+       my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+       Zero(my_cxtp, 1, my_cxt_t);                                     \
+       sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT         (*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used.  Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT                my_cxt_t *my_cxtp
+#define pMY_CXT_       pMY_CXT,
+#define _pMY_CXT       ,pMY_CXT
+#define aMY_CXT                my_cxtp
+#define aMY_CXT_       aMY_CXT,
+#define _aMY_CXT       ,aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+       dMY_CXT_SV;                                                     \
+       my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+       Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+       sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+#endif
+
+#else /* single interpreter */
+
+#ifndef START_MY_CXT
+
+#define START_MY_CXT   static my_cxt_t my_cxt;
+#define dMY_CXT_SV     dNOOP
+#define dMY_CXT                dNOOP
+#define MY_CXT_INIT    NOOP
+#define MY_CXT         my_cxt
+
+#define pMY_CXT                void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+#define MY_CXT_CLONE   NOOP
+#endif
+
+#endif
+
+#ifndef IVdf
+#  if IVSIZE == LONGSIZE
+#    define    IVdf      "ld"
+#    define    UVuf      "lu"
+#    define    UVof      "lo"
+#    define    UVxf      "lx"
+#    define    UVXf      "lX"
+#  else
+#    if IVSIZE == INTSIZE
+#      define  IVdf      "d"
+#      define  UVuf      "u"
+#      define  UVof      "o"
+#      define  UVxf      "x"
+#      define  UVXf      "X"
+#    endif
+#  endif
+#endif
+
+#ifndef NVef
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+      defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000)
+            /* Not very likely, but let's try anyway. */
+#    define NVef          PERL_PRIeldbl
+#    define NVff          PERL_PRIfldbl
+#    define NVgf          PERL_PRIgldbl
+#  else
+#    define NVef          "e"
+#    define NVff          "f"
+#    define NVgf          "g"
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc(sv)           \
+      ({                               \
+          SV * const _sv = (SV*)(sv);  \
+          if (_sv)                     \
+               (SvREFCNT(_sv))++;      \
+          _sv;                         \
+      })
+#  else
+#    define SvREFCNT_inc(sv)   \
+          ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_simple
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_simple(sv)    \
+      ({                                       \
+          if (sv)                              \
+               (SvREFCNT(sv))++;               \
+          (SV *)(sv);                          \
+      })
+#  else
+#    define SvREFCNT_inc_simple(sv) \
+          ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_NN
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_NN(sv)                \
+      ({                                       \
+          SV * const _sv = (SV*)(sv);  \
+          SvREFCNT(_sv)++;             \
+          _sv;                         \
+      })
+#  else
+#    define SvREFCNT_inc_NN(sv) \
+          (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_void
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_void(sv)              \
+      ({                                       \
+          SV * const _sv = (SV*)(sv);  \
+          if (_sv)                     \
+              (void)(SvREFCNT(_sv)++); \
+      })
+#  else
+#    define SvREFCNT_inc_void(sv) \
+          (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+#  endif
+#endif
+#ifndef SvREFCNT_inc_simple_void
+#  define SvREFCNT_inc_simple_void(sv)   STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+#endif
+
+#ifndef SvREFCNT_inc_simple_NN
+#  define SvREFCNT_inc_simple_NN(sv)     (++SvREFCNT(sv), (SV*)(sv))
+#endif
+
+#ifndef SvREFCNT_inc_void_NN
+#  define SvREFCNT_inc_void_NN(sv)       (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef SvREFCNT_inc_simple_void_NN
+#  define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#if (PERL_BCDVERSION < 0x5006000)
+# define D_PPP_CONSTPV_ARG(x)  ((char *) (x))
+#else
+# define D_PPP_CONSTPV_ARG(x)  (x)
+#endif
+#ifndef newSVpvn
+#  define newSVpvn(data,len)             ((data)                                              \
+                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+                                    : newSV(0))
+#endif
+#ifndef newSVpvn_utf8
+#  define newSVpvn_utf8(s, len, u)       newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+#endif
+#ifndef SVf_UTF8
+#  define SVf_UTF8                       0
+#endif
+
+#ifndef newSVpvn_flags
+
+#if defined(NEED_newSVpvn_flags)
+static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+static
+#else
+extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+#endif
+
+#ifdef newSVpvn_flags
+#  undef newSVpvn_flags
+#endif
+#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c)
+#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags)
+
+#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL)
+
+SV *
+DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags)
+{
+  SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
+  SvFLAGS(sv) |= (flags & SVf_UTF8);
+  return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
+}
+
+#endif
+
+#endif
+
+/* Backwards compatibility stuff... :-( */
+#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
+#  define NEED_sv_2pv_flags
+#endif
+#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
+#  define NEED_sv_2pv_flags_GLOBAL
+#endif
+
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
+ */
+#ifndef sv_2pv_nolen
+#  define sv_2pv_nolen(sv)               SvPV_nolen(sv)
+#endif
+
+#ifdef SvPVbyte
+
+/* Hint: SvPVbyte
+ * Does not work in perl-5.6.1, ppport.h implements a version
+ * borrowed from perl-5.7.3.
+ */
+
+#if (PERL_BCDVERSION < 0x5007000)
+
+#if defined(NEED_sv_2pvbyte)
+static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+static
+#else
+extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+#endif
+
+#ifdef sv_2pvbyte
+#  undef sv_2pvbyte
+#endif
+#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
+#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
+
+#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
+
+char *
+DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp)
+{
+  sv_utf8_downgrade(sv,0);
+  return SvPV(sv,*lp);
+}
+
+#endif
+
+/* Hint: sv_2pvbyte
+ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+ */
+
+#undef SvPVbyte
+
+#define SvPVbyte(sv, lp)                                                \
+        ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
+         ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#endif
+
+#else
+
+#  define SvPVbyte          SvPV
+#  define sv_2pvbyte        sv_2pv
+
+#endif
+#ifndef sv_2pvbyte_nolen
+#  define sv_2pvbyte_nolen(sv)           sv_2pv_nolen(sv)
+#endif
+
+/* Hint: sv_pvn
+ * Always use the SvPV() macro instead of sv_pvn().
+ */
+
+/* Hint: sv_pvn_force
+ * Always use the SvPV_force() macro instead of sv_pvn_force().
+ */
+
+/* If these are undefined, they're not handled by the core anyway */
+#ifndef SV_IMMEDIATE_UNREF
+#  define SV_IMMEDIATE_UNREF             0
+#endif
+
+#ifndef SV_GMAGIC
+#  define SV_GMAGIC                      0
+#endif
+
+#ifndef SV_COW_DROP_PV
+#  define SV_COW_DROP_PV                 0
+#endif
+
+#ifndef SV_UTF8_NO_ENCODING
+#  define SV_UTF8_NO_ENCODING            0
+#endif
+
+#ifndef SV_NOSTEAL
+#  define SV_NOSTEAL                     0
+#endif
+
+#ifndef SV_CONST_RETURN
+#  define SV_CONST_RETURN                0
+#endif
+
+#ifndef SV_MUTABLE_RETURN
+#  define SV_MUTABLE_RETURN              0
+#endif
+
+#ifndef SV_SMAGIC
+#  define SV_SMAGIC                      0
+#endif
+
+#ifndef SV_HAS_TRAILING_NUL
+#  define SV_HAS_TRAILING_NUL            0
+#endif
+
+#ifndef SV_COW_SHARED_HASH_KEYS
+#  define SV_COW_SHARED_HASH_KEYS        0
+#endif
+
+#if (PERL_BCDVERSION < 0x5007002)
+
+#if defined(NEED_sv_2pv_flags)
+static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+#endif
+
+#ifdef sv_2pv_flags
+#  undef sv_2pv_flags
+#endif
+#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c)
+#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags)
+
+#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+  STRLEN n_a = (STRLEN) flags;
+  return sv_2pv(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#if defined(NEED_sv_pvn_force_flags)
+static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+#endif
+
+#ifdef sv_pvn_force_flags
+#  undef sv_pvn_force_flags
+#endif
+#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c)
+#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags)
+
+#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+  STRLEN n_a = (STRLEN) flags;
+  return sv_pvn_force(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) )
+# define DPPP_SVPV_NOLEN_LP_ARG &PL_na
+#else
+# define DPPP_SVPV_NOLEN_LP_ARG 0
+#endif
+#ifndef SvPV_const
+#  define SvPV_const(sv, lp)             SvPV_flags_const(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_mutable
+#  define SvPV_mutable(sv, lp)           SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+#ifndef SvPV_flags
+#  define SvPV_flags(sv, lp, flags)      \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_flags_const
+#  define SvPV_flags_const(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
+                  (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_const_nolen
+#  define SvPV_flags_const_nolen(sv, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX_const(sv) : \
+                  (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_mutable
+#  define SvPV_flags_mutable(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
+                  sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_force
+#  define SvPV_force(sv, lp)             SvPV_force_flags(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nolen
+#  define SvPV_force_nolen(sv)           SvPV_force_flags_nolen(sv, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_mutable
+#  define SvPV_force_mutable(sv, lp)     SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nomg
+#  define SvPV_force_nomg(sv, lp)        SvPV_force_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_force_nomg_nolen
+#  define SvPV_force_nomg_nolen(sv)      SvPV_force_flags_nolen(sv, 0)
+#endif
+#ifndef SvPV_force_flags
+#  define SvPV_force_flags(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_force_flags_nolen
+#  define SvPV_force_flags_nolen(sv, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags))
+#endif
+#ifndef SvPV_force_flags_mutable
+#  define SvPV_force_flags_mutable(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
+                  : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_nolen
+#  define SvPV_nolen(sv)                 \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
+#endif
+#ifndef SvPV_nolen_const
+#  define SvPV_nolen_const(sv)           \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_nomg
+#  define SvPV_nomg(sv, lp)              SvPV_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const
+#  define SvPV_nomg_const(sv, lp)        SvPV_flags_const(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const_nolen
+#  define SvPV_nomg_const_nolen(sv)      SvPV_flags_const_nolen(sv, 0)
+#endif
+#ifndef SvPV_renew
+#  define SvPV_renew(sv,n)               STMT_START { SvLEN_set(sv, n); \
+                 SvPV_set((sv), (char *) saferealloc(          \
+                       (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
+               } STMT_END
+#endif
+#ifndef SvMAGIC_set
+#  define SvMAGIC_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5009003)
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*) (0 + SvPVX(sv)))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              (0 + SvPVX(sv))
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*)((sv)->sv_u.svu_pv))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              ((sv)->sv_u.svu_pv)
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                ((sv)->sv_u.svu_rv = (val)); } STMT_END
+#endif
+
+#endif
+#ifndef SvSTASH_set
+#  define SvSTASH_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5004000)
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf)
+#if defined(NEED_vnewSVpvf)
+static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+static
+#else
+extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+#endif
+
+#ifdef vnewSVpvf
+#  undef vnewSVpvf
+#endif
+#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
+#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
+
+#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
+
+SV *
+DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
+{
+  register SV *sv = newSV(0);
+  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+  return sv;
+}
+
+#endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf)
+#  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf)
+#  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg)
+#if defined(NEED_sv_catpvf_mg)
+static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+#endif
+
+#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
+
+#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext)
+#if defined(NEED_sv_catpvf_mg_nocontext)
+static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+#endif
+
+#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+
+#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
+#ifndef sv_catpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
+#  else
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg
+#  endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg)
+#  define sv_vcatpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg)
+#if defined(NEED_sv_setpvf_mg)
+static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+#endif
+
+#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
+
+#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext)
+#if defined(NEED_sv_setpvf_mg_nocontext)
+static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+#endif
+
+#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+
+#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
+#ifndef sv_setpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
+#  else
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg
+#  endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg)
+#  define sv_vsetpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+
+#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
+#ifndef PERL_MAGIC_sv
+#  define PERL_MAGIC_sv                  '\0'
+#endif
+
+#ifndef PERL_MAGIC_overload
+#  define PERL_MAGIC_overload            'A'
+#endif
+
+#ifndef PERL_MAGIC_overload_elem
+#  define PERL_MAGIC_overload_elem       'a'
+#endif
+
+#ifndef PERL_MAGIC_overload_table
+#  define PERL_MAGIC_overload_table      'c'
+#endif
+
+#ifndef PERL_MAGIC_bm
+#  define PERL_MAGIC_bm                  'B'
+#endif
+
+#ifndef PERL_MAGIC_regdata
+#  define PERL_MAGIC_regdata             'D'
+#endif
+
+#ifndef PERL_MAGIC_regdatum
+#  define PERL_MAGIC_regdatum            'd'
+#endif
+
+#ifndef PERL_MAGIC_env
+#  define PERL_MAGIC_env                 'E'
+#endif
+
+#ifndef PERL_MAGIC_envelem
+#  define PERL_MAGIC_envelem             'e'
+#endif
+
+#ifndef PERL_MAGIC_fm
+#  define PERL_MAGIC_fm                  'f'
+#endif
+
+#ifndef PERL_MAGIC_regex_global
+#  define PERL_MAGIC_regex_global        'g'
+#endif
+
+#ifndef PERL_MAGIC_isa
+#  define PERL_MAGIC_isa                 'I'
+#endif
+
+#ifndef PERL_MAGIC_isaelem
+#  define PERL_MAGIC_isaelem             'i'
+#endif
+
+#ifndef PERL_MAGIC_nkeys
+#  define PERL_MAGIC_nkeys               'k'
+#endif
+
+#ifndef PERL_MAGIC_dbfile
+#  define PERL_MAGIC_dbfile              'L'
+#endif
+
+#ifndef PERL_MAGIC_dbline
+#  define PERL_MAGIC_dbline              'l'
+#endif
+
+#ifndef PERL_MAGIC_mutex
+#  define PERL_MAGIC_mutex               'm'
+#endif
+
+#ifndef PERL_MAGIC_shared
+#  define PERL_MAGIC_shared              'N'
+#endif
+
+#ifndef PERL_MAGIC_shared_scalar
+#  define PERL_MAGIC_shared_scalar       'n'
+#endif
+
+#ifndef PERL_MAGIC_collxfrm
+#  define PERL_MAGIC_collxfrm            'o'
+#endif
+
+#ifndef PERL_MAGIC_tied
+#  define PERL_MAGIC_tied                'P'
+#endif
+
+#ifndef PERL_MAGIC_tiedelem
+#  define PERL_MAGIC_tiedelem            'p'
+#endif
+
+#ifndef PERL_MAGIC_tiedscalar
+#  define PERL_MAGIC_tiedscalar          'q'
+#endif
+
+#ifndef PERL_MAGIC_qr
+#  define PERL_MAGIC_qr                  'r'
+#endif
+
+#ifndef PERL_MAGIC_sig
+#  define PERL_MAGIC_sig                 'S'
+#endif
+
+#ifndef PERL_MAGIC_sigelem
+#  define PERL_MAGIC_sigelem             's'
+#endif
+
+#ifndef PERL_MAGIC_taint
+#  define PERL_MAGIC_taint               't'
+#endif
+
+#ifndef PERL_MAGIC_uvar
+#  define PERL_MAGIC_uvar                'U'
+#endif
+
+#ifndef PERL_MAGIC_uvar_elem
+#  define PERL_MAGIC_uvar_elem           'u'
+#endif
+
+#ifndef PERL_MAGIC_vstring
+#  define PERL_MAGIC_vstring             'V'
+#endif
+
+#ifndef PERL_MAGIC_vec
+#  define PERL_MAGIC_vec                 'v'
+#endif
+
+#ifndef PERL_MAGIC_utf8
+#  define PERL_MAGIC_utf8                'w'
+#endif
+
+#ifndef PERL_MAGIC_substr
+#  define PERL_MAGIC_substr              'x'
+#endif
+
+#ifndef PERL_MAGIC_defelem
+#  define PERL_MAGIC_defelem             'y'
+#endif
+
+#ifndef PERL_MAGIC_glob
+#  define PERL_MAGIC_glob                '*'
+#endif
+
+#ifndef PERL_MAGIC_arylen
+#  define PERL_MAGIC_arylen              '#'
+#endif
+
+#ifndef PERL_MAGIC_pos
+#  define PERL_MAGIC_pos                 '.'
+#endif
+
+#ifndef PERL_MAGIC_backref
+#  define PERL_MAGIC_backref             '<'
+#endif
+
+#ifndef PERL_MAGIC_ext
+#  define PERL_MAGIC_ext                 '~'
+#endif
+
+/* That's the best we can do... */
+#ifndef sv_catpvn_nomg
+#  define sv_catpvn_nomg                 sv_catpvn
+#endif
+
+#ifndef sv_catsv_nomg
+#  define sv_catsv_nomg                  sv_catsv
+#endif
+
+#ifndef sv_setsv_nomg
+#  define sv_setsv_nomg                  sv_setsv
+#endif
+
+#ifndef sv_pvn_nomg
+#  define sv_pvn_nomg                    sv_pvn
+#endif
+
+#ifndef SvIV_nomg
+#  define SvIV_nomg                      SvIV
+#endif
+
+#ifndef SvUV_nomg
+#  define SvUV_nomg                      SvUV
+#endif
+
+#ifndef sv_catpv_mg
+#  define sv_catpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catpvn_mg
+#  define sv_catpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catsv_mg
+#  define sv_catsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_catsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setiv_mg
+#  define sv_setiv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setiv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setnv_mg
+#  define sv_setnv_mg(sv, num)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setnv(TeMpSv,num);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpv_mg
+#  define sv_setpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpvn_mg
+#  define sv_setpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setsv_mg
+#  define sv_setsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_setsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setuv_mg
+#  define sv_setuv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setuv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_usepvn_mg
+#  define sv_usepvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_usepvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+#ifndef SvVSTRING_mg
+#  define SvVSTRING_mg(sv)               (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
+#endif
+
+/* Hint: sv_magic_portable
+ * This is a compatibility function that is only available with
+ * Devel::PPPort. It is NOT in the perl core.
+ * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
+ * it is being passed a name pointer with namlen == 0. In that
+ * case, perl 5.8.0 and later store the pointer, not a copy of it.
+ * The compatibility can be provided back to perl 5.004. With
+ * earlier versions, the code will not compile.
+ */
+
+#if (PERL_BCDVERSION < 0x5004000)
+
+  /* code that uses sv_magic_portable will not compile */
+
+#elif (PERL_BCDVERSION < 0x5008000)
+
+#  define sv_magic_portable(sv, obj, how, name, namlen)     \
+   STMT_START {                                             \
+     SV *SvMp_sv = (sv);                                    \
+     char *SvMp_name = (char *) (name);                     \
+     I32 SvMp_namlen = (namlen);                            \
+     if (SvMp_name && SvMp_namlen == 0)                     \
+     {                                                      \
+       MAGIC *mg;                                           \
+       sv_magic(SvMp_sv, obj, how, 0, 0);                   \
+       mg = SvMAGIC(SvMp_sv);                               \
+       mg->mg_len = -42; /* XXX: this is the tricky part */ \
+       mg->mg_ptr = SvMp_name;                              \
+     }                                                      \
+     else                                                   \
+     {                                                      \
+       sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
+     }                                                      \
+   } STMT_END
+
+#else
+
+#  define sv_magic_portable(a, b, c, d, e)  sv_magic(a, b, c, d, e)
+
+#endif
+
+#ifdef USE_ITHREADS
+#ifndef CopFILE
+#  define CopFILE(c)                     ((c)->cop_file)
+#endif
+
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              ((c)->cop_file = savepv(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  ((c)->cop_stashpv)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+                                       || (CopSTASHPV(c) && HvNAME(hv) \
+                                       && strEQ(CopSTASHPV(c), HvNAME(hv)))))
+#endif
+
+#else
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   ((c)->cop_filegv)
+#endif
+
+#ifndef CopFILEGV_set
+#  define CopFILEGV_set(c,gv)            ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              CopFILEGV_set((c), gv_fetchfile(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+#endif
+
+#ifndef CopFILE
+#  define CopFILE(c)                     (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    ((c)->cop_stash)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             ((c)->cop_stash = (hv))
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              (CopSTASH(c) == (hv))
+#endif
+
+#endif /* USE_ITHREADS */
+#ifndef IN_PERL_COMPILETIME
+#  define IN_PERL_COMPILETIME            (PL_curcop == &PL_compiling)
+#endif
+
+#ifndef IN_LOCALE_RUNTIME
+#  define IN_LOCALE_RUNTIME              (PL_curcop->op_private & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE_COMPILETIME
+#  define IN_LOCALE_COMPILETIME          (PL_hints & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE
+#  define IN_LOCALE                      (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+#endif
+#ifndef IS_NUMBER_IN_UV
+#  define IS_NUMBER_IN_UV                0x01
+#endif
+
+#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
+#  define IS_NUMBER_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef IS_NUMBER_NOT_INT
+#  define IS_NUMBER_NOT_INT              0x04
+#endif
+
+#ifndef IS_NUMBER_NEG
+#  define IS_NUMBER_NEG                  0x08
+#endif
+
+#ifndef IS_NUMBER_INFINITY
+#  define IS_NUMBER_INFINITY             0x10
+#endif
+
+#ifndef IS_NUMBER_NAN
+#  define IS_NUMBER_NAN                  0x20
+#endif
+#ifndef GROK_NUMERIC_RADIX
+#  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
+#endif
+#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
+#  define PERL_SCAN_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef PERL_SCAN_SILENT_ILLDIGIT
+#  define PERL_SCAN_SILENT_ILLDIGIT      0x04
+#endif
+
+#ifndef PERL_SCAN_ALLOW_UNDERSCORES
+#  define PERL_SCAN_ALLOW_UNDERSCORES    0x01
+#endif
+
+#ifndef PERL_SCAN_DISALLOW_PREFIX
+#  define PERL_SCAN_DISALLOW_PREFIX      0x02
+#endif
+
+#ifndef grok_numeric_radix
+#if defined(NEED_grok_numeric_radix)
+static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+static
+#else
+extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+#endif
+
+#ifdef grok_numeric_radix
+#  undef grok_numeric_radix
+#endif
+#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
+#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
+
+#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
+bool
+DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
+{
+#ifdef USE_LOCALE_NUMERIC
+#ifdef PL_numeric_radix_sv
+    if (PL_numeric_radix_sv && IN_LOCALE) {
+        STRLEN len;
+        char* radix = SvPV(PL_numeric_radix_sv, len);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#else
+    /* older perls don't have PL_numeric_radix_sv so the radix
+     * must manually be requested from locale.h
+     */
+#include <locale.h>
+    dTHR;  /* needed for older threaded perls */
+    struct lconv *lc = localeconv();
+    char *radix = lc->decimal_point;
+    if (radix && IN_LOCALE) {
+        STRLEN len = strlen(radix);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#endif
+#endif /* USE_LOCALE_NUMERIC */
+    /* always try "." if numeric radix didn't match because
+     * we may have data from different locales mixed */
+    if (*sp < send && **sp == '.') {
+        ++*sp;
+        return TRUE;
+    }
+    return FALSE;
+}
+#endif
+#endif
+
+#ifndef grok_number
+#if defined(NEED_grok_number)
+static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+static
+#else
+extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+#endif
+
+#ifdef grok_number
+#  undef grok_number
+#endif
+#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
+#define Perl_grok_number DPPP_(my_grok_number)
+
+#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
+int
+DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
+{
+  const char *s = pv;
+  const char *send = pv + len;
+  const UV max_div_10 = UV_MAX / 10;
+  const char max_mod_10 = UV_MAX % 10;
+  int numtype = 0;
+  int sawinf = 0;
+  int sawnan = 0;
+
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s == send) {
+    return 0;
+  } else if (*s == '-') {
+    s++;
+    numtype = IS_NUMBER_NEG;
+  }
+  else if (*s == '+')
+  s++;
+
+  if (s == send)
+    return 0;
+
+  /* next must be digit or the radix separator or beginning of infinity */
+  if (isDIGIT(*s)) {
+    /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+       overflow.  */
+    UV value = *s - '0';
+    /* This construction seems to be more optimiser friendly.
+       (without it gcc does the isDIGIT test and the *s - '0' separately)
+       With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+       In theory the optimiser could deduce how far to unroll the loop
+       before checking for overflow.  */
+    if (++s < send) {
+      int digit = *s - '0';
+      if (digit >= 0 && digit <= 9) {
+        value = value * 10 + digit;
+        if (++s < send) {
+          digit = *s - '0';
+          if (digit >= 0 && digit <= 9) {
+            value = value * 10 + digit;
+            if (++s < send) {
+              digit = *s - '0';
+              if (digit >= 0 && digit <= 9) {
+                value = value * 10 + digit;
+               if (++s < send) {
+                  digit = *s - '0';
+                  if (digit >= 0 && digit <= 9) {
+                    value = value * 10 + digit;
+                    if (++s < send) {
+                      digit = *s - '0';
+                      if (digit >= 0 && digit <= 9) {
+                        value = value * 10 + digit;
+                        if (++s < send) {
+                          digit = *s - '0';
+                          if (digit >= 0 && digit <= 9) {
+                            value = value * 10 + digit;
+                            if (++s < send) {
+                              digit = *s - '0';
+                              if (digit >= 0 && digit <= 9) {
+                                value = value * 10 + digit;
+                                if (++s < send) {
+                                  digit = *s - '0';
+                                  if (digit >= 0 && digit <= 9) {
+                                    value = value * 10 + digit;
+                                    if (++s < send) {
+                                      /* Now got 9 digits, so need to check
+                                         each time for overflow.  */
+                                      digit = *s - '0';
+                                      while (digit >= 0 && digit <= 9
+                                             && (value < max_div_10
+                                                 || (value == max_div_10
+                                                     && digit <= max_mod_10))) {
+                                        value = value * 10 + digit;
+                                        if (++s < send)
+                                          digit = *s - '0';
+                                        else
+                                          break;
+                                      }
+                                      if (digit >= 0 && digit <= 9
+                                          && (s < send)) {
+                                        /* value overflowed.
+                                           skip the remaining digits, don't
+                                           worry about setting *valuep.  */
+                                        do {
+                                          s++;
+                                        } while (s < send && isDIGIT(*s));
+                                        numtype |=
+                                          IS_NUMBER_GREATER_THAN_UV_MAX;
+                                        goto skip_value;
+                                      }
+                                    }
+                                  }
+                               }
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+       }
+      }
+    }
+    numtype |= IS_NUMBER_IN_UV;
+    if (valuep)
+      *valuep = value;
+
+  skip_value:
+    if (GROK_NUMERIC_RADIX(&s, send)) {
+      numtype |= IS_NUMBER_NOT_INT;
+      while (s < send && isDIGIT(*s))  /* optional digits after the radix */
+        s++;
+    }
+  }
+  else if (GROK_NUMERIC_RADIX(&s, send)) {
+    numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+    /* no digits before the radix means we need digits after it */
+    if (s < send && isDIGIT(*s)) {
+      do {
+        s++;
+      } while (s < send && isDIGIT(*s));
+      if (valuep) {
+        /* integer approximation is valid - it's 0.  */
+        *valuep = 0;
+      }
+    }
+    else
+      return 0;
+  } else if (*s == 'I' || *s == 'i') {
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+    s++; if (s < send && (*s == 'I' || *s == 'i')) {
+      s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+      s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+      s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+      s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+      s++;
+    }
+    sawinf = 1;
+  } else if (*s == 'N' || *s == 'n') {
+    /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+    s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++;
+    sawnan = 1;
+  } else
+    return 0;
+
+  if (sawinf) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+  } else if (sawnan) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+  } else if (s < send) {
+    /* we can have an optional exponent part */
+    if (*s == 'e' || *s == 'E') {
+      /* The only flag we keep is sign.  Blow away any "it's UV"  */
+      numtype &= IS_NUMBER_NEG;
+      numtype |= IS_NUMBER_NOT_INT;
+      s++;
+      if (s < send && (*s == '-' || *s == '+'))
+        s++;
+      if (s < send && isDIGIT(*s)) {
+        do {
+          s++;
+        } while (s < send && isDIGIT(*s));
+      }
+      else
+      return 0;
+    }
+  }
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s >= send)
+    return numtype;
+  if (len == 10 && memEQ(pv, "0 but true", 10)) {
+    if (valuep)
+      *valuep = 0;
+    return IS_NUMBER_IN_UV;
+  }
+  return 0;
+}
+#endif
+#endif
+
+/*
+ * The grok_* routines have been modified to use warn() instead of
+ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+ * which is why the stack variable has been renamed to 'xdigit'.
+ */
+
+#ifndef grok_bin
+#if defined(NEED_grok_bin)
+static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_bin
+#  undef grok_bin
+#endif
+#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
+#define Perl_grok_bin DPPP_(my_grok_bin)
+
+#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
+UV
+DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_2 = UV_MAX / 2;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading b or 0b.
+           for compatibility silently suffer "b" and "0b" as valid binary
+           numbers. */
+        if (len >= 1) {
+            if (s[0] == 'b') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+        char bit = *s;
+        if (bit == '0' || bit == '1') {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_bin.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_2) {
+                    value = (value << 1) | (bit - '0');
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in binary number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 2.0;
+           /* If an NV has not enough bits in its mantissa to
+            * represent a UV this summing of small low-order numbers
+            * is a waste of time (because the NV cannot preserve
+            * the low-order bits anyway): we could just remember when
+            * did we overflow and in the end just multiply value_nv by the
+            * right amount. */
+            value_nv += (NV)(bit - '0');
+            continue;
+        }
+        if (bit == '_' && len && allow_underscores && (bit = s[1])
+            && (bit == '0' || bit == '1'))
+           {
+               --len;
+               ++s;
+                goto redo;
+           }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal binary digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+       || (!overflowed && value > 0xffffffff  )
+#endif
+       ) {
+       warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_hex
+#if defined(NEED_grok_hex)
+static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_hex
+#  undef grok_hex
+#endif
+#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
+#define Perl_grok_hex DPPP_(my_grok_hex)
+
+#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
+UV
+DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_16 = UV_MAX / 16;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+    const char *xdigit;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading x or 0x.
+           for compatibility silently suffer "x" and "0x" as valid hex numbers.
+        */
+        if (len >= 1) {
+            if (s[0] == 'x') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+       xdigit = strchr((char *) PL_hexdigit, *s);
+        if (xdigit) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_hex.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_16) {
+                    value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+                    continue;
+                }
+                warn("Integer overflow in hexadecimal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 16.0;
+           /* If an NV has not enough bits in its mantissa to
+            * represent a UV this summing of small low-order numbers
+            * is a waste of time (because the NV cannot preserve
+            * the low-order bits anyway): we could just remember when
+            * did we overflow and in the end just multiply value_nv by the
+            * right amount of 16-tuples. */
+            value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+            continue;
+        }
+        if (*s == '_' && len && allow_underscores && s[1]
+               && (xdigit = strchr((char *) PL_hexdigit, s[1])))
+           {
+               --len;
+               ++s;
+                goto redo;
+           }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal hexadecimal digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+       || (!overflowed && value > 0xffffffff  )
+#endif
+       ) {
+       warn("Hexadecimal number > 0xffffffff non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_oct
+#if defined(NEED_grok_oct)
+static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_oct
+#  undef grok_oct
+#endif
+#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
+#define Perl_grok_oct DPPP_(my_grok_oct)
+
+#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
+UV
+DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_8 = UV_MAX / 8;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    for (; len-- && *s; s++) {
+         /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+            out front allows slicker code.  */
+        int digit = *s - '0';
+        if (digit >= 0 && digit <= 7) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+            */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_8) {
+                    value = (value << 3) | digit;
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in octal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 8.0;
+           /* If an NV has not enough bits in its mantissa to
+            * represent a UV this summing of small low-order numbers
+            * is a waste of time (because the NV cannot preserve
+            * the low-order bits anyway): we could just remember when
+            * did we overflow and in the end just multiply value_nv by the
+            * right amount of 8-tuples. */
+            value_nv += (NV)digit;
+            continue;
+        }
+        if (digit == ('_' - '0') && len && allow_underscores
+            && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+           {
+               --len;
+               ++s;
+                goto redo;
+           }
+        /* Allow \octal to work the DWIM way (that is, stop scanning
+         * as soon as non-octal characters are seen, complain only iff
+         * someone seems to want to use the digits eight and nine). */
+        if (digit == 8 || digit == 9) {
+            if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+                warn("Illegal octal digit '%c' ignored", *s);
+        }
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+       || (!overflowed && value > 0xffffffff  )
+#endif
+       ) {
+       warn("Octal number > 037777777777 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#if !defined(my_snprintf)
+#if defined(NEED_my_snprintf)
+static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+static
+#else
+extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+#endif
+
+#define my_snprintf DPPP_(my_my_snprintf)
+#define Perl_my_snprintf DPPP_(my_my_snprintf)
+
+#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
+
+int
+DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
+{
+    dTHX;
+    int retval;
+    va_list ap;
+    va_start(ap, format);
+#ifdef HAS_VSNPRINTF
+    retval = vsnprintf(buffer, len, format, ap);
+#else
+    retval = vsprintf(buffer, format, ap);
+#endif
+    va_end(ap);
+    if (retval < 0 || (len > 0 && (Size_t)retval >= len))
+       Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
+    return retval;
+}
+
+#endif
+#endif
+
+#if !defined(my_sprintf)
+#if defined(NEED_my_sprintf)
+static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+static
+#else
+extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+#endif
+
+#define my_sprintf DPPP_(my_my_sprintf)
+#define Perl_my_sprintf DPPP_(my_my_sprintf)
+
+#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL)
+
+int
+DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...)
+{
+    va_list args;
+    va_start(args, pat);
+    vsprintf(buffer, pat, args);
+    va_end(args);
+    return strlen(buffer);
+}
+
+#endif
+#endif
+
+#ifdef NO_XSLOCKS
+#  ifdef dJMPENV
+#    define dXCPT             dJMPENV; int rEtV = 0
+#    define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
+#    define XCPT_TRY_END      JMPENV_POP;
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      JMPENV_JUMP(rEtV)
+#  else
+#    define dXCPT             Sigjmp_buf oldTOP; int rEtV = 0
+#    define XCPT_TRY_START    Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+#    define XCPT_TRY_END      Copy(oldTOP, top_env, 1, Sigjmp_buf);
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      Siglongjmp(top_env, rEtV)
+#  endif
+#endif
+
+#if !defined(my_strlcat)
+#if defined(NEED_my_strlcat)
+static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcat DPPP_(my_my_strlcat)
+#define Perl_my_strlcat DPPP_(my_my_strlcat)
+
+#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
+{
+    Size_t used, length, copy;
+
+    used = strlen(dst);
+    length = strlen(src);
+    if (size > 0 && used < size - 1) {
+        copy = (length >= size - used) ? size - used - 1 : length;
+        memcpy(dst + used, src, copy);
+        dst[used + copy] = '\0';
+    }
+    return used + length;
+}
+#endif
+#endif
+
+#if !defined(my_strlcpy)
+#if defined(NEED_my_strlcpy)
+static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcpy DPPP_(my_my_strlcpy)
+#define Perl_my_strlcpy DPPP_(my_my_strlcpy)
+
+#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
+{
+    Size_t length, copy;
+
+    length = strlen(src);
+    if (size > 0) {
+        copy = (length >= size) ? size - 1 : length;
+        memcpy(dst, src, copy);
+        dst[copy] = '\0';
+    }
+    return length;
+}
+
+#endif
+#endif
+#ifndef PERL_PV_ESCAPE_QUOTE
+#  define PERL_PV_ESCAPE_QUOTE           0x0001
+#endif
+
+#ifndef PERL_PV_PRETTY_QUOTE
+#  define PERL_PV_PRETTY_QUOTE           PERL_PV_ESCAPE_QUOTE
+#endif
+
+#ifndef PERL_PV_PRETTY_ELLIPSES
+#  define PERL_PV_PRETTY_ELLIPSES        0x0002
+#endif
+
+#ifndef PERL_PV_PRETTY_LTGT
+#  define PERL_PV_PRETTY_LTGT            0x0004
+#endif
+
+#ifndef PERL_PV_ESCAPE_FIRSTCHAR
+#  define PERL_PV_ESCAPE_FIRSTCHAR       0x0008
+#endif
+
+#ifndef PERL_PV_ESCAPE_UNI
+#  define PERL_PV_ESCAPE_UNI             0x0100
+#endif
+
+#ifndef PERL_PV_ESCAPE_UNI_DETECT
+#  define PERL_PV_ESCAPE_UNI_DETECT      0x0200
+#endif
+
+#ifndef PERL_PV_ESCAPE_ALL
+#  define PERL_PV_ESCAPE_ALL             0x1000
+#endif
+
+#ifndef PERL_PV_ESCAPE_NOBACKSLASH
+#  define PERL_PV_ESCAPE_NOBACKSLASH     0x2000
+#endif
+
+#ifndef PERL_PV_ESCAPE_NOCLEAR
+#  define PERL_PV_ESCAPE_NOCLEAR         0x4000
+#endif
+
+#ifndef PERL_PV_ESCAPE_RE
+#  define PERL_PV_ESCAPE_RE              0x8000
+#endif
+
+#ifndef PERL_PV_PRETTY_NOCLEAR
+#  define PERL_PV_PRETTY_NOCLEAR         PERL_PV_ESCAPE_NOCLEAR
+#endif
+#ifndef PERL_PV_PRETTY_DUMP
+#  define PERL_PV_PRETTY_DUMP            PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
+#endif
+
+#ifndef PERL_PV_PRETTY_REGPROP
+#  define PERL_PV_PRETTY_REGPROP         PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
+#endif
+
+/* Hint: pv_escape
+ * Note that unicode functionality is only backported to
+ * those perl versions that support it. For older perl
+ * versions, the implementation will fall back to bytes.
+ */
+
+#ifndef pv_escape
+#if defined(NEED_pv_escape)
+static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+static
+#else
+extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+#endif
+
+#ifdef pv_escape
+#  undef pv_escape
+#endif
+#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f)
+#define Perl_pv_escape DPPP_(my_pv_escape)
+
+#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL)
+
+char *
+DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str,
+  const STRLEN count, const STRLEN max,
+  STRLEN * const escaped, const U32 flags)
+{
+    const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\';
+    const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc;
+    char octbuf[32] = "%123456789ABCDF";
+    STRLEN wrote = 0;
+    STRLEN chsize = 0;
+    STRLEN readsize = 1;
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+    bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0;
+#endif
+    const char *pv  = str;
+    const char * const end = pv + count;
+    octbuf[0] = esc;
+
+    if (!(flags & PERL_PV_ESCAPE_NOCLEAR))
+       sv_setpvs(dsv, "");
+
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+    if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
+        isuni = 1;
+#endif
+
+    for (; pv < end && (!max || wrote < max) ; pv += readsize) {
+        const UV u =
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+                    isuni ? utf8_to_uvchr((U8*)pv, &readsize) :
+#endif
+                            (U8)*pv;
+        const U8 c = (U8)u & 0xFF;
+
+        if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) {
+            if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+                chsize = my_snprintf(octbuf, sizeof octbuf,
+                                      "%"UVxf, u);
+            else
+                chsize = my_snprintf(octbuf, sizeof octbuf,
+                                      "%cx{%"UVxf"}", esc, u);
+        } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
+            chsize = 1;
+        } else {
+            if (c == dq || c == esc || !isPRINT(c)) {
+               chsize = 2;
+                switch (c) {
+               case '\\' : /* fallthrough */
+               case '%'  : if (c == esc)
+                               octbuf[1] = esc;
+                           else
+                               chsize = 1;
+                           break;
+               case '\v' : octbuf[1] = 'v'; break;
+               case '\t' : octbuf[1] = 't'; break;
+               case '\r' : octbuf[1] = 'r'; break;
+               case '\n' : octbuf[1] = 'n'; break;
+               case '\f' : octbuf[1] = 'f'; break;
+                case '"'  : if (dq == '"')
+                               octbuf[1] = '"';
+                           else
+                               chsize = 1;
+                           break;
+               default:    chsize = my_snprintf(octbuf, sizeof octbuf,
+                               pv < end && isDIGIT((U8)*(pv+readsize))
+                               ? "%c%03o" : "%c%o", esc, c);
+                }
+            } else {
+                chsize = 1;
+            }
+       }
+       if (max && wrote + chsize > max) {
+           break;
+        } else if (chsize > 1) {
+            sv_catpvn(dsv, octbuf, chsize);
+            wrote += chsize;
+       } else {
+           char tmp[2];
+           my_snprintf(tmp, sizeof tmp, "%c", c);
+            sv_catpvn(dsv, tmp, 1);
+           wrote++;
+       }
+        if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+            break;
+    }
+    if (escaped != NULL)
+        *escaped= pv - str;
+    return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_pretty
+#if defined(NEED_pv_pretty)
+static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+static
+#else
+extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+#endif
+
+#ifdef pv_pretty
+#  undef pv_pretty
+#endif
+#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g)
+#define Perl_pv_pretty DPPP_(my_pv_pretty)
+
+#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL)
+
+char *
+DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count,
+  const STRLEN max, char const * const start_color, char const * const end_color,
+  const U32 flags)
+{
+    const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
+    STRLEN escaped;
+
+    if (!(flags & PERL_PV_PRETTY_NOCLEAR))
+       sv_setpvs(dsv, "");
+
+    if (dq == '"')
+        sv_catpvs(dsv, "\"");
+    else if (flags & PERL_PV_PRETTY_LTGT)
+        sv_catpvs(dsv, "<");
+
+    if (start_color != NULL)
+        sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color));
+
+    pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR);
+
+    if (end_color != NULL)
+        sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color));
+
+    if (dq == '"')
+       sv_catpvs(dsv, "\"");
+    else if (flags & PERL_PV_PRETTY_LTGT)
+        sv_catpvs(dsv, ">");
+
+    if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count)
+       sv_catpvs(dsv, "...");
+
+    return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_display
+#if defined(NEED_pv_display)
+static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+static
+#else
+extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+#endif
+
+#ifdef pv_display
+#  undef pv_display
+#endif
+#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e)
+#define Perl_pv_display DPPP_(my_pv_display)
+
+#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL)
+
+char *
+DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+{
+    pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
+    if (len > cur && pv[cur] == '\0')
+       sv_catpvs(dsv, "\\0");
+    return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#endif /* _P_P_PORTABILITY_H_ */
+
+/* End of File ppport.h */
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/t/01load.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/t/01load.t
new file mode 100644 (file)
index 0000000..efa38e6
--- /dev/null
@@ -0,0 +1,3 @@
+use Test::More tests => 1;
+BEGIN { use_ok('Object::WithIntAndString') };
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/t/02test.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/t/02test.t
new file mode 100644 (file)
index 0000000..2c96c49
--- /dev/null
@@ -0,0 +1,39 @@
+use strict;
+use warnings;
+
+use Test::More tests => 25;
+BEGIN { use_ok('Object::WithIntAndString') };
+
+SCOPE: {
+  my $o = Object::WithIntAndString->newIntAndString("Hello", 54);
+  check_obj($o);
+
+  is($o->GetInt(), 54);
+  is($o->GetString(), "Hello");
+
+  $o->SetInt(2);
+  is($o->GetInt(), 2);
+  $o->SetString("foo");
+  is($o->GetString(), "foo");
+}
+
+SCOPE: {
+  my $o = Object::WithIntAndString->new;
+  check_obj($o);
+
+  is($o->GetInt(), 0);
+  is($o->GetString(), "");
+
+  $o->SetInt(3);
+  is($o->GetInt(), 3);
+  $o->SetString("fOo");
+  is($o->GetString(), "fOo");
+}
+
+
+sub check_obj {
+  my $o = shift;
+  isa_ok($o, 'Object::WithIntAndString');
+  can_ok($o, $_) foreach qw(new SetString SetInt GetInt GetString Sum);
+  ok(!$o->can($_)) foreach qw(SetValue);
+}
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/typemap b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/typemap
new file mode 100644 (file)
index 0000000..37d45ff
--- /dev/null
@@ -0,0 +1,3 @@
+TYPEMAP
+IntAndString*         O_OBJECT
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/typemap.xsp b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/examples/Object-WithIntAndString/typemap.xsp
new file mode 100644 (file)
index 0000000..a5715ed
--- /dev/null
@@ -0,0 +1,3 @@
+
+// Map the type of our custom class
+%typemap{IntAndString*}{simple};
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/inc/My/Build.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/inc/My/Build.pm
new file mode 100644 (file)
index 0000000..cc50aee
--- /dev/null
@@ -0,0 +1,36 @@
+package My::Build;
+
+use strict;
+use warnings;
+use base qw(Module::Build);
+use File::Spec ();
+
+sub ACTION_code {
+    my( $self ) = @_;
+
+    # Generate the parser using yapp
+    my $grammar_module = File::Spec->catfile(qw(lib ExtUtils XSpp Grammar.pm));
+    if( !$self->up_to_date( [ 'XSP.yp' ],
+                            [ $grammar_module ] ) ) {
+        $self->do_system( 'yapp', '-v', '-m', 'ExtUtils::XSpp::Grammar', '-s',
+                          '-o', $grammar_module, 'XSP.yp' );
+
+        # Replace the copy Parse::Yapp::Driver with a package in
+        # our own namespace hierarchy
+        open my $fh, '+<', $grammar_module
+          or die "Could not open file '$grammar_module' for rw: $!";
+        my @code = map {
+          s{(?<!Module )Parse::Yapp::Driver}
+           {ExtUtils::XSpp::Grammar::YappDriver}gx;
+          $_
+        } <$fh>;
+        seek $fh, 0, 0;
+        truncate $fh, 0;
+        print $fh @code;
+        close $fh or die "Updating grammar module failed: $!";
+    }
+
+    $self->SUPER::ACTION_code;
+}
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp.pm
new file mode 100644 (file)
index 0000000..92b5560
--- /dev/null
@@ -0,0 +1,10 @@
+package ExtUtils::XSpp;
+
+use strict;
+use warnings;
+
+use ExtUtils::XSpp::Driver;
+
+our $VERSION = '0.07';
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp.pod b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp.pod
new file mode 100644 (file)
index 0000000..ee1d7db
--- /dev/null
@@ -0,0 +1,173 @@
+=head1 NAME
+
+ExtUtils::XSpp - XS for C++
+
+=head1 SYNOPSIS
+
+  xspp [--typemap=typemap.xsp [--typemap=typemap2.xsp]]
+       [--xsubpp[=/path/to/xsubpp] [--xsubpp-args="xsubpp args"]
+       Foo.xsp
+
+or
+
+  perl -MExtUtils::XSpp::Cmd -e xspp -- <xspp options and arguments>
+
+In Foo.xs
+
+  INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- <xspp options/arguments>
+
+Using C<ExtUtils::XSpp::Cmd> is equivalent to using the C<xspp>
+command line script, except that there is no guarantee for C<xspp> to
+be installed in the system PATH.
+
+=head1 OVERVIEW
+
+XS++ is just a thin layer over plain XS, hence to use it you
+are supposed to know, at the very least, C++ and XS.
+
+This means that you will need typemaps for B<both> the normal XS
+pre-processor I<xsubpp> and the XS++ pre-processor I<xspp>.
+
+=head1 COMMAND LINE
+
+=head2 C<--typemap=/path/to/typemap.xsp>
+
+Can be specified multiple times to process additional typemap files
+before the main XS++ input files.  Typemap files are processed the
+same way as regular XS++ files, except that output code is discarded.
+
+=head2 C<--xsubpp[=/path/to/xsubpp]>
+
+If specified, XS++ will run F<xsubpp> after processing the XS++ input
+file.  If the path to F<xsubpp> is not specified, F<xspp> expects to
+find it in the system PATH.
+
+=head2 C<--xsubpp-args="extra xsubpp args">
+
+Can be used to pass additional command line arguments to F<xsubpp>.
+
+=head1 TYPEMAPS
+
+There is nothing special about typemap files (i.e. you can put typemaps
+directly in your .xsp file), but it is handy to have common typemaps in a
+separate file, to avoid duplication.
+
+  %typemap{<C++ type>}{simple};
+
+Just let XS++ that this is a valid type, the type will be passed
+unchanged to XS code B<except> that any C<const> qualifiers will be
+stripped.
+
+  %typemap{<C++ type 1>}{parsed}{%<C++ type 2>%};
+
+When C<C++ type 1> is used, replace it with C<C++ type 2> in the
+generated XS code.
+
+  %typemap{<C++ reference type>}{reference};
+
+Handle C++ references: the XS variable will be declared as a pointer,
+and it will be explicitly dereferenced in the function call. If it is
+used in the return value, the function will create B<copy> of the
+returned value using a copy constructor.
+
+=head1 DESCRIPTION
+
+Anything that does not look like a XS++ directive or a class
+declaration is passed verbatim to XS. If you want XS++ to ignore code
+that looks like a XS++ directive or class declaration, simply surround it with
+a raw block delimiter like this:
+
+  %{
+  XS++ won't interpret this
+  %}
+
+=head2 %code
+
+See under B<Classes>.
+
+=head2 %file
+
+  %file{file/path.h};
+  ...
+  %file{file/path2};
+  ...
+  %file{-}
+
+By default XS++ output goes to standard output; to change this, use the
+C<%file> directive; use C<-> for standard output.
+
+=head2 %module
+
+  %module{Module__Name};
+
+Will be used to generate the C<MODULE=Module__Name> XS directives.
+
+=head2 %name
+
+  %name{Perl::Class} class MyClass { ... };
+  %name{Perl::Func} int foo();
+
+Specifies the perl name under which the C++ class/function will be
+accessible.
+
+=head2 %typemap
+
+See B<TYPEMAPS> above.
+
+=head2 %length
+
+When you need to pass a string from Perl to an XSUB that
+takes the C string and its length as arguments,
+you may have XS++ pass the length of the string automatically.
+For example, if you declare a method as follows,
+
+  void PrintLine( char* line, unsigned int %length{line} );
+
+you can call the method from Perl like this:
+
+  $object->PrintLine( $string );
+
+This feature is also present in plain XS. See also: L<perlxs>
+
+=head2 Classes
+
+  %name{My::Class} class MyClass : public %name{My::Base} MyBase
+  {
+      // can be called in Perl as My::Class->new( ... );
+      MyClass( int arg );
+      // My::Class->newMyClass( ... );
+      %name{newMyClass} MyClass( const char* str, int arg );
+
+      // standard DESTROY method
+      ~MyClass();
+
+      int GetInt();
+      void SetValue( int arg = -1 );
+
+      %name{SetString} void SetValue( const char* string = NULL );
+
+      // Supply a C<CODE:> or C<CLEANUP:> block for the XS
+      int MyMethod( int a, int b )
+          %code{% RETVAL = a + b; %}
+          %cleanup{% /* do something */ %};
+  };
+
+=head2 Comments
+
+XS++ recognizes both C-style comments C</* ... */> and C++-style
+comments C<// ...>.  Comments are removed from the XS output.
+
+=head1 AUTHOR
+
+Mattia Barbon <mbarbon@cpan.org>
+
+=head1 LICENSE
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+# local variables:
+# mode: cperl
+# end:
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Cmd.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Cmd.pm
new file mode 100644 (file)
index 0000000..b010547
--- /dev/null
@@ -0,0 +1,54 @@
+package ExtUtils::XSpp::Cmd;
+
+use strict;
+
+=head1 NAME
+
+ExtUtils::XSpp::Cmd - implementation of xspp
+
+=head1 SYNOPSIS
+
+  perl -MExtUtils::XSpp::Cmd -e xspp -- <xspp options/arguments>
+
+In Foo.xs
+
+  INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- <xspp options/arguments>
+
+Using C<ExtUtils::XSpp::Cmd> is equivalent to using the C<xspp>
+command line script, except that there is no guarantee for C<xspp> to
+be installed in the system PATH.
+
+=head1 DOCUMENTATION
+
+See L<ExtUtils::XSpp>, L<xspp>.
+
+=cut
+
+use Exporter 'import';
+use Getopt::Long;
+
+use ExtUtils::XSpp::Driver;
+
+our @EXPORT = qw(xspp);
+
+sub xspp {
+    my( @typemap_files, $xsubpp, $xsubpp_args );
+    GetOptions( 'typemap=s'       => \@typemap_files,
+                'xsubpp:s'        => \$xsubpp,
+                'xsubpp-args=s'   => \$xsubpp_args,
+                );
+    $xsubpp = 'xsubpp' if defined $xsubpp && !length $xsubpp;
+
+    my $driver = ExtUtils::XSpp::Driver->new
+      ( typemaps    => \@typemap_files,
+        file        => shift @ARGV,
+        xsubpp      => $xsubpp,
+        xsubpp_args => $xsubpp_args,
+        );
+    my $success = $driver->process ? 0 : 1;
+
+    exit $success unless defined wantarray;
+    return $success;
+}
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Driver.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Driver.pm
new file mode 100644 (file)
index 0000000..3769e45
--- /dev/null
@@ -0,0 +1,107 @@
+package ExtUtils::XSpp::Driver;
+
+use strict;
+use warnings;
+
+use File::Basename ();
+use File::Path ();
+
+use ExtUtils::XSpp::Parser;
+
+sub new {
+    my( $class, %args ) = @_;
+    my $self = bless \%args, $class;
+
+    return $self;
+}
+
+sub generate {
+    my( $self ) = @_;
+
+    foreach my $typemap ( $self->typemaps ) {
+        ExtUtils::XSpp::Parser->new( file => $typemap )->parse;
+    }
+
+    my $parser = ExtUtils::XSpp::Parser->new( file   => $self->file,
+                                              string => $self->string,
+                                              );
+    my $success = $parser->parse;
+    return() if not $success;
+
+    return $self->_emit( $parser );
+}
+
+sub process {
+    my( $self ) = @_;
+
+    my $generated = $self->generate;
+    return () if not $generated;
+    return $self->_write( $generated );
+}
+
+sub _write {
+    my( $self, $out ) = @_;
+
+    foreach my $f ( keys %$out ) {
+        if( $f eq '-' ) {
+            if( $self->xsubpp ) {
+                require IPC::Open2;
+
+                my $cmd = $self->xsubpp . ' ' . ( $self->xsubpp_args || '' )
+                          . ' -';
+                my $pid = IPC::Open2::open2( '>&STDOUT', my $fh, $cmd );
+
+                print $fh $$out{$f} or die "Error writing to xsubpp: $!";
+                close $fh or die "Error writing to xsubpp: $!";
+                waitpid( $pid, 0 );
+                my $exit_code = $? >> 8;
+
+                return 0 if $exit_code;
+            } else {
+                print $$out{$f} or die "Error writing output";
+            }
+        } else {
+            File::Path::mkpath( File::Basename::dirname( $f ) );
+
+            open my $fh, '>', $f or die "open '$f': $!";
+            binmode $fh;
+            print $fh $$out{$f} or die "Error writing to '$f': $!";
+            close $fh or die "close '$f': $!";
+        }
+    }
+
+    return 1;
+}
+
+sub _emit {
+    my( $self, $parser ) = @_;
+    my $data = $parser->get_data;
+    my %out;
+    my $out_file = '-';
+    my %state = ( current_module => undef );
+
+    foreach my $plugin ( @{$parser->post_process_plugins} ) {
+        $plugin->post_process( $data );
+    }
+
+    foreach my $e ( @$data ) {
+        if( $e->isa( 'ExtUtils::XSpp::Node::Module' ) ) {
+            $state{current_module} = $e;
+        }
+        if( $e->isa( 'ExtUtils::XSpp::Node::File' ) ) {
+            $out_file = $e->file;
+        }
+        $out{$out_file} .= $e->print( \%state );
+    }
+
+    return \%out;
+}
+
+sub typemaps { @{$_[0]->{typemaps} || []} }
+sub file     { $_[0]->{file} }
+sub string   { $_[0]->{string} }
+sub output   { $_[0]->{output} }
+sub xsubpp   { $_[0]->{xsubpp} }
+sub xsubpp_args { $_[0]->{xsubpp_args} }
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Grammar.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Grammar.pm
new file mode 100644 (file)
index 0000000..8c7b40c
--- /dev/null
@@ -0,0 +1,2552 @@
+####################################################################
+#
+#    This file was generated using Parse::Yapp version 1.05.
+#
+#        Don't edit this file, use source file instead.
+#
+#             ANY CHANGE MADE HERE WILL BE LOST !
+#
+####################################################################
+package ExtUtils::XSpp::Grammar;
+use vars qw ( @ISA );
+use strict;
+
+@ISA= qw ( ExtUtils::XSpp::Grammar::YappDriver );
+#Included Parse/Yapp/Driver.pm file----------------------------------------
+{
+#
+# Module ExtUtils::XSpp::Grammar::YappDriver
+#
+# This module is part of the Parse::Yapp package available on your
+# nearest CPAN
+#
+# Any use of this module in a standalone parser make the included
+# text under the same copyright as the Parse::Yapp module itself.
+#
+# This notice should remain unchanged.
+#
+# (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
+# (see the pod text in Parse::Yapp module for use and distribution rights)
+#
+
+package ExtUtils::XSpp::Grammar::YappDriver;
+
+require 5.004;
+
+use strict;
+
+use vars qw ( $VERSION $COMPATIBLE $FILENAME );
+
+$VERSION = '1.05';
+$COMPATIBLE = '0.07';
+$FILENAME=__FILE__;
+
+use Carp;
+
+#Known parameters, all starting with YY (leading YY will be discarded)
+my(%params)=(YYLEX => 'CODE', 'YYERROR' => 'CODE', YYVERSION => '',
+                        YYRULES => 'ARRAY', YYSTATES => 'ARRAY', YYDEBUG => '');
+#Mandatory parameters
+my(@params)=('LEX','RULES','STATES');
+
+sub new {
+    my($class)=shift;
+       my($errst,$nberr,$token,$value,$check,$dotpos);
+    my($self)={ ERROR => \&_Error,
+                               ERRST => \$errst,
+                NBERR => \$nberr,
+                               TOKEN => \$token,
+                               VALUE => \$value,
+                               DOTPOS => \$dotpos,
+                               STACK => [],
+                               DEBUG => 0,
+                               CHECK => \$check };
+
+       _CheckParams( [], \%params, \@_, $self );
+
+               exists($$self{VERSION})
+       and     $$self{VERSION} < $COMPATIBLE
+       and     croak "Yapp driver version $VERSION ".
+                         "incompatible with version $$self{VERSION}:\n".
+                         "Please recompile parser module.";
+
+        ref($class)
+    and $class=ref($class);
+
+    bless($self,$class);
+}
+
+sub YYParse {
+    my($self)=shift;
+    my($retval);
+
+       _CheckParams( \@params, \%params, \@_, $self );
+
+       if($$self{DEBUG}) {
+               _DBLoad();
+               $retval = eval '$self->_DBParse()';#Do not create stab entry on compile
+        $@ and die $@;
+       }
+       else {
+               $retval = $self->_Parse();
+       }
+    $retval
+}
+
+sub YYData {
+       my($self)=shift;
+
+               exists($$self{USER})
+       or      $$self{USER}={};
+
+       $$self{USER};
+       
+}
+
+sub YYErrok {
+       my($self)=shift;
+
+       ${$$self{ERRST}}=0;
+    undef;
+}
+
+sub YYNberr {
+       my($self)=shift;
+
+       ${$$self{NBERR}};
+}
+
+sub YYRecovering {
+       my($self)=shift;
+
+       ${$$self{ERRST}} != 0;
+}
+
+sub YYAbort {
+       my($self)=shift;
+
+       ${$$self{CHECK}}='ABORT';
+    undef;
+}
+
+sub YYAccept {
+       my($self)=shift;
+
+       ${$$self{CHECK}}='ACCEPT';
+    undef;
+}
+
+sub YYError {
+       my($self)=shift;
+
+       ${$$self{CHECK}}='ERROR';
+    undef;
+}
+
+sub YYSemval {
+       my($self)=shift;
+       my($index)= $_[0] - ${$$self{DOTPOS}} - 1;
+
+               $index < 0
+       and     -$index <= @{$$self{STACK}}
+       and     return $$self{STACK}[$index][1];
+
+       undef;  #Invalid index
+}
+
+sub YYCurtok {
+       my($self)=shift;
+
+        @_
+    and ${$$self{TOKEN}}=$_[0];
+    ${$$self{TOKEN}};
+}
+
+sub YYCurval {
+       my($self)=shift;
+
+        @_
+    and ${$$self{VALUE}}=$_[0];
+    ${$$self{VALUE}};
+}
+
+sub YYExpect {
+    my($self)=shift;
+
+    keys %{$self->{STATES}[$self->{STACK}[-1][0]]{ACTIONS}}
+}
+
+sub YYLexer {
+    my($self)=shift;
+
+       $$self{LEX};
+}
+
+
+#################
+# Private stuff #
+#################
+
+
+sub _CheckParams {
+       my($mandatory,$checklist,$inarray,$outhash)=@_;
+       my($prm,$value);
+       my($prmlst)={};
+
+       while(($prm,$value)=splice(@$inarray,0,2)) {
+        $prm=uc($prm);
+                       exists($$checklist{$prm})
+               or      croak("Unknow parameter '$prm'");
+                       ref($value) eq $$checklist{$prm}
+               or      croak("Invalid value for parameter '$prm'");
+        $prm=unpack('@2A*',$prm);
+               $$outhash{$prm}=$value;
+       }
+       for (@$mandatory) {
+                       exists($$outhash{$_})
+               or      croak("Missing mandatory parameter '".lc($_)."'");
+       }
+}
+
+sub _Error {
+       print "Parse error.\n";
+}
+
+sub _DBLoad {
+       {
+               no strict 'refs';
+
+                       exists(${__PACKAGE__.'::'}{_DBParse})#Already loaded ?
+               and     return;
+       }
+       my($fname)=__FILE__;
+       my(@drv);
+       open(DRV,"<$fname") or die "Report this as a BUG: Cannot open $fname";
+       while(<DRV>) {
+                       /^\s*sub\s+_Parse\s*{\s*$/ .. /^\s*}\s*#\s*_Parse\s*$/
+               and     do {
+                       s/^#DBG>//;
+                       push(@drv,$_);
+               }
+       }
+       close(DRV);
+
+       $drv[0]=~s/_P/_DBP/;
+       eval join('',@drv);
+}
+
+#Note that for loading debugging version of the driver,
+#this file will be parsed from 'sub _Parse' up to '}#_Parse' inclusive.
+#So, DO NOT remove comment at end of sub !!!
+sub _Parse {
+    my($self)=shift;
+
+       my($rules,$states,$lex,$error)
+     = @$self{ 'RULES', 'STATES', 'LEX', 'ERROR' };
+       my($errstatus,$nberror,$token,$value,$stack,$check,$dotpos)
+     = @$self{ 'ERRST', 'NBERR', 'TOKEN', 'VALUE', 'STACK', 'CHECK', 'DOTPOS' };
+
+#DBG>  my($debug)=$$self{DEBUG};
+#DBG>  my($dbgerror)=0;
+
+#DBG>  my($ShowCurToken) = sub {
+#DBG>          my($tok)='>';
+#DBG>          for (split('',$$token)) {
+#DBG>                  $tok.=          (ord($_) < 32 or ord($_) > 126)
+#DBG>                                  ?       sprintf('<%02X>',ord($_))
+#DBG>                                  :       $_;
+#DBG>          }
+#DBG>          $tok.='<';
+#DBG>  };
+
+       $$errstatus=0;
+       $$nberror=0;
+       ($$token,$$value)=(undef,undef);
+       @$stack=( [ 0, undef ] );
+       $$check='';
+
+    while(1) {
+        my($actions,$act,$stateno);
+
+        $stateno=$$stack[-1][0];
+        $actions=$$states[$stateno];
+
+#DBG>  print STDERR ('-' x 40),"\n";
+#DBG>          $debug & 0x2
+#DBG>  and     print STDERR "In state $stateno:\n";
+#DBG>          $debug & 0x08
+#DBG>  and     print STDERR "Stack:[".
+#DBG>                                   join(',',map { $$_[0] } @$stack).
+#DBG>                                   "]\n";
+
+
+        if  (exists($$actions{ACTIONS})) {
+
+                               defined($$token)
+            or do {
+                               ($$token,$$value)=&$lex($self);
+#DBG>                          $debug & 0x01
+#DBG>                  and     print STDERR "Need token. Got ".&$ShowCurToken."\n";
+                       };
+
+            $act=   exists($$actions{ACTIONS}{$$token})
+                    ?   $$actions{ACTIONS}{$$token}
+                    :   exists($$actions{DEFAULT})
+                        ?   $$actions{DEFAULT}
+                        :   undef;
+        }
+        else {
+            $act=$$actions{DEFAULT};
+#DBG>                  $debug & 0x01
+#DBG>          and     print STDERR "Don't need token.\n";
+        }
+
+            defined($act)
+        and do {
+
+                $act > 0
+            and do {        #shift
+
+#DBG>                          $debug & 0x04
+#DBG>                  and     print STDERR "Shift and go to state $act.\n";
+
+                                       $$errstatus
+                               and     do {
+                                       --$$errstatus;
+
+#DBG>                                  $debug & 0x10
+#DBG>                          and     $dbgerror
+#DBG>                          and     $$errstatus == 0
+#DBG>                          and     do {
+#DBG>                                  print STDERR "**End of Error recovery.\n";
+#DBG>                                  $dbgerror=0;
+#DBG>                          };
+                               };
+
+
+                push(@$stack,[ $act, $$value ]);
+
+                                       $$token ne ''   #Don't eat the eof
+                               and     $$token=$$value=undef;
+                next;
+            };
+
+            #reduce
+            my($lhs,$len,$code,@sempar,$semval);
+            ($lhs,$len,$code)=@{$$rules[-$act]};
+
+#DBG>                  $debug & 0x04
+#DBG>          and     $act
+#DBG>          and     print STDERR "Reduce using rule ".-$act." ($lhs,$len): ";
+
+                $act
+            or  $self->YYAccept();
+
+            $$dotpos=$len;
+
+                unpack('A1',$lhs) eq '@'    #In line rule
+            and do {
+                    $lhs =~ /^\@[0-9]+\-([0-9]+)$/
+                or  die "In line rule name '$lhs' ill formed: ".
+                        "report it as a BUG.\n";
+                $$dotpos = $1;
+            };
+
+            @sempar =       $$dotpos
+                        ?   map { $$_[1] } @$stack[ -$$dotpos .. -1 ]
+                        :   ();
+
+            $semval = $code ? &$code( $self, @sempar )
+                            : @sempar ? $sempar[0] : undef;
+
+            splice(@$stack,-$len,$len);
+
+                $$check eq 'ACCEPT'
+            and do {
+
+#DBG>                  $debug & 0x04
+#DBG>          and     print STDERR "Accept.\n";
+
+                               return($semval);
+                       };
+
+                $$check eq 'ABORT'
+            and        do {
+
+#DBG>                  $debug & 0x04
+#DBG>          and     print STDERR "Abort.\n";
+
+                               return(undef);
+
+                       };
+
+#DBG>                  $debug & 0x04
+#DBG>          and     print STDERR "Back to state $$stack[-1][0], then ";
+
+                $$check eq 'ERROR'
+            or  do {
+#DBG>                          $debug & 0x04
+#DBG>                  and     print STDERR 
+#DBG>                              "go to state $$states[$$stack[-1][0]]{GOTOS}{$lhs}.\n";
+
+#DBG>                          $debug & 0x10
+#DBG>                  and     $dbgerror
+#DBG>                  and     $$errstatus == 0
+#DBG>                  and     do {
+#DBG>                          print STDERR "**End of Error recovery.\n";
+#DBG>                          $dbgerror=0;
+#DBG>                  };
+
+                           push(@$stack,
+                     [ $$states[$$stack[-1][0]]{GOTOS}{$lhs}, $semval ]);
+                $$check='';
+                next;
+            };
+
+#DBG>                  $debug & 0x04
+#DBG>          and     print STDERR "Forced Error recovery.\n";
+
+            $$check='';
+
+        };
+
+        #Error
+            $$errstatus
+        or   do {
+
+            $$errstatus = 1;
+            &$error($self);
+                $$errstatus # if 0, then YYErrok has been called
+            or  next;       # so continue parsing
+
+#DBG>                  $debug & 0x10
+#DBG>          and     do {
+#DBG>                  print STDERR "**Entering Error recovery.\n";
+#DBG>                  ++$dbgerror;
+#DBG>          };
+
+            ++$$nberror;
+
+        };
+
+                       $$errstatus == 3        #The next token is not valid: discard it
+               and     do {
+                               $$token eq ''   # End of input: no hope
+                       and     do {
+#DBG>                          $debug & 0x10
+#DBG>                  and     print STDERR "**At eof: aborting.\n";
+                               return(undef);
+                       };
+
+#DBG>                  $debug & 0x10
+#DBG>          and     print STDERR "**Dicard invalid token ".&$ShowCurToken.".\n";
+
+                       $$token=$$value=undef;
+               };
+
+        $$errstatus=3;
+
+               while(    @$stack
+                         and (         not exists($$states[$$stack[-1][0]]{ACTIONS})
+                               or  not exists($$states[$$stack[-1][0]]{ACTIONS}{error})
+                                       or      $$states[$$stack[-1][0]]{ACTIONS}{error} <= 0)) {
+
+#DBG>                  $debug & 0x10
+#DBG>          and     print STDERR "**Pop state $$stack[-1][0].\n";
+
+                       pop(@$stack);
+               }
+
+                       @$stack
+               or      do {
+
+#DBG>                  $debug & 0x10
+#DBG>          and     print STDERR "**No state left on stack: aborting.\n";
+
+                       return(undef);
+               };
+
+               #shift the error token
+
+#DBG>                  $debug & 0x10
+#DBG>          and     print STDERR "**Shift \$error token and go to state ".
+#DBG>                                           $$states[$$stack[-1][0]]{ACTIONS}{error}.
+#DBG>                                           ".\n";
+
+               push(@$stack, [ $$states[$$stack[-1][0]]{ACTIONS}{error}, undef ]);
+
+    }
+
+    #never reached
+       croak("Error in driver logic. Please, report it as a BUG");
+
+}#_Parse
+#DO NOT remove comment
+
+1;
+
+}
+#End of include--------------------------------------------------
+
+
+
+
+sub new {
+        my($class)=shift;
+        ref($class)
+    and $class=ref($class);
+
+    my($self)=$class->SUPER::new( yyversion => '1.05',
+                                  yystates =>
+[
+       {#State 0
+               ACTIONS => {
+                       'ID' => 23,
+                       'p_typemap' => 3,
+                       'OPSPECIAL' => 28,
+                       'COMMENT' => 4,
+                       "class" => 6,
+                       'RAW_CODE' => 30,
+                       "const" => 8,
+                       "int" => 32,
+                       'p_module' => 13,
+                       'p_package' => 36,
+                       'p_loadplugin' => 37,
+                       "short" => 15,
+                       'p_file' => 38,
+                       "unsigned" => 39,
+                       'p_name' => 17,
+                       'p_include' => 18,
+                       "long" => 19,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'perc_loadplugin' => 24,
+                       'class_name' => 1,
+                       'top_list' => 2,
+                       'nconsttype' => 27,
+                       'perc_package' => 26,
+                       'function' => 25,
+                       'special_block_start' => 29,
+                       'perc_name' => 5,
+                       'class_decl' => 31,
+                       'typemap' => 7,
+                       'decorate_class' => 9,
+                       'special_block' => 10,
+                       'perc_module' => 33,
+                       'type_name' => 11,
+                       'perc_file' => 35,
+                       'basic_type' => 34,
+                       'template' => 12,
+                       'decorate_function' => 14,
+                       'top' => 16,
+                       'function_decl' => 40,
+                       'perc_include' => 41,
+                       'directive' => 42,
+                       'type' => 20,
+                       'class' => 21,
+                       'raw' => 43
+               }
+       },
+       {#State 1
+               ACTIONS => {
+                       'OPANG' => 44
+               },
+               DEFAULT => -78
+       },
+       {#State 2
+               ACTIONS => {
+                       'ID' => 23,
+                       '' => 45,
+                       'p_typemap' => 3,
+                       'OPSPECIAL' => 28,
+                       'COMMENT' => 4,
+                       "class" => 6,
+                       'RAW_CODE' => 30,
+                       "const" => 8,
+                       "int" => 32,
+                       'p_module' => 13,
+                       'p_package' => 36,
+                       'p_loadplugin' => 37,
+                       "short" => 15,
+                       'p_file' => 38,
+                       "unsigned" => 39,
+                       'p_name' => 17,
+                       'p_include' => 18,
+                       "long" => 19,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'perc_loadplugin' => 24,
+                       'class_name' => 1,
+                       'function' => 25,
+                       'perc_package' => 26,
+                       'nconsttype' => 27,
+                       'special_block_start' => 29,
+                       'perc_name' => 5,
+                       'class_decl' => 31,
+                       'typemap' => 7,
+                       'decorate_class' => 9,
+                       'special_block' => 10,
+                       'perc_module' => 33,
+                       'type_name' => 11,
+                       'perc_file' => 35,
+                       'basic_type' => 34,
+                       'template' => 12,
+                       'decorate_function' => 14,
+                       'top' => 46,
+                       'function_decl' => 40,
+                       'perc_include' => 41,
+                       'directive' => 42,
+                       'type' => 20,
+                       'class' => 21,
+                       'raw' => 43
+               }
+       },
+       {#State 3
+               ACTIONS => {
+                       'OPCURLY' => 47
+               }
+       },
+       {#State 4
+               DEFAULT => -15
+       },
+       {#State 5
+               ACTIONS => {
+                       'ID' => 23,
+                       "class" => 6,
+                       "short" => 15,
+                       "const" => 8,
+                       'p_name' => 17,
+                       "unsigned" => 39,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'function' => 49,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'decorate_function' => 14,
+                       'perc_name' => 5,
+                       'class_decl' => 31,
+                       'function_decl' => 40,
+                       'decorate_class' => 9,
+                       'type' => 20,
+                       'class' => 48
+               }
+       },
+       {#State 6
+               ACTIONS => {
+                       'ID' => 50
+               }
+       },
+       {#State 7
+               DEFAULT => -12
+       },
+       {#State 8
+               ACTIONS => {
+                       'ID' => 23,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'nconsttype' => 51,
+                       'template' => 12
+               }
+       },
+       {#State 9
+               DEFAULT => -18
+       },
+       {#State 10
+               DEFAULT => -16
+       },
+       {#State 11
+               DEFAULT => -76
+       },
+       {#State 12
+               DEFAULT => -77
+       },
+       {#State 13
+               ACTIONS => {
+                       'OPCURLY' => 52
+               }
+       },
+       {#State 14
+               DEFAULT => -20
+       },
+       {#State 15
+               ACTIONS => {
+                       "int" => 53
+               },
+               DEFAULT => -85
+       },
+       {#State 16
+               DEFAULT => -1
+       },
+       {#State 17
+               ACTIONS => {
+                       'OPCURLY' => 54
+               }
+       },
+       {#State 18
+               ACTIONS => {
+                       'OPCURLY' => 55
+               }
+       },
+       {#State 19
+               ACTIONS => {
+                       "int" => 56
+               },
+               DEFAULT => -84
+       },
+       {#State 20
+               ACTIONS => {
+                       'ID' => 57
+               }
+       },
+       {#State 21
+               DEFAULT => -4
+       },
+       {#State 22
+               DEFAULT => -82
+       },
+       {#State 23
+               ACTIONS => {
+                       'DCOLON' => 59
+               },
+               DEFAULT => -91,
+               GOTOS => {
+                       'class_suffix' => 58
+               }
+       },
+       {#State 24
+               ACTIONS => {
+                       'SEMICOLON' => 60
+               }
+       },
+       {#State 25
+               DEFAULT => -6
+       },
+       {#State 26
+               ACTIONS => {
+                       'SEMICOLON' => 61
+               }
+       },
+       {#State 27
+               ACTIONS => {
+                       'STAR' => 63,
+                       'AMP' => 62
+               },
+               DEFAULT => -73
+       },
+       {#State 28
+               DEFAULT => -118
+       },
+       {#State 29
+               ACTIONS => {
+                       'CLSPECIAL' => 64,
+                       'line' => 65
+               },
+               GOTOS => {
+                       'special_block_end' => 66,
+                       'lines' => 67
+               }
+       },
+       {#State 30
+               DEFAULT => -14
+       },
+       {#State 31
+               DEFAULT => -17
+       },
+       {#State 32
+               DEFAULT => -83
+       },
+       {#State 33
+               ACTIONS => {
+                       'SEMICOLON' => 68
+               }
+       },
+       {#State 34
+               DEFAULT => -79
+       },
+       {#State 35
+               ACTIONS => {
+                       'SEMICOLON' => 69
+               }
+       },
+       {#State 36
+               ACTIONS => {
+                       'OPCURLY' => 70
+               }
+       },
+       {#State 37
+               ACTIONS => {
+                       'OPCURLY' => 71
+               }
+       },
+       {#State 38
+               ACTIONS => {
+                       'OPCURLY' => 72
+               }
+       },
+       {#State 39
+               ACTIONS => {
+                       "short" => 15,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               DEFAULT => -80,
+               GOTOS => {
+                       'basic_type' => 73
+               }
+       },
+       {#State 40
+               DEFAULT => -19
+       },
+       {#State 41
+               ACTIONS => {
+                       'SEMICOLON' => 74
+               }
+       },
+       {#State 42
+               DEFAULT => -5
+       },
+       {#State 43
+               DEFAULT => -3
+       },
+       {#State 44
+               ACTIONS => {
+                       'ID' => 23,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "const" => 8,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'type_list' => 76,
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'type' => 75
+               }
+       },
+       {#State 45
+               DEFAULT => 0
+       },
+       {#State 46
+               DEFAULT => -2
+       },
+       {#State 47
+               ACTIONS => {
+                       'ID' => 23,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "const" => 8,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'type' => 77
+               }
+       },
+       {#State 48
+               DEFAULT => -23
+       },
+       {#State 49
+               DEFAULT => -24
+       },
+       {#State 50
+               ACTIONS => {
+                       'COLON' => 79
+               },
+               DEFAULT => -32,
+               GOTOS => {
+                       'base_classes' => 78
+               }
+       },
+       {#State 51
+               ACTIONS => {
+                       'STAR' => 63,
+                       'AMP' => 62
+               },
+               DEFAULT => -72
+       },
+       {#State 52
+               ACTIONS => {
+                       'ID' => 23
+               },
+               GOTOS => {
+                       'class_name' => 80
+               }
+       },
+       {#State 53
+               DEFAULT => -87
+       },
+       {#State 54
+               ACTIONS => {
+                       'ID' => 23
+               },
+               GOTOS => {
+                       'class_name' => 81
+               }
+       },
+       {#State 55
+               ACTIONS => {
+                       'ID' => 83,
+                       'DASH' => 84
+               },
+               GOTOS => {
+                       'file_name' => 82
+               }
+       },
+       {#State 56
+               DEFAULT => -86
+       },
+       {#State 57
+               ACTIONS => {
+                       'OPPAR' => 85
+               }
+       },
+       {#State 58
+               ACTIONS => {
+                       'DCOLON' => 86
+               },
+               DEFAULT => -92
+       },
+       {#State 59
+               ACTIONS => {
+                       'ID' => 87
+               }
+       },
+       {#State 60
+               DEFAULT => -10
+       },
+       {#State 61
+               DEFAULT => -8
+       },
+       {#State 62
+               DEFAULT => -75
+       },
+       {#State 63
+               DEFAULT => -74
+       },
+       {#State 64
+               DEFAULT => -119
+       },
+       {#State 65
+               DEFAULT => -120
+       },
+       {#State 66
+               DEFAULT => -117
+       },
+       {#State 67
+               ACTIONS => {
+                       'CLSPECIAL' => 64,
+                       'line' => 88
+               },
+               GOTOS => {
+                       'special_block_end' => 89
+               }
+       },
+       {#State 68
+               DEFAULT => -7
+       },
+       {#State 69
+               DEFAULT => -9
+       },
+       {#State 70
+               ACTIONS => {
+                       'ID' => 23
+               },
+               GOTOS => {
+                       'class_name' => 90
+               }
+       },
+       {#State 71
+               ACTIONS => {
+                       'ID' => 23
+               },
+               GOTOS => {
+                       'class_name' => 91
+               }
+       },
+       {#State 72
+               ACTIONS => {
+                       'ID' => 83,
+                       'DASH' => 84
+               },
+               GOTOS => {
+                       'file_name' => 92
+               }
+       },
+       {#State 73
+               DEFAULT => -81
+       },
+       {#State 74
+               DEFAULT => -11
+       },
+       {#State 75
+               DEFAULT => -89
+       },
+       {#State 76
+               ACTIONS => {
+                       'CLANG' => 93,
+                       'COMMA' => 94
+               }
+       },
+       {#State 77
+               ACTIONS => {
+                       'CLCURLY' => 95
+               }
+       },
+       {#State 78
+               ACTIONS => {
+                       'OPCURLY' => 96,
+                       'COMMA' => 97
+               }
+       },
+       {#State 79
+               ACTIONS => {
+                       "protected" => 101,
+                       "private" => 100,
+                       "public" => 98
+               },
+               GOTOS => {
+                       'base_class' => 99
+               }
+       },
+       {#State 80
+               ACTIONS => {
+                       'CLCURLY' => 102
+               }
+       },
+       {#State 81
+               ACTIONS => {
+                       'CLCURLY' => 103
+               }
+       },
+       {#State 82
+               ACTIONS => {
+                       'CLCURLY' => 104
+               }
+       },
+       {#State 83
+               ACTIONS => {
+                       'DOT' => 106,
+                       'SLASH' => 105
+               }
+       },
+       {#State 84
+               DEFAULT => -95
+       },
+       {#State 85
+               ACTIONS => {
+                       'ID' => 23,
+                       "short" => 15,
+                       "const" => 8,
+                       "unsigned" => 39,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               DEFAULT => -100,
+               GOTOS => {
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'arg_list' => 108,
+                       'argument' => 109,
+                       'type' => 107
+               }
+       },
+       {#State 86
+               ACTIONS => {
+                       'ID' => 110
+               }
+       },
+       {#State 87
+               DEFAULT => -93
+       },
+       {#State 88
+               DEFAULT => -121
+       },
+       {#State 89
+               DEFAULT => -116
+       },
+       {#State 90
+               ACTIONS => {
+                       'CLCURLY' => 111
+               }
+       },
+       {#State 91
+               ACTIONS => {
+                       'CLCURLY' => 112
+               }
+       },
+       {#State 92
+               ACTIONS => {
+                       'CLCURLY' => 113
+               }
+       },
+       {#State 93
+               DEFAULT => -88
+       },
+       {#State 94
+               ACTIONS => {
+                       'ID' => 23,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "const" => 8,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'type' => 114
+               }
+       },
+       {#State 95
+               ACTIONS => {
+                       'OPCURLY' => 115
+               }
+       },
+       {#State 96
+               ACTIONS => {
+                       'ID' => 128,
+                       'p_typemap' => 3,
+                       'OPSPECIAL' => 28,
+                       "virtual" => 130,
+                       'COMMENT' => 4,
+                       "class_static" => 116,
+                       "package_static" => 131,
+                       "public" => 118,
+                       'RAW_CODE' => 30,
+                       "const" => 8,
+                       "int" => 32,
+                       "private" => 121,
+                       'CLCURLY' => 136,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       'p_name' => 17,
+                       'TILDE' => 124,
+                       "protected" => 125,
+                       "long" => 19,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'decorate_method' => 129,
+                       'class_name' => 1,
+                       'nconsttype' => 27,
+                       'static' => 117,
+                       'special_block_start' => 29,
+                       'perc_name' => 119,
+                       'typemap' => 120,
+                       'class_body_element' => 132,
+                       'class_body_list' => 134,
+                       'method' => 133,
+                       'special_block' => 10,
+                       'access_specifier' => 122,
+                       'type_name' => 11,
+                       'ctor' => 123,
+                       'basic_type' => 34,
+                       'template' => 12,
+                       'virtual' => 135,
+                       'function_decl' => 137,
+                       'type' => 20,
+                       'dtor' => 126,
+                       'raw' => 138,
+                       'method_decl' => 127
+               }
+       },
+       {#State 97
+               ACTIONS => {
+                       "protected" => 101,
+                       "private" => 100,
+                       "public" => 98
+               },
+               GOTOS => {
+                       'base_class' => 139
+               }
+       },
+       {#State 98
+               ACTIONS => {
+                       'ID' => 23,
+                       'p_name' => 17
+               },
+               GOTOS => {
+                       'perc_name' => 141,
+                       'class_name' => 140,
+                       'class_name_rename' => 142
+               }
+       },
+       {#State 99
+               DEFAULT => -30
+       },
+       {#State 100
+               ACTIONS => {
+                       'ID' => 23,
+                       'p_name' => 17
+               },
+               GOTOS => {
+                       'perc_name' => 141,
+                       'class_name' => 140,
+                       'class_name_rename' => 143
+               }
+       },
+       {#State 101
+               ACTIONS => {
+                       'ID' => 23,
+                       'p_name' => 17
+               },
+               GOTOS => {
+                       'perc_name' => 141,
+                       'class_name' => 140,
+                       'class_name_rename' => 144
+               }
+       },
+       {#State 102
+               DEFAULT => -65
+       },
+       {#State 103
+               DEFAULT => -63
+       },
+       {#State 104
+               DEFAULT => -68
+       },
+       {#State 105
+               ACTIONS => {
+                       'ID' => 83,
+                       'DASH' => 84
+               },
+               GOTOS => {
+                       'file_name' => 145
+               }
+       },
+       {#State 106
+               ACTIONS => {
+                       'ID' => 146
+               }
+       },
+       {#State 107
+               ACTIONS => {
+                       'ID' => 148,
+                       'p_length' => 147
+               }
+       },
+       {#State 108
+               ACTIONS => {
+                       'CLPAR' => 149,
+                       'COMMA' => 150
+               }
+       },
+       {#State 109
+               DEFAULT => -98
+       },
+       {#State 110
+               DEFAULT => -94
+       },
+       {#State 111
+               DEFAULT => -64
+       },
+       {#State 112
+               DEFAULT => -67
+       },
+       {#State 113
+               DEFAULT => -66
+       },
+       {#State 114
+               DEFAULT => -90
+       },
+       {#State 115
+               ACTIONS => {
+                       'ID' => 151
+               }
+       },
+       {#State 116
+               DEFAULT => -54
+       },
+       {#State 117
+               ACTIONS => {
+                       'ID' => 128,
+                       "virtual" => 130,
+                       "class_static" => 116,
+                       "package_static" => 131,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "const" => 8,
+                       'p_name' => 17,
+                       'TILDE' => 124,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'decorate_method' => 129,
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'ctor' => 123,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'static' => 117,
+                       'virtual' => 135,
+                       'perc_name' => 119,
+                       'function_decl' => 137,
+                       'method' => 152,
+                       'type' => 20,
+                       'dtor' => 126,
+                       'method_decl' => 127
+               }
+       },
+       {#State 118
+               ACTIONS => {
+                       'COLON' => 153
+               }
+       },
+       {#State 119
+               ACTIONS => {
+                       'ID' => 128,
+                       "virtual" => 130,
+                       "class_static" => 116,
+                       "package_static" => 131,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "const" => 8,
+                       'p_name' => 17,
+                       'TILDE' => 124,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'decorate_method' => 129,
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'ctor' => 123,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'static' => 117,
+                       'virtual' => 135,
+                       'perc_name' => 119,
+                       'function_decl' => 137,
+                       'method' => 154,
+                       'type' => 20,
+                       'dtor' => 126,
+                       'method_decl' => 127
+               }
+       },
+       {#State 120
+               DEFAULT => -42
+       },
+       {#State 121
+               ACTIONS => {
+                       'COLON' => 155
+               }
+       },
+       {#State 122
+               DEFAULT => -43
+       },
+       {#State 123
+               DEFAULT => -48
+       },
+       {#State 124
+               ACTIONS => {
+                       'ID' => 156
+               }
+       },
+       {#State 125
+               ACTIONS => {
+                       'COLON' => 157
+               }
+       },
+       {#State 126
+               DEFAULT => -49
+       },
+       {#State 127
+               DEFAULT => -21
+       },
+       {#State 128
+               ACTIONS => {
+                       'DCOLON' => 59,
+                       'OPPAR' => 158
+               },
+               DEFAULT => -91,
+               GOTOS => {
+                       'class_suffix' => 58
+               }
+       },
+       {#State 129
+               DEFAULT => -22
+       },
+       {#State 130
+               DEFAULT => -52
+       },
+       {#State 131
+               DEFAULT => -53
+       },
+       {#State 132
+               DEFAULT => -38
+       },
+       {#State 133
+               DEFAULT => -40
+       },
+       {#State 134
+               ACTIONS => {
+                       'ID' => 128,
+                       'p_typemap' => 3,
+                       'OPSPECIAL' => 28,
+                       "virtual" => 130,
+                       'COMMENT' => 4,
+                       "class_static" => 116,
+                       "package_static" => 131,
+                       "public" => 118,
+                       'RAW_CODE' => 30,
+                       "const" => 8,
+                       "int" => 32,
+                       "private" => 121,
+                       'CLCURLY' => 160,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       'p_name' => 17,
+                       'TILDE' => 124,
+                       "protected" => 125,
+                       "long" => 19,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'decorate_method' => 129,
+                       'class_name' => 1,
+                       'nconsttype' => 27,
+                       'static' => 117,
+                       'special_block_start' => 29,
+                       'perc_name' => 119,
+                       'typemap' => 120,
+                       'class_body_element' => 159,
+                       'method' => 133,
+                       'special_block' => 10,
+                       'access_specifier' => 122,
+                       'type_name' => 11,
+                       'ctor' => 123,
+                       'basic_type' => 34,
+                       'template' => 12,
+                       'virtual' => 135,
+                       'function_decl' => 137,
+                       'type' => 20,
+                       'dtor' => 126,
+                       'raw' => 138,
+                       'method_decl' => 127
+               }
+       },
+       {#State 135
+               ACTIONS => {
+                       'ID' => 128,
+                       "virtual" => 130,
+                       "class_static" => 116,
+                       "package_static" => 131,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "const" => 8,
+                       'p_name' => 17,
+                       'TILDE' => 124,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'decorate_method' => 129,
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'ctor' => 123,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'static' => 117,
+                       'virtual' => 135,
+                       'perc_name' => 119,
+                       'function_decl' => 137,
+                       'method' => 161,
+                       'type' => 20,
+                       'dtor' => 126,
+                       'method_decl' => 127
+               }
+       },
+       {#State 136
+               ACTIONS => {
+                       'SEMICOLON' => 162
+               }
+       },
+       {#State 137
+               DEFAULT => -47
+       },
+       {#State 138
+               DEFAULT => -41
+       },
+       {#State 139
+               DEFAULT => -31
+       },
+       {#State 140
+               DEFAULT => -36
+       },
+       {#State 141
+               ACTIONS => {
+                       'ID' => 23
+               },
+               GOTOS => {
+                       'class_name' => 163
+               }
+       },
+       {#State 142
+               DEFAULT => -33
+       },
+       {#State 143
+               DEFAULT => -35
+       },
+       {#State 144
+               DEFAULT => -34
+       },
+       {#State 145
+               DEFAULT => -97
+       },
+       {#State 146
+               DEFAULT => -96
+       },
+       {#State 147
+               ACTIONS => {
+                       'OPCURLY' => 164
+               }
+       },
+       {#State 148
+               ACTIONS => {
+                       'EQUAL' => 165
+               },
+               DEFAULT => -103
+       },
+       {#State 149
+               ACTIONS => {
+                       "const" => 166
+               },
+               DEFAULT => -51,
+               GOTOS => {
+                       'const' => 167
+               }
+       },
+       {#State 150
+               ACTIONS => {
+                       'ID' => 23,
+                       "short" => 15,
+                       "unsigned" => 39,
+                       "const" => 8,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               GOTOS => {
+                       'argument' => 168,
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'type' => 107
+               }
+       },
+       {#State 151
+               ACTIONS => {
+                       'CLCURLY' => 169
+               }
+       },
+       {#State 152
+               DEFAULT => -26
+       },
+       {#State 153
+               DEFAULT => -44
+       },
+       {#State 154
+               DEFAULT => -25
+       },
+       {#State 155
+               DEFAULT => -46
+       },
+       {#State 156
+               ACTIONS => {
+                       'OPPAR' => 170
+               }
+       },
+       {#State 157
+               DEFAULT => -45
+       },
+       {#State 158
+               ACTIONS => {
+                       'ID' => 23,
+                       "short" => 15,
+                       "const" => 8,
+                       "unsigned" => 39,
+                       "long" => 19,
+                       "int" => 32,
+                       "char" => 22
+               },
+               DEFAULT => -100,
+               GOTOS => {
+                       'type_name' => 11,
+                       'class_name' => 1,
+                       'basic_type' => 34,
+                       'nconsttype' => 27,
+                       'template' => 12,
+                       'arg_list' => 171,
+                       'argument' => 109,
+                       'type' => 107
+               }
+       },
+       {#State 159
+               DEFAULT => -39
+       },
+       {#State 160
+               ACTIONS => {
+                       'SEMICOLON' => 172
+               }
+       },
+       {#State 161
+               DEFAULT => -27
+       },
+       {#State 162
+               DEFAULT => -29
+       },
+       {#State 163
+               DEFAULT => -37
+       },
+       {#State 164
+               ACTIONS => {
+                       'ID' => 173
+               }
+       },
+       {#State 165
+               ACTIONS => {
+                       'ID' => 23,
+                       'INTEGER' => 175,
+                       'QUOTED_STRING' => 177,
+                       'DASH' => 179,
+                       'FLOAT' => 178
+               },
+               GOTOS => {
+                       'class_name' => 174,
+                       'value' => 176
+               }
+       },
+       {#State 166
+               DEFAULT => -50
+       },
+       {#State 167
+               DEFAULT => -59,
+               GOTOS => {
+                       'metadata' => 180
+               }
+       },
+       {#State 168
+               DEFAULT => -99
+       },
+       {#State 169
+               ACTIONS => {
+                       'OPSPECIAL' => 28
+               },
+               DEFAULT => -115,
+               GOTOS => {
+                       'special_blocks' => 182,
+                       'special_block' => 181,
+                       'special_block_start' => 29
+               }
+       },
+       {#State 170
+               ACTIONS => {
+                       'CLPAR' => 183
+               }
+       },
+       {#State 171
+               ACTIONS => {
+                       'CLPAR' => 184,
+                       'COMMA' => 150
+               }
+       },
+       {#State 172
+               DEFAULT => -28
+       },
+       {#State 173
+               ACTIONS => {
+                       'CLCURLY' => 185
+               }
+       },
+       {#State 174
+               ACTIONS => {
+                       'OPPAR' => 186
+               },
+               DEFAULT => -108
+       },
+       {#State 175
+               DEFAULT => -104
+       },
+       {#State 176
+               DEFAULT => -102
+       },
+       {#State 177
+               DEFAULT => -107
+       },
+       {#State 178
+               DEFAULT => -106
+       },
+       {#State 179
+               ACTIONS => {
+                       'INTEGER' => 187
+               }
+       },
+       {#State 180
+               ACTIONS => {
+                       'p_code' => 193,
+                       'p_cleanup' => 189,
+                       'SEMICOLON' => 194,
+                       'p_postcall' => 190
+               },
+               GOTOS => {
+                       '_metadata' => 191,
+                       'perc_postcall' => 192,
+                       'perc_code' => 188,
+                       'perc_cleanup' => 195
+               }
+       },
+       {#State 181
+               DEFAULT => -113
+       },
+       {#State 182
+               ACTIONS => {
+                       'OPSPECIAL' => 28,
+                       'SEMICOLON' => 197
+               },
+               GOTOS => {
+                       'special_block' => 196,
+                       'special_block_start' => 29
+               }
+       },
+       {#State 183
+               DEFAULT => -59,
+               GOTOS => {
+                       'metadata' => 198
+               }
+       },
+       {#State 184
+               DEFAULT => -59,
+               GOTOS => {
+                       'metadata' => 199
+               }
+       },
+       {#State 185
+               DEFAULT => -101
+       },
+       {#State 186
+               ACTIONS => {
+                       'ID' => 23,
+                       'INTEGER' => 175,
+                       'QUOTED_STRING' => 177,
+                       'DASH' => 179,
+                       'FLOAT' => 178
+               },
+               DEFAULT => -112,
+               GOTOS => {
+                       'class_name' => 174,
+                       'value_list' => 200,
+                       'value' => 201
+               }
+       },
+       {#State 187
+               DEFAULT => -105
+       },
+       {#State 188
+               DEFAULT => -60
+       },
+       {#State 189
+               ACTIONS => {
+                       'OPSPECIAL' => 28
+               },
+               GOTOS => {
+                       'special_block' => 202,
+                       'special_block_start' => 29
+               }
+       },
+       {#State 190
+               ACTIONS => {
+                       'OPSPECIAL' => 28
+               },
+               GOTOS => {
+                       'special_block' => 203,
+                       'special_block_start' => 29
+               }
+       },
+       {#State 191
+               DEFAULT => -58
+       },
+       {#State 192
+               DEFAULT => -62
+       },
+       {#State 193
+               ACTIONS => {
+                       'OPSPECIAL' => 28
+               },
+               GOTOS => {
+                       'special_block' => 204,
+                       'special_block_start' => 29
+               }
+       },
+       {#State 194
+               DEFAULT => -55
+       },
+       {#State 195
+               DEFAULT => -61
+       },
+       {#State 196
+               DEFAULT => -114
+       },
+       {#State 197
+               DEFAULT => -13
+       },
+       {#State 198
+               ACTIONS => {
+                       'p_code' => 193,
+                       'p_cleanup' => 189,
+                       'SEMICOLON' => 205,
+                       'p_postcall' => 190
+               },
+               GOTOS => {
+                       '_metadata' => 191,
+                       'perc_postcall' => 192,
+                       'perc_code' => 188,
+                       'perc_cleanup' => 195
+               }
+       },
+       {#State 199
+               ACTIONS => {
+                       'p_code' => 193,
+                       'p_cleanup' => 189,
+                       'SEMICOLON' => 206,
+                       'p_postcall' => 190
+               },
+               GOTOS => {
+                       '_metadata' => 191,
+                       'perc_postcall' => 192,
+                       'perc_code' => 188,
+                       'perc_cleanup' => 195
+               }
+       },
+       {#State 200
+               ACTIONS => {
+                       'CLPAR' => 207,
+                       'COMMA' => 208
+               }
+       },
+       {#State 201
+               DEFAULT => -110
+       },
+       {#State 202
+               DEFAULT => -70
+       },
+       {#State 203
+               DEFAULT => -71
+       },
+       {#State 204
+               DEFAULT => -69
+       },
+       {#State 205
+               DEFAULT => -57
+       },
+       {#State 206
+               DEFAULT => -56
+       },
+       {#State 207
+               DEFAULT => -109
+       },
+       {#State 208
+               ACTIONS => {
+                       'ID' => 23,
+                       'INTEGER' => 175,
+                       'QUOTED_STRING' => 177,
+                       'DASH' => 179,
+                       'FLOAT' => 178
+               },
+               GOTOS => {
+                       'class_name' => 174,
+                       'value' => 209
+               }
+       },
+       {#State 209
+               DEFAULT => -111
+       }
+],
+                                  yyrules  =>
+[
+       [#Rule 0
+                '$start', 2, undef
+       ],
+       [#Rule 1
+                'top_list', 1,
+sub
+#line 21 "XSP.yp"
+{ $_[1] ? [ $_[1] ] : [] }
+       ],
+       [#Rule 2
+                'top_list', 2,
+sub
+#line 22 "XSP.yp"
+{ push @{$_[1]}, $_[2] if $_[2]; $_[1] }
+       ],
+       [#Rule 3
+                'top', 1, undef
+       ],
+       [#Rule 4
+                'top', 1, undef
+       ],
+       [#Rule 5
+                'top', 1, undef
+       ],
+       [#Rule 6
+                'top', 1,
+sub
+#line 26 "XSP.yp"
+{ $_[1]->resolve_typemaps; $_[1] }
+       ],
+       [#Rule 7
+                'directive', 2,
+sub
+#line 29 "XSP.yp"
+{ ExtUtils::XSpp::Node::Module->new( module => $_[1] ) }
+       ],
+       [#Rule 8
+                'directive', 2,
+sub
+#line 31 "XSP.yp"
+{ ExtUtils::XSpp::Node::Package->new( perl_name => $_[1] ) }
+       ],
+       [#Rule 9
+                'directive', 2,
+sub
+#line 33 "XSP.yp"
+{ ExtUtils::XSpp::Node::File->new( file => $_[1] ) }
+       ],
+       [#Rule 10
+                'directive', 2,
+sub
+#line 35 "XSP.yp"
+{ $_[0]->YYData->{PARSER}->load_plugin( $_[1] ); undef }
+       ],
+       [#Rule 11
+                'directive', 2,
+sub
+#line 37 "XSP.yp"
+{ $_[0]->YYData->{PARSER}->include_file( $_[1] ); undef }
+       ],
+       [#Rule 12
+                'directive', 1,
+sub
+#line 38 "XSP.yp"
+{ }
+       ],
+       [#Rule 13
+                'typemap', 9,
+sub
+#line 42 "XSP.yp"
+{ my $package = "ExtUtils::XSpp::Typemap::" . $_[6];
+                      my $type = $_[3]; my $c = 0;
+                      my %args = map { "arg" . ++$c => $_ }
+                                 map { join( '', @$_ ) }
+                                     @{$_[8] || []};
+                      my $tm = $package->new( type => $type, %args );
+                      ExtUtils::XSpp::Typemap::add_typemap_for_type( $type, $tm );
+                      undef }
+       ],
+       [#Rule 14
+                'raw', 1,
+sub
+#line 51 "XSP.yp"
+{ add_data_raw( $_[0], [ $_[1] ] ) }
+       ],
+       [#Rule 15
+                'raw', 1,
+sub
+#line 52 "XSP.yp"
+{ add_data_comment( $_[0], $_[1] ) }
+       ],
+       [#Rule 16
+                'raw', 1,
+sub
+#line 53 "XSP.yp"
+{ add_data_raw( $_[0], [ @{$_[1]} ] ) }
+       ],
+       [#Rule 17
+                'class', 1, undef
+       ],
+       [#Rule 18
+                'class', 1, undef
+       ],
+       [#Rule 19
+                'function', 1, undef
+       ],
+       [#Rule 20
+                'function', 1, undef
+       ],
+       [#Rule 21
+                'method', 1, undef
+       ],
+       [#Rule 22
+                'method', 1, undef
+       ],
+       [#Rule 23
+                'decorate_class', 2,
+sub
+#line 59 "XSP.yp"
+{ $_[2]->set_perl_name( $_[1] ); $_[2] }
+       ],
+       [#Rule 24
+                'decorate_function', 2,
+sub
+#line 60 "XSP.yp"
+{ $_[2]->set_perl_name( $_[1] ); $_[2] }
+       ],
+       [#Rule 25
+                'decorate_method', 2,
+sub
+#line 61 "XSP.yp"
+{ $_[2]->set_perl_name( $_[1] ); $_[2] }
+       ],
+       [#Rule 26
+                'decorate_method', 2,
+sub
+#line 62 "XSP.yp"
+{ $_[2]->set_static( $_[1] ); $_[2] }
+       ],
+       [#Rule 27
+                'decorate_method', 2,
+sub
+#line 63 "XSP.yp"
+{ $_[2]->set_virtual( 1 ); $_[2] }
+       ],
+       [#Rule 28
+                'class_decl', 7,
+sub
+#line 66 "XSP.yp"
+{ create_class( $_[0], $_[2], $_[3], $_[5] ) }
+       ],
+       [#Rule 29
+                'class_decl', 6,
+sub
+#line 68 "XSP.yp"
+{ create_class( $_[0], $_[2], $_[3], [] ) }
+       ],
+       [#Rule 30
+                'base_classes', 2,
+sub
+#line 71 "XSP.yp"
+{ [ $_[2] ] }
+       ],
+       [#Rule 31
+                'base_classes', 3,
+sub
+#line 72 "XSP.yp"
+{ push @{$_[1]}, $_[3] if $_[3]; $_[1] }
+       ],
+       [#Rule 32
+                'base_classes', 0, undef
+       ],
+       [#Rule 33
+                'base_class', 2,
+sub
+#line 76 "XSP.yp"
+{ $_[2] }
+       ],
+       [#Rule 34
+                'base_class', 2,
+sub
+#line 77 "XSP.yp"
+{ $_[2] }
+       ],
+       [#Rule 35
+                'base_class', 2,
+sub
+#line 78 "XSP.yp"
+{ $_[2] }
+       ],
+       [#Rule 36
+                'class_name_rename', 1,
+sub
+#line 82 "XSP.yp"
+{ create_class( $_[0], $_[1], [], [] ) }
+       ],
+       [#Rule 37
+                'class_name_rename', 2,
+sub
+#line 83 "XSP.yp"
+{ my $klass = create_class( $_[0], $_[2], [], [] );
+                             $klass->set_perl_name( $_[1] );
+                             $klass
+                             }
+       ],
+       [#Rule 38
+                'class_body_list', 1,
+sub
+#line 91 "XSP.yp"
+{ $_[1] ? [ $_[1] ] : [] }
+       ],
+       [#Rule 39
+                'class_body_list', 2,
+sub
+#line 93 "XSP.yp"
+{ push @{$_[1]}, $_[2] if $_[2]; $_[1] }
+       ],
+       [#Rule 40
+                'class_body_element', 1, undef
+       ],
+       [#Rule 41
+                'class_body_element', 1, undef
+       ],
+       [#Rule 42
+                'class_body_element', 1, undef
+       ],
+       [#Rule 43
+                'class_body_element', 1, undef
+       ],
+       [#Rule 44
+                'access_specifier', 2,
+sub
+#line 99 "XSP.yp"
+{ ExtUtils::XSpp::Node::Access->new( access => $_[1] ) }
+       ],
+       [#Rule 45
+                'access_specifier', 2,
+sub
+#line 100 "XSP.yp"
+{ ExtUtils::XSpp::Node::Access->new( access => $_[1] ) }
+       ],
+       [#Rule 46
+                'access_specifier', 2,
+sub
+#line 101 "XSP.yp"
+{ ExtUtils::XSpp::Node::Access->new( access => $_[1] ) }
+       ],
+       [#Rule 47
+                'method_decl', 1,
+sub
+#line 105 "XSP.yp"
+{ my $f = $_[1];
+                           my $m = add_data_method
+                             ( $_[0],
+                               name      => $f->cpp_name,
+                               ret_type  => $f->ret_type,
+                               arguments => $f->arguments,
+                               code      => $f->code,
+                               cleanup   => $f->cleanup,
+                               postcall  => $f->postcall,
+                               );
+                           $m
+                         }
+       ],
+       [#Rule 48
+                'method_decl', 1, undef
+       ],
+       [#Rule 49
+                'method_decl', 1, undef
+       ],
+       [#Rule 50
+                'const', 1, undef
+       ],
+       [#Rule 51
+                'const', 0, undef
+       ],
+       [#Rule 52
+                'virtual', 1, undef
+       ],
+       [#Rule 53
+                'static', 1, undef
+       ],
+       [#Rule 54
+                'static', 1, undef
+       ],
+       [#Rule 55
+                'function_decl', 8,
+sub
+#line 130 "XSP.yp"
+{ add_data_function( $_[0],
+                                         name      => $_[2],
+                                         ret_type  => $_[1],
+                                         arguments => $_[4],
+                                         @{ $_[7] } ) }
+       ],
+       [#Rule 56
+                'ctor', 6,
+sub
+#line 137 "XSP.yp"
+{ add_data_ctor( $_[0], name      => $_[1],
+                                            arguments => $_[3],
+                                            @{ $_[5] } ) }
+       ],
+       [#Rule 57
+                'dtor', 6,
+sub
+#line 142 "XSP.yp"
+{ add_data_dtor( $_[0], name  => $_[2],
+                                            @{ $_[5] },
+                                      ) }
+       ],
+       [#Rule 58
+                'metadata', 2,
+sub
+#line 146 "XSP.yp"
+{ [ @{$_[1]}, @{$_[2]} ] }
+       ],
+       [#Rule 59
+                'metadata', 0,
+sub
+#line 147 "XSP.yp"
+{ [] }
+       ],
+       [#Rule 60
+                '_metadata', 1, undef
+       ],
+       [#Rule 61
+                '_metadata', 1, undef
+       ],
+       [#Rule 62
+                '_metadata', 1, undef
+       ],
+       [#Rule 63
+                'perc_name', 4,
+sub
+#line 155 "XSP.yp"
+{ $_[3] }
+       ],
+       [#Rule 64
+                'perc_package', 4,
+sub
+#line 156 "XSP.yp"
+{ $_[3] }
+       ],
+       [#Rule 65
+                'perc_module', 4,
+sub
+#line 157 "XSP.yp"
+{ $_[3] }
+       ],
+       [#Rule 66
+                'perc_file', 4,
+sub
+#line 158 "XSP.yp"
+{ $_[3] }
+       ],
+       [#Rule 67
+                'perc_loadplugin', 4,
+sub
+#line 159 "XSP.yp"
+{ $_[3] }
+       ],
+       [#Rule 68
+                'perc_include', 4,
+sub
+#line 160 "XSP.yp"
+{ $_[3] }
+       ],
+       [#Rule 69
+                'perc_code', 2,
+sub
+#line 161 "XSP.yp"
+{ [ code => $_[2] ] }
+       ],
+       [#Rule 70
+                'perc_cleanup', 2,
+sub
+#line 162 "XSP.yp"
+{ [ cleanup => $_[2] ] }
+       ],
+       [#Rule 71
+                'perc_postcall', 2,
+sub
+#line 163 "XSP.yp"
+{ [ postcall => $_[2] ] }
+       ],
+       [#Rule 72
+                'type', 2,
+sub
+#line 166 "XSP.yp"
+{ make_const( $_[2] ) }
+       ],
+       [#Rule 73
+                'type', 1, undef
+       ],
+       [#Rule 74
+                'nconsttype', 2,
+sub
+#line 171 "XSP.yp"
+{ make_ptr( $_[1] ) }
+       ],
+       [#Rule 75
+                'nconsttype', 2,
+sub
+#line 172 "XSP.yp"
+{ make_ref( $_[1] ) }
+       ],
+       [#Rule 76
+                'nconsttype', 1,
+sub
+#line 173 "XSP.yp"
+{ make_type( $_[1] ) }
+       ],
+       [#Rule 77
+                'nconsttype', 1, undef
+       ],
+       [#Rule 78
+                'type_name', 1, undef
+       ],
+       [#Rule 79
+                'type_name', 1, undef
+       ],
+       [#Rule 80
+                'type_name', 1,
+sub
+#line 180 "XSP.yp"
+{ 'unsigned int' }
+       ],
+       [#Rule 81
+                'type_name', 2,
+sub
+#line 181 "XSP.yp"
+{ 'unsigned' . ' ' . $_[2] }
+       ],
+       [#Rule 82
+                'basic_type', 1, undef
+       ],
+       [#Rule 83
+                'basic_type', 1, undef
+       ],
+       [#Rule 84
+                'basic_type', 1, undef
+       ],
+       [#Rule 85
+                'basic_type', 1, undef
+       ],
+       [#Rule 86
+                'basic_type', 2, undef
+       ],
+       [#Rule 87
+                'basic_type', 2, undef
+       ],
+       [#Rule 88
+                'template', 4,
+sub
+#line 187 "XSP.yp"
+{ make_template( $_[1], $_[3] ) }
+       ],
+       [#Rule 89
+                'type_list', 1,
+sub
+#line 191 "XSP.yp"
+{ [ $_[1] ] }
+       ],
+       [#Rule 90
+                'type_list', 3,
+sub
+#line 192 "XSP.yp"
+{ push @{$_[1]}, $_[3]; $_[1] }
+       ],
+       [#Rule 91
+                'class_name', 1, undef
+       ],
+       [#Rule 92
+                'class_name', 2,
+sub
+#line 196 "XSP.yp"
+{ $_[1] . '::' . $_[2] }
+       ],
+       [#Rule 93
+                'class_suffix', 2,
+sub
+#line 198 "XSP.yp"
+{ $_[2] }
+       ],
+       [#Rule 94
+                'class_suffix', 3,
+sub
+#line 199 "XSP.yp"
+{ $_[1] . '::' . $_[3] }
+       ],
+       [#Rule 95
+                'file_name', 1,
+sub
+#line 201 "XSP.yp"
+{ '-' }
+       ],
+       [#Rule 96
+                'file_name', 3,
+sub
+#line 202 "XSP.yp"
+{ $_[1] . '.' . $_[3] }
+       ],
+       [#Rule 97
+                'file_name', 3,
+sub
+#line 203 "XSP.yp"
+{ $_[1] . '/' . $_[3] }
+       ],
+       [#Rule 98
+                'arg_list', 1,
+sub
+#line 205 "XSP.yp"
+{ [ $_[1] ] }
+       ],
+       [#Rule 99
+                'arg_list', 3,
+sub
+#line 206 "XSP.yp"
+{ push @{$_[1]}, $_[3]; $_[1] }
+       ],
+       [#Rule 100
+                'arg_list', 0, undef
+       ],
+       [#Rule 101
+                'argument', 5,
+sub
+#line 210 "XSP.yp"
+{ make_argument( @_[0, 1], "length($_[4])" ) }
+       ],
+       [#Rule 102
+                'argument', 4,
+sub
+#line 212 "XSP.yp"
+{ make_argument( @_[0, 1, 2, 4] ) }
+       ],
+       [#Rule 103
+                'argument', 2,
+sub
+#line 213 "XSP.yp"
+{ make_argument( @_ ) }
+       ],
+       [#Rule 104
+                'value', 1, undef
+       ],
+       [#Rule 105
+                'value', 2,
+sub
+#line 216 "XSP.yp"
+{ '-' . $_[2] }
+       ],
+       [#Rule 106
+                'value', 1, undef
+       ],
+       [#Rule 107
+                'value', 1, undef
+       ],
+       [#Rule 108
+                'value', 1, undef
+       ],
+       [#Rule 109
+                'value', 4,
+sub
+#line 220 "XSP.yp"
+{ "$_[1]($_[3])" }
+       ],
+       [#Rule 110
+                'value_list', 1, undef
+       ],
+       [#Rule 111
+                'value_list', 3,
+sub
+#line 225 "XSP.yp"
+{ "$_[1], $_[2]" }
+       ],
+       [#Rule 112
+                'value_list', 0,
+sub
+#line 226 "XSP.yp"
+{ "" }
+       ],
+       [#Rule 113
+                'special_blocks', 1,
+sub
+#line 230 "XSP.yp"
+{ [ $_[1] ] }
+       ],
+       [#Rule 114
+                'special_blocks', 2,
+sub
+#line 232 "XSP.yp"
+{ [ @{$_[1]}, $_[2] ] }
+       ],
+       [#Rule 115
+                'special_blocks', 0, undef
+       ],
+       [#Rule 116
+                'special_block', 3,
+sub
+#line 236 "XSP.yp"
+{ $_[2] }
+       ],
+       [#Rule 117
+                'special_block', 2,
+sub
+#line 238 "XSP.yp"
+{ [] }
+       ],
+       [#Rule 118
+                'special_block_start', 1,
+sub
+#line 241 "XSP.yp"
+{ push_lex_mode( $_[0], 'special' ) }
+       ],
+       [#Rule 119
+                'special_block_end', 1,
+sub
+#line 243 "XSP.yp"
+{ pop_lex_mode( $_[0], 'special' ) }
+       ],
+       [#Rule 120
+                'lines', 1,
+sub
+#line 245 "XSP.yp"
+{ [ $_[1] ] }
+       ],
+       [#Rule 121
+                'lines', 2,
+sub
+#line 246 "XSP.yp"
+{ push @{$_[1]}, $_[2]; $_[1] }
+       ]
+],
+                                  @_);
+    bless($self,$class);
+}
+
+#line 248 "XSP.yp"
+
+
+use ExtUtils::XSpp::Lexer;
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Lexer.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Lexer.pm
new file mode 100644 (file)
index 0000000..99608b5
--- /dev/null
@@ -0,0 +1,306 @@
+# this module will be loaded by ExtUtils/XSpp/Grammar.pm and needs to
+# define subroutines in the ExtUtils::XSpp::Grammar namespace
+package ExtUtils::XSpp::Grammar;
+
+use strict;
+use warnings;
+
+use ExtUtils::XSpp::Node;
+use ExtUtils::XSpp::Typemap;
+
+my %tokens = ( '::' => 'DCOLON',
+               ':'  => 'COLON',
+               '%{' => 'OPSPECIAL',
+               '%}' => 'CLSPECIAL',
+               '{%' => 'OPSPECIAL',
+                '{' => 'OPCURLY',
+                '}' => 'CLCURLY',
+                '(' => 'OPPAR',
+                ')' => 'CLPAR',
+                ';' => 'SEMICOLON',
+                '%' => 'PERC',
+                '~' => 'TILDE',
+                '*' => 'STAR',
+                '&' => 'AMP',
+                ',' => 'COMMA',
+                '=' => 'EQUAL',
+                '/' => 'SLASH',
+                '.' => 'DOT',
+                '-' => 'DASH',
+                '<' => 'OPANG',
+                '>' => 'CLANG',
+               # these are here due to my lack of skill with yacc
+               '%name'       => 'p_name',
+               '%typemap'    => 'p_typemap',
+               '%file'       => 'p_file',
+               '%module'     => 'p_module',
+               '%code'       => 'p_code',
+               '%cleanup'    => 'p_cleanup',
+               '%postcall'   => 'p_postcall',
+               '%package'    => 'p_package',
+               '%length'     => 'p_length',
+               '%loadplugin' => 'p_loadplugin',
+               '%include'    => 'p_include',
+             );
+
+my %keywords = ( const => 1,
+                 class => 1,
+                 unsigned => 1,
+                 short => 1,
+                 long => 1,
+                 int => 1,
+                 char => 1,
+                 package_static => 1,
+                 class_static => 1,
+                 public => 1,
+                 private => 1,
+                 protected => 1,
+                 virtual => 1,
+                 );
+
+sub get_lex_mode { return $_[0]->YYData->{LEX}{MODES}[0] || '' }
+
+sub push_lex_mode {
+  my( $p, $mode ) = @_;
+
+  push @{$p->YYData->{LEX}{MODES}}, $mode;
+}
+
+sub pop_lex_mode {
+  my( $p, $mode ) = @_;
+
+  die "Unexpected mode: '$mode'"
+    unless get_lex_mode( $p ) eq $mode;
+
+  pop @{$p->YYData->{LEX}{MODES}};
+}
+
+sub read_more {
+  my $v = readline $_[0]->YYData->{LEX}{FH};
+  my $buf = $_[0]->YYData->{LEX}{BUFFER};
+
+  unless( defined $v ) {
+    if( $_[0]->YYData->{LEX}{NEXT} ) {
+      $_[0]->YYData->{LEX} = $_[0]->YYData->{LEX}{NEXT};
+      $buf = $_[0]->YYData->{LEX}{BUFFER};
+
+      return $buf if length $$buf;
+      return read_more( $_[0] );
+    } else {
+      return;
+    }
+  }
+
+  $$buf .= $v;
+
+  return $buf;
+}
+
+sub yylex {
+  my $data = $_[0]->YYData->{LEX};
+  my $buf = $data->{BUFFER};
+
+  for(;;) {
+    if( !length( $$buf ) && !( $buf = read_more( $_[0] ) ) ) {
+      return ( '', undef );
+    }
+
+    if( get_lex_mode( $_[0] ) eq 'special' ) {
+      if( $$buf =~ s/^%}// ) {
+        return ( 'CLSPECIAL', '%}' );
+      } elsif( $$buf =~ s/^([^\n]*)\n$// ) {
+        my $line = $1;
+
+        if( $line =~ m/^(.*?)\%}(.*)$/ ) {
+          $$buf = "%}$2\n";
+          $line = $1;
+        }
+
+        return ( 'line', $line );
+      }
+    } else {
+      $$buf =~ s/^[\s\n\r]+//;
+      next unless length $$buf;
+
+      if( $$buf =~ s/^([+-]?(?=\d|\.\d)\d*(?:\.\d*)?(?:[Ee](?:[+-]?\d+))?)// ) {
+        return ( 'FLOAT', $1 );
+      } elsif( $$buf =~ s/^\/\/(.*)(?:\r\n|\r|\n)// ) {
+        return ( 'COMMENT', [ $1 ] );
+      } elsif( $$buf =~ /^\/\*/ ) {
+        my @rows;
+        for(; length( $$buf ) || ( $buf = read_more( $_[0] ) ); $$buf = '') {
+          if( $$buf =~ s/(.*?\*\/)// ) {
+              push @rows, $1;
+              return ( 'COMMENT', \@rows );
+          }
+          $$buf =~ s/(?:\r\n|\r|\n)$//;
+          push @rows, $$buf;
+        }
+      } elsif( $$buf =~ s/^( \%}
+                      | \%{ | {\%
+                      | \%name | \%typemap | \%module  | \%code
+                      | \%file | \%cleanup | \%package | \%length
+                      | \%loadplugin | \%include | \%postcall
+                      | [{}();%~*&,=\/\.\-<>]
+                      | :: | :
+                       )//x ) {
+        return ( $tokens{$1}, $1 );
+      } elsif( $$buf =~ s/^(INCLUDE(?:_COMMAND)?:.*)(?:\r\n|\r|\n)// ) {
+        return ( 'RAW_CODE', "$1\n" );
+      } elsif( $$buf =~ m/^([a-zA-Z_]\w*)\W/ ) {
+        $$buf =~ s/^(\w+)//;
+
+        return ( $1, $1 ) if exists $keywords{$1};
+
+        return ( 'ID', $1 );
+      } elsif( $$buf =~ s/^(\d+)// ) {
+        return ( 'INTEGER', $1 );
+      } elsif( $$buf =~ s/^("[^"]*")// ) {
+        return ( 'QUOTED_STRING', $1 );
+      } elsif( $$buf =~ s/^(#.*)(?:\r\n|\r|\n)// ) {
+        return ( 'RAW_CODE', $1 );
+      } else {
+        die $$buf;
+      }
+    }
+  }
+}
+
+sub yyerror {
+  my $data = $_[0]->YYData->{LEX};
+  my $buf = $data->{BUFFER};
+  my $fh = $data->{FH};
+
+  print STDERR "Error: line " . $fh->input_line_number . " (Current token type: '",
+    $_[0]->YYCurtok, "') (Current value: '",
+    $_[0]->YYCurval, '\') Buffer: "', ( $buf ? $$buf : '--empty buffer--' ),
+      q{"} . "\n";
+  print STDERR "Expecting: (", ( join ", ", map { "'$_'" } $_[0]->YYExpect ),
+        ")\n";
+}
+
+sub make_const { $_[0]->{CONST} = 1; $_[0] }
+sub make_ref   { $_[0]->{REFERENCE} = 1; $_[0] }
+sub make_ptr   { $_[0]->{POINTER}++; $_[0] }
+sub make_type  { ExtUtils::XSpp::Node::Type->new( base => $_[0] ) }
+
+sub make_template {
+    ExtUtils::XSpp::Node::Type->new( base          => $_[0],
+                                     template_args => $_[1],
+                                     )
+}
+
+sub add_data_raw {
+  my $p = shift;
+  my $rows = shift;
+
+  ExtUtils::XSpp::Node::Raw->new( rows => $rows );
+}
+
+sub add_data_comment {
+  my $p = shift;
+  my $rows = shift;
+
+  ExtUtils::XSpp::Node::Comment->new( rows => $rows );
+}
+
+sub make_argument {
+  my( $p, $type, $name, $default ) = @_;
+
+  ExtUtils::XSpp::Node::Argument->new( type    => $type,
+                              name    => $name,
+                              default => $default );
+}
+
+sub create_class {
+  my( $parser, $name, $bases, $methods ) = @_;
+  my $class = ExtUtils::XSpp::Node::Class->new( cpp_name     => $name,
+                                                base_classes => $bases );
+
+  # when adding a class C, automatically add weak typemaps for C* and C&
+  my $ptr = ExtUtils::XSpp::Node::Type->new
+                ( base    => $name,
+                  pointer => 1,
+                  );
+  my $ref = ExtUtils::XSpp::Node::Type->new
+                ( base      => $name,
+                  reference => 1,
+                  );
+
+  ExtUtils::XSpp::Typemap::add_weak_typemap_for_type
+      ( $ptr, ExtUtils::XSpp::Typemap::simple->new( type => $ptr ) );
+  ExtUtils::XSpp::Typemap::add_weak_typemap_for_type
+      ( $ref, ExtUtils::XSpp::Typemap::reference->new( type => $ref ) );
+
+  # finish creating the class
+  $class->add_methods( @$methods );
+
+  return $class;
+}
+
+sub add_data_function {
+  my( $parser, %args ) = @_;
+
+  ExtUtils::XSpp::Node::Function->new
+      ( cpp_name  => $args{name},
+        class     => $args{class},
+        ret_type  => $args{ret_type},
+        arguments => $args{arguments},
+        code      => $args{code},
+        cleanup   => $args{cleanup},
+        postcall  => $args{postcall},
+        );
+}
+
+sub add_data_method {
+  my( $parser, %args ) = @_;
+
+  ExtUtils::XSpp::Node::Method->new
+      ( cpp_name  => $args{name},
+        ret_type  => $args{ret_type},
+        arguments => $args{arguments},
+        code      => $args{code},
+        cleanup   => $args{cleanup},
+        postcall  => $args{postcall},
+        perl_name => $args{perl_name},
+        );
+}
+
+sub add_data_ctor {
+  my( $parser, %args ) = @_;
+
+  ExtUtils::XSpp::Node::Constructor->new
+      ( cpp_name  => $args{name},
+        arguments => $args{arguments},
+        code      => $args{code},
+        cleanup   => $args{cleanup},
+        postcall  => $args{postcall},
+        );
+}
+
+sub add_data_dtor {
+  my( $parser, %args ) = @_;
+
+  ExtUtils::XSpp::Node::Destructor->new
+      ( cpp_name  => $args{name},
+        code      => $args{code},
+        cleanup   => $args{cleanup},
+        postcall  => $args{postcall},
+        );
+}
+
+sub is_directive {
+  my( $p, $d, $name ) = @_;
+
+  return $d->[0] eq $name;
+}
+
+#sub assert_directive {
+#  my( $p, $d, $name ) = @_;
+#
+#  if( $d->[0] ne $name )
+#    { $p->YYError }
+#  1;
+#}
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Node.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Node.pm
new file mode 100644 (file)
index 0000000..bc990dc
--- /dev/null
@@ -0,0 +1,682 @@
+package ExtUtils::XSpp::Node;
+
+=head1 NAME
+
+ExtUtils::XSpp::Node - Base class for the parser output.
+
+=cut
+
+use strict;
+use warnings;
+
+sub new {
+  my $class = shift;
+  my $this = bless {}, $class;
+
+  $this->init( @_ );
+
+  return $this;
+}
+
+=head2 ExtUtils::XSpp::Node::print
+
+Return a string to be output in the final XS file.
+Every class must override this method.
+
+=cut
+
+package ExtUtils::XSpp::Node::Raw;
+
+=head1 ExtUtils::XSpp::Node::Raw
+
+Contains data that should be output "as is" in the destination file.
+
+=cut
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{ROWS} = $args{rows};
+  push @{$this->{ROWS}}, "\n";
+}
+
+=head2 ExtUtils::XSpp::Node::Raw::rows
+
+Returns an array reference holding the rows to be output in the final file.
+
+=cut
+
+sub rows { $_[0]->{ROWS} }
+sub print { join( "\n", @{$_[0]->rows} ) . "\n" }
+
+package ExtUtils::XSpp::Node::Comment;
+
+=head1 ExtUtils::XSpp::Node::Comment
+
+Contains data that should be output prefixed with a comment marker
+
+=cut
+
+use strict;
+use base 'ExtUtils::XSpp::Node::Raw';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{ROWS} = $args{rows};
+}
+
+sub print {
+  my $this = shift;
+  my $state = shift;
+
+  return "\n";
+}
+
+package ExtUtils::XSpp::Node::Package;
+
+=head1 ExtUtils::XSpp::Node::Package
+
+Used to put global functions inside a Perl package.
+
+=cut
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{CPP_NAME} = $args{cpp_name};
+  $this->{PERL_NAME} = $args{perl_name} || $args{cpp_name};
+}
+
+=head2 ExtUtils::XSpp::Node::Package::cpp_name
+
+Returns the C++ name for the package (will be used for namespaces).
+
+=head2 ExtUtils::XSpp::Node::Package::perl_name
+
+Returns the Perl name for the package.
+
+=cut
+
+sub cpp_name { $_[0]->{CPP_NAME} }
+sub perl_name { $_[0]->{PERL_NAME} }
+sub set_perl_name { $_[0]->{PERL_NAME} = $_[1] }
+
+sub print {
+  my $this = shift;
+  my $state = shift;
+  my $out = '';
+  my $pcname = $this->perl_name;
+
+  if( !defined $state->{current_module} ) {
+    die "No current module: remember to add a %module{} directive";
+  }
+  my $cur_module = $state->{current_module}->to_string;
+
+  $out .= <<EOT;
+
+$cur_module PACKAGE=$pcname
+
+EOT
+
+  return $out;
+}
+
+package ExtUtils::XSpp::Node::Class;
+
+=head1 ExtUtils::XSpp::Node::Class
+
+A class (inherits from Package).
+
+=cut
+
+use strict;
+use base 'ExtUtils::XSpp::Node::Package';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->SUPER::init( @_ );
+  $this->{METHODS} = $args{methods} || [];
+  $this->{BASE_CLASSES} = $args{base_classes} || [];
+}
+
+=head2 ExtUtils::XSpp::Node::Class::methods
+
+=cut
+
+sub methods { $_[0]->{METHODS} }
+sub base_classes { $_[0]->{BASE_CLASSES} }
+
+sub add_methods {
+  my $this = shift;
+  my $access = 'public'; # good enough for now
+  foreach my $meth ( @_ ) {
+      if( $meth->isa( 'ExtUtils::XSpp::Node::Method' ) ) {
+          $meth->{CLASS} = $this;
+          $meth->{ACCESS} = $access;
+          $meth->resolve_typemaps;
+      } elsif( $meth->isa( 'ExtUtils::XSpp::Node::Access' ) ) {
+          $access = $meth->access;
+          next;
+      }
+      push @{$this->{METHODS}}, $meth;
+  }
+}
+
+sub print {
+  my $this = shift;
+  my $state = shift;
+  my $out = $this->SUPER::print( $state );
+
+  foreach my $m ( @{$this->methods} ) {
+    $out .= $m->print( $state );
+  }
+
+  # add a BOOT block for base classes
+  if( @{$this->base_classes} ) {
+      my $class = $this->perl_name;
+
+      $out .= <<EOT;
+BOOT:
+    {
+        AV* isa = get_av( "${class}::ISA", 1 );
+EOT
+
+    foreach my $b ( @{$this->base_classes} ) {
+      my $base = $b->perl_name;
+
+      $out .= <<EOT;
+        av_store( isa, 0, newSVpv( "$base", 0 ) );
+EOT
+    }
+
+      # close block in BOOT
+      $out .= <<EOT;
+    } // blank line here is important
+
+EOT
+  }
+
+  return $out;
+}
+
+package ExtUtils::XSpp::Node::Access;
+
+=head1 ExtUtils::XSpp::Node::Access
+
+Access specifier.
+
+=cut
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{ACCESS} = $args{access};
+}
+
+sub access { $_[0]->{ACCESS} }
+
+package ExtUtils::XSpp::Node::Function;
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+=head1 ExtUtils::XSpp::Node::Function
+
+A function; this is also a base class for C<Method>.
+
+=cut
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{CPP_NAME} = $args{cpp_name};
+  $this->{PERL_NAME} = $args{perl_name} || $args{cpp_name};
+  $this->{ARGUMENTS} = $args{arguments} || [];
+  $this->{RET_TYPE} = $args{ret_type};
+  $this->{CODE} = $args{code};
+  $this->{CLEANUP} = $args{cleanup};
+  $this->{POSTCALL} = $args{postcall};
+  $this->{CLASS} = $args{class};
+}
+
+sub resolve_typemaps {
+  my $this = shift;
+
+  if( $this->ret_type ) {
+    $this->{TYPEMAPS}{RET_TYPE} =
+      ExtUtils::XSpp::Typemap::get_typemap_for_type( $this->ret_type );
+  }
+  foreach my $a ( @{$this->arguments} ) {
+    my $t = ExtUtils::XSpp::Typemap::get_typemap_for_type( $a->type );
+    push @{$this->{TYPEMAPS}{ARGUMENTS}}, $t;
+  }
+}
+
+=head2 ExtUtils::XSpp::Node::Function::cpp_name
+
+=head2 ExtUtils::XSpp::Node::Function::perl_name
+
+=head2 ExtUtils::XSpp::Node::Function::arguments
+
+=head2 ExtUtils::XSpp::Node::Function::ret_type
+
+=head2 ExtUtils::XSpp::Node::Function::code
+
+=head2 ExtUtils::XSpp::Node::Function::cleanup
+
+=head2 ExtUtils::XSpp::Node::Function::postcall
+
+=head2 ExtUtils::XSpp::Node::Function::argument_style
+
+Returns either C<ansi> or C<kr>. C<kr> is the default.
+C<ansi> is returned if any one of the arguments uses the XS
+C<length> feature.
+
+=cut
+
+sub cpp_name { $_[0]->{CPP_NAME} }
+sub perl_name { $_[0]->{PERL_NAME} }
+sub arguments { $_[0]->{ARGUMENTS} }
+sub ret_type { $_[0]->{RET_TYPE} }
+sub code { $_[0]->{CODE} }
+sub cleanup { $_[0]->{CLEANUP} }
+sub postcall { $_[0]->{POSTCALL} }
+sub package_static { ( $_[0]->{STATIC} || '' ) eq 'package_static' }
+sub class_static { ( $_[0]->{STATIC} || '' ) eq 'class_static' }
+sub virtual { $_[0]->{VIRTUAL} }
+
+sub set_perl_name { $_[0]->{PERL_NAME} = $_[1] }
+sub set_static { $_[0]->{STATIC} = $_[1] }
+sub set_virtual { $_[0]->{VIRTUAL} = $_[1] }
+
+sub argument_style {
+  my $this = shift;
+  foreach my $arg (@{$this->{ARGUMENTS}}) {
+    return 'ansi' if $arg->name =~ /length.*\(/;
+  }
+  return 'kr';
+}
+
+# Depending on argument style, this produces either: (style=kr)
+#
+# return_type
+# class_name::function_name( args = def, ... )
+#     type arg
+#     type arg
+#   PREINIT:
+#     aux vars
+#   [PP]CODE:
+#     RETVAL = new Foo( THIS->method( arg1, *arg2 ) );
+#   POSTCALL:
+#     /* anything */
+#   OUTPUT:
+#     RETVAL
+#   CLEANUP:
+#     /* anything */
+#
+# Or: (style=ansi)
+#
+# return_type
+# class_name::function_name( type arg1 = def, type arg2 = def, ... )
+#   PREINIT:
+# (rest as above)
+
+sub print {
+  my $this = shift;
+  my $state = shift;
+  my $out = '';
+  my $fname = $this->perl_function_name;
+  my $args = $this->arguments;
+  my $ret_type = $this->ret_type;
+  my $ret_typemap = $this->{TYPEMAPS}{RET_TYPE};
+  my $need_call_function = 0;
+  my( $init, $arg_list, $call_arg_list, $code, $output, $cleanup,
+      $postcall, $precall ) =
+    ( '', '', '', '', '', '', '', '' );
+  my $use_ansi_style = $this->argument_style() eq 'ansi';
+
+  if( $args && @$args ) {
+    my $has_self = $this->is_method ? 1 : 0;
+    my( @arg_list, @call_arg_list );
+    foreach my $i ( 0 .. $#$args ) {
+      my $arg = ${$args}[$i];
+      my $t = $this->{TYPEMAPS}{ARGUMENTS}[$i];
+      my $pc = $t->precall_code( sprintf( 'ST(%d)', $i + $has_self ),
+                                 $arg->name );
+
+      $need_call_function ||=    defined $t->call_parameter_code( '' )
+                              || defined $pc;
+      my $type = $use_ansi_style ? $t->cpp_type . ' ' : '';
+      push @arg_list, $type . $arg->name . ( $arg->has_default ? ' = ' . $arg->default : '' );
+      if (!$use_ansi_style) {
+        $init .= '    ' . $t->cpp_type . ' ' . $arg->name . "\n";
+      }
+
+      my $call_code = $t->call_parameter_code( $arg->name );
+      push @call_arg_list, defined( $call_code ) ? $call_code : $arg->name;
+      $precall .= $pc . ";\n" if $pc
+    }
+
+    $arg_list = ' ' . join( ', ', @arg_list ) . ' ';
+    $call_arg_list = ' ' . join( ', ', @call_arg_list ) . ' ';
+  }
+  # same for return value
+  $need_call_function ||= $ret_typemap &&
+    ( defined $ret_typemap->call_function_code( '', '' ) ||
+      defined $ret_typemap->output_code ||
+      defined $ret_typemap->cleanup_code );
+  # is C++ name != Perl name?
+  $need_call_function ||= $this->cpp_name ne $this->perl_name;
+  # package-static function
+  $need_call_function ||= $this->package_static;
+
+  my $retstr = $ret_typemap ? $ret_typemap->cpp_type : 'void';
+
+  # special case: constructors with name different from 'new'
+  # need to be declared 'static' in XS
+  if( $this->isa( 'ExtUtils::XSpp::Node::Constructor' ) &&
+      $this->perl_name ne $this->cpp_name ) {
+    $retstr = "static $retstr";
+  }
+
+  my $has_ret = $ret_typemap && !$ret_typemap->type->is_void;
+  if( $need_call_function ) {
+    my $ccode = $this->_call_code( $call_arg_list );
+    if( $has_ret && defined $ret_typemap->call_function_code( '', '' ) ) {
+      $ccode = $ret_typemap->call_function_code( $ccode, 'RETVAL' );
+    } elsif( $has_ret ) {
+      $ccode = "RETVAL = $ccode";
+    }
+
+    $code .= "  CODE:\n";
+    $code .= '    ' . $precall if $precall;
+    $code .= '    ' . $ccode . ";\n";
+
+    if( $has_ret && defined $ret_typemap->output_code ) {
+      $code .= '    ' . $ret_typemap->output_code . ";\n";
+    }
+    $output = "  OUTPUT: RETVAL\n" if $has_ret;
+
+    if( $has_ret && defined $ret_typemap->cleanup_code ) {
+      $cleanup .= "  CLEANUP:\n";
+      $cleanup .= '    ' . $ret_typemap->cleanup_code . ";\n";
+    }
+  }
+
+  if( $this->code ) {
+    $code = "  CODE:\n    " . join( "\n", @{$this->code} ) . "\n";
+    $output = "  OUTPUT: RETVAL\n" if $code =~ m/RETVAL/;
+  }
+  if( $this->postcall ) {
+    $postcall = "  POSTCALL:\n    " . join( "\n", @{$this->postcall} ) . "\n";
+    $output ||= "  OUTPUT: RETVAL\n" if $has_ret;
+  }
+  if( $this->cleanup ) {
+    $cleanup ||= "  CLEANUP:\n";
+    my $clcode = join( "\n", @{$this->cleanup} );
+    $cleanup .= "    $clcode\n";
+  }
+
+  if( !$this->is_method && $fname =~ /^(.*)::(\w+)$/ ) {
+    my $pcname = $1;
+    $fname = $2;
+    my $cur_module = $state->{current_module}->to_string;
+    $out .= <<EOT;
+$cur_module PACKAGE=$pcname
+
+EOT
+  }
+
+  $out .= "$retstr\n";
+  $out .= "$fname($arg_list)\n";
+  $out .= $init;
+  $out .= $code;
+  $out .= $postcall;
+  $out .= $output;
+  $out .= $cleanup;
+  $out .= "\n";
+}
+
+sub perl_function_name { $_[0]->perl_name }
+sub is_method { 0 }
+
+=begin documentation
+
+ExtUtils::XSpp::Node::_call_code( argument_string )
+
+Return something like "foo( $argument_string )".
+
+=end documentation
+
+=cut
+
+sub _call_code { return $_[0]->cpp_name . '(' . $_[1] . ')'; }
+
+package ExtUtils::XSpp::Node::Method;
+
+use strict;
+use base 'ExtUtils::XSpp::Node::Function';
+
+sub class { $_[0]->{CLASS} }
+sub perl_function_name { $_[0]->class->cpp_name . '::' .
+                         $_[0]->perl_name }
+sub _call_code {
+    my( $self ) = @_;
+
+    if( $self->package_static ) {
+        return $_[0]->class->cpp_name . '::' .
+               $_[0]->cpp_name . '(' . $_[1] . ')';
+    } else {
+        return "THIS->" .
+               $_[0]->cpp_name . '(' . $_[1] . ')';
+    }
+}
+
+sub is_method { 1 }
+
+package ExtUtils::XSpp::Node::Constructor;
+
+use strict;
+use base 'ExtUtils::XSpp::Node::Method';
+
+sub init {
+  my $this = shift;
+  $this->SUPER::init( @_ );
+
+  die "Can't specify return value in constructor" if $this->{RET_TYPE};
+}
+
+sub ret_type {
+  my $this = shift;
+
+  ExtUtils::XSpp::Node::Type->new( base      => $this->class->cpp_name,
+                            pointer   => 1 );
+}
+
+sub perl_function_name {
+  my $this = shift;
+  my( $pname, $cname, $pclass, $cclass ) = ( $this->perl_name,
+                                             $this->cpp_name,
+                                             $this->class->perl_name,
+                                             $this->class->cpp_name );
+
+  if( $pname ne $cname ) {
+    return $cclass . '::' . $pname;
+  } else {
+    return $cclass . '::' . 'new';
+  }
+}
+
+sub _call_code { return "new " . $_[0]->class->cpp_name .
+                   '(' . $_[1] . ')'; }
+
+package ExtUtils::XSpp::Node::Destructor;
+
+use strict;
+use base 'ExtUtils::XSpp::Node::Method';
+
+sub init {
+  my $this = shift;
+  $this->SUPER::init( @_ );
+
+  die "Can't specify return value in destructor" if $this->{RET_TYPE};
+}
+
+sub perl_function_name { $_[0]->class->cpp_name . '::' . 'DESTROY' }
+sub ret_type { undef }
+
+package ExtUtils::XSpp::Node::Argument;
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{TYPE} = $args{type};
+  $this->{NAME} = $args{name};
+  $this->{DEFAULT} = $args{default};
+}
+
+sub print {
+  my $this = shift;
+  my $state = shift;
+
+  return join( ' ',
+               $this->type->print( $state ),
+               $this->name,
+               ( $this->default ?
+                 ( '=', $this->default ) : () ) );
+}
+
+sub type { $_[0]->{TYPE} }
+sub name { $_[0]->{NAME} }
+sub default { $_[0]->{DEFAULT} }
+sub has_default { defined $_[0]->{DEFAULT} }
+
+package ExtUtils::XSpp::Node::Type;
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+# normalized names for some integral C types
+my %normalize =
+  ( 'unsigned'           => 'unsigned int',
+    'long int'           => 'long',
+    'unsigned long int'  => 'unsigned long',
+    'short int'          => 'short',
+    'unsigned short int' => 'unsigned short',
+    );
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{BASE} = $normalize{$args{base}} || $args{base};
+  $this->{POINTER} = $args{pointer} ? 1 : 0;
+  $this->{REFERENCE} = $args{reference} ? 1 : 0;
+  $this->{CONST} = $args{const} ? 1 : 0;
+  $this->{TEMPLATE_ARGS} = $args{template_args} || [];
+}
+
+sub is_const { $_[0]->{CONST} }
+sub is_reference { $_[0]->{REFERENCE} }
+sub is_pointer { $_[0]->{POINTER} }
+sub base_type { $_[0]->{BASE} }
+sub template_args { $_[0]->{TEMPLATE_ARGS} }
+
+sub equals {
+  my( $f, $s ) = @_;
+
+  return 0 if @{$f->template_args} != @{$s->template_args};
+
+  for( my $i = 0; $i < @{$f->template_args}; ++$i ) {
+      return 0
+          unless $f->template_args->[$i]->equals( $s->template_args->[$i] );
+  }
+
+  return $f->is_const == $s->is_const
+      && $f->is_reference == $s->is_reference
+      && $f->is_pointer == $s->is_pointer
+      && $f->base_type eq $s->base_type;
+}
+
+sub is_void { return $_[0]->base_type eq 'void' &&
+                !$_[0]->is_pointer && !$_[0]->is_reference }
+
+sub print_tmpl_args {
+  my $this = shift;
+  my $state = shift;
+  my $tmpl_args = '';
+  if( @{$this->template_args} ) {
+      $tmpl_args =   '< '
+                   . join( ', ',
+                           map $_->print( $state ), @{$this->template_args} )
+                   . ' >';
+  }
+  return $tmpl_args;
+}
+
+sub print {
+  my $this = shift;
+  my $state = shift;
+
+  return join( '',
+               ( $this->is_const ? 'const ' : '' ),
+               $this->base_type,
+               $this->print_tmpl_args,
+               ( $this->is_pointer ? ( '*' x $this->is_pointer ) :
+                 $this->is_reference ? '&' : '' ) );
+}
+
+
+package ExtUtils::XSpp::Node::Module;
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{MODULE} = $args{module};
+}
+
+sub module { $_[0]->{MODULE} }
+sub to_string { 'MODULE=' . $_[0]->module }
+sub print { return $_[0]->to_string . "\n" }
+
+package ExtUtils::XSpp::Node::File;
+
+use strict;
+use base 'ExtUtils::XSpp::Node';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{FILE} = $args{file};
+}
+
+sub file { $_[0]->{FILE} }
+sub print { "\n" }
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Parser.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Parser.pm
new file mode 100644 (file)
index 0000000..7d9cd12
--- /dev/null
@@ -0,0 +1,150 @@
+package ExtUtils::XSpp::Parser;
+
+use strict;
+use warnings;
+
+use IO::Handle;
+use ExtUtils::XSpp::Grammar;
+
+=head1 NAME
+
+ExtUtils::XSpp::Parser - an XS++ parser
+
+=cut
+
+sub _my_open {
+  my $file = shift;
+
+  open my $in, "<", $file
+    or die "Failed to open '$file' for reading: $!";
+
+  return $in;
+}
+
+=head2 ExtUtils::XSpp::Parser::new( file => path )
+
+Create a new XS++ parser.
+
+=cut
+
+sub new {
+  my $class = shift;
+  my $this = bless {}, $class;
+  my %args = @_;
+
+  $this->{FILE} = $args{file};
+  $this->{STRING} = $args{string};
+  $this->{PARSER} = ExtUtils::XSpp::Grammar->new;
+
+  return $this;
+}
+
+=head2 ExtUtils::XSpp::Parser::parse
+
+Parse the file data; returns true on success, false otherwise,
+on failure C<get_errors> will return the list of errors.
+
+=cut
+
+sub parse {
+  my $this = shift;
+  my $fh;
+  if( $this->{FILE} ) {
+      $fh = _my_open( $this->{FILE} );
+  } else {
+      open $fh, '<', \$this->{STRING}
+        or die "Failed to create file handle from in-memory string";
+  }
+  my $buf = '';
+
+  my $parser = $this->{PARSER};
+  $parser->YYData->{LEX}{FH} = $fh;
+  $parser->YYData->{LEX}{BUFFER} = \$buf;
+  local $parser->YYData->{PARSER} = $this;
+
+  $this->{DATA} = $parser->YYParse( yylex   => \&ExtUtils::XSpp::Grammar::yylex,
+                                    yyerror => \&ExtUtils::XSpp::Grammar::yyerror,
+                                    yydebug => 0x00,
+                                   );
+}
+
+sub include_file {
+  my $this = shift;
+  my( $file ) = @_;
+  my $buf = '';
+  my $new_lex = { FH     => _my_open( $file ),
+                  BUFFER => \$buf,
+                  NEXT   => $this->{PARSER}->YYData->{LEX},
+                  };
+
+  $this->{PARSER}->YYData->{LEX} = $new_lex;
+}
+
+=head2 ExtUtils::XSpp::Parser::get_data
+
+Returns a list containing the parsed data. Each item of the list is
+a subclass of C<ExtUtils::XSpp::Node>
+
+=cut
+
+sub get_data {
+  my $this = shift;
+  die "'parse' must be called before calling 'get_data'"
+    unless exists $this->{DATA};
+
+  return $this->{DATA};
+}
+
+=head2 ExtUtils::XSpp::Parser::get_errors
+
+Returns the parsing errors as an array.
+
+=cut
+
+sub get_errors {
+  my $this = shift;
+
+  return @{$this->{ERRORS}};
+}
+
+=head2 ExtUtils::XSpp::Parser::load_plugin
+
+Loads the specified plugin and calls its C<register_plugin> method.
+
+=cut
+
+sub load_plugin {
+  my $this = shift;
+  my( $package ) = @_;
+
+  if (eval "require ExtUtils::XSpp::Plugin::$package;") {
+    $package = "ExtUtils::XSpp::Plugin::$package";
+    $package->register_plugin( $this );
+  }
+  elsif (eval "require $package;") {
+    $package->register_plugin( $this );
+  }
+  else {
+    die "Could not load XS++ plugin '$package' (neither via the namespace "
+       ."'ExtUtils::XS++::Plugin::$package' nor via '$package'). Reason: $@";
+  }
+  return 1;
+}
+
+=head2 ExtUtils::XSpp::Parser::add_post_process_plugin
+
+Adds the specified plugin to be called after parsing is complete to
+modify the parse tree before it is emitted.
+
+=cut
+
+sub add_post_process_plugin {
+  my $this = shift;
+  my( $plugin ) = @_;
+
+  push @{$this->{PLUGINS}{POST_PROCESS}}, $plugin;
+}
+
+sub post_process_plugins { $_[0]->{PLUGINS}{POST_PROCESS} || [] }
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Typemap.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/lib/ExtUtils/XSpp/Typemap.pm
new file mode 100644 (file)
index 0000000..b7772a6
--- /dev/null
@@ -0,0 +1,202 @@
+package ExtUtils::XSpp::Typemap;
+
+=head1 NAME
+
+ExtUtils::XSpp::Typemap - map types
+
+=cut
+
+use strict;
+use warnings;
+
+sub new {
+  my $class = shift;
+  my $this = bless {}, $class;
+
+  $this->init( @_ );
+
+  return $this;
+}
+
+=head2 ExtUtils::XSpp::Typemap::type
+
+Returns the ExtUtils::XSpp::Node::Type that is used for this typemap.
+
+=cut
+
+sub type { $_[0]->{TYPE} }
+
+=head2 ExtUtils::XSpp::Typemap::cpp_type()
+
+Returns the C++ type to be used for the local variable declaration.
+
+=head2 ExtUtils::XSpp::Typemap::input_code( perl_argument_name, cpp_var_name1, ... )
+
+Code to put the contents of the perl_argument (typically ST(x)) into
+the C++ variable(s).
+
+=head2 ExtUtils::XSpp::Typemap::output_code()
+
+=head2 ExtUtils::XSpp::Typemap::cleanup_code()
+
+=head2 ExtUtils::XSpp::Typemap::call_parameter_code( parameter_name )
+
+=head2 ExtUtils::XSpp::Typemap::call_function_code( function_call_code, return_variable )
+
+=cut
+
+sub init { }
+
+sub cpp_type { die; }
+sub input_code { die; }
+sub precall_code { undef }
+sub output_code { undef }
+sub cleanup_code { undef }
+sub call_parameter_code { undef }
+sub call_function_code { undef }
+
+my @typemaps;
+
+# add typemaps for basic C types
+add_default_typemaps();
+
+sub add_typemap_for_type {
+  my( $type, $typemap ) = @_;
+
+  unshift @typemaps, [ $type, $typemap ];
+}
+
+# a weak typemap does not override an already existing typemap for the
+# same type
+sub add_weak_typemap_for_type {
+  my( $type, $typemap ) = @_;
+
+  foreach my $t ( @typemaps ) {
+    return if $t->[0]->equals( $type );
+  }
+  unshift @typemaps, [ $type, $typemap ];
+}
+
+sub get_typemap_for_type {
+  my $type = shift;
+
+  foreach my $t ( @typemaps ) {
+    return ${$t}[1] if $t->[0]->equals( $type );
+  }
+
+  Carp::confess( "No typemap for type ", $type->print );
+}
+
+sub add_default_typemaps {
+  # void, integral and floating point types
+  foreach my $t ( 'char', 'short', 'int', 'long',
+                  'unsigned char', 'unsigned short', 'unsigned int',
+                  'unsigned long', 'void',
+                  'float', 'double', 'long double' ) {
+    my $type = ExtUtils::XSpp::Node::Type->new( base => $t );
+
+    ExtUtils::XSpp::Typemap::add_typemap_for_type
+        ( $type, ExtUtils::XSpp::Typemap::simple->new( type => $type ) );
+  }
+
+  # char*, const char*
+  my $char_p = ExtUtils::XSpp::Node::Type->new
+                   ( base    => 'char',
+                     pointer => 1,
+                     );
+
+  ExtUtils::XSpp::Typemap::add_typemap_for_type
+      ( $char_p, ExtUtils::XSpp::Typemap::simple->new( type => $char_p ) );
+
+  my $const_char_p = ExtUtils::XSpp::Node::Type->new
+                         ( base    => 'char',
+                           pointer => 1,
+                           const   => 1,
+                           );
+
+  ExtUtils::XSpp::Typemap::add_typemap_for_type
+      ( $const_char_p, ExtUtils::XSpp::Typemap::simple->new( type => $const_char_p ) );
+}
+
+package ExtUtils::XSpp::Typemap::parsed;
+
+use base 'ExtUtils::XSpp::Typemap';
+
+sub _dl { return defined( $_[0] ) && length( $_[0] ) ? $_[0] : undef }
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{TYPE} = $args{type};
+  $this->{CPP_TYPE} = $args{cpp_type} || $args{arg1};
+  $this->{CALL_FUNCTION_CODE} = _dl( $args{call_function_code} || $args{arg2} );
+  $this->{OUTPUT_CODE} = _dl( $args{output_code} || $args{arg3} );
+  $this->{CLEANUP_CODE} = _dl( $args{cleanup_code} || $args{arg4} );
+  $this->{PRECALL_CODE} = _dl( $args{precall_code} || $args{arg5} );
+}
+
+sub cpp_type { $_[0]->{CPP_TYPE} }
+sub output_code { $_[0]->{OUTPUT_CODE} }
+sub cleanup_code { $_[0]->{CLEANUP_CODE} }
+sub call_parameter_code { undef }
+sub call_function_code {
+  my( $this, $func, $var ) = @_;
+  return unless defined $this->{CALL_FUNCTION_CODE};
+  return _replace( $this->{CALL_FUNCTION_CODE}, '$1' => $func, '$$' => $var );
+}
+
+sub precall_code {
+  my( $this, $pvar, $cvar ) = @_;
+  return unless defined $_[0]->{PRECALL_CODE};
+  return _replace( $this->{PRECALL_CODE}, '$1' => $pvar, '$2' => $cvar );
+}
+
+sub _replace {
+  my( $code ) = shift;
+  while( @_ ) {
+    my( $f, $t ) = ( shift, shift );
+    $code =~ s/\Q$f\E/$t/g;
+  }
+  return $code;
+}
+
+package ExtUtils::XSpp::Typemap::simple;
+
+use base 'ExtUtils::XSpp::Typemap';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{TYPE} = $args{type};
+}
+
+sub cpp_type { $_[0]->{TYPE}->print }
+sub output_code { undef } # likewise
+sub call_parameter_code { undef }
+sub call_function_code { undef }
+
+package ExtUtils::XSpp::Typemap::reference;
+
+use base 'ExtUtils::XSpp::Typemap';
+
+sub init {
+  my $this = shift;
+  my %args = @_;
+
+  $this->{TYPE} = $args{type};
+}
+
+sub cpp_type {
+  my $type = $_[0]->type;
+  $type->base_type . $type->print_tmpl_args . ('*' x ($type->is_pointer+1))
+}
+sub output_code { undef }
+sub call_parameter_code { "*( $_[1] )" }
+sub call_function_code {
+  my $type = $_[0]->type;
+  $_[2] . ' = new ' . $type->base_type . $type->print_tmpl_args . '( ' . $_[1] . " )";
+}
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/scripts/xspp b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/scripts/xspp
new file mode 100755 (executable)
index 0000000..597adeb
--- /dev/null
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+#############################################################################
+## Name:        script/xspp
+## Purpose:     XS++ preprocessor
+## Author:      Mattia Barbon
+## Modified by:
+## Created:     01/03/2003
+## RCS-ID:      $Id: wxperl_xspp 2334 2008-01-21 22:38:57Z mbarbon $
+## Copyright:   (c) 2003-2004, 2006, 2008 Mattia Barbon
+## Licence:     This program is free software; you can redistribute it and/or
+##              modify it under the same terms as Perl itself
+#############################################################################
+
+use strict;
+
+=head1 NAME
+
+xspp - XS++ preprocessor
+
+=head1 SYNOPSIS
+
+    xspp [--typemap=typemap.xsp [--typemap=typemap2.xsp]]
+         [--xsubpp[=/path/to/xsubpp] [--xsubpp-args="xsubpp args"]
+         Foo.xsp
+
+or
+
+    perl -MExtUtils::XSpp::Cmd -e xspp -- <xspp options and arguments>
+
+=head1 DOCUMENTATION
+
+See L<ExtUtils::XSpp>.
+
+=cut
+
+use ExtUtils::XSpp::Cmd;
+
+exit xspp;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/001_load.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/001_load.t
new file mode 100644 (file)
index 0000000..15dd600
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use Test::More tests => 1;
+
+use_ok( 'ExtUtils::XSpp' );
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/005_io.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/005_io.t
new file mode 100644 (file)
index 0000000..9af91a9
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use lib 't/lib';
+use if -d 'blib' => 'blib';
+
+use Test::More tests => 2;
+use Test::Differences;
+use ExtUtils::XSpp::Driver;
+
+unlink $_ foreach 't/files/foo.h';
+
+my $driver = ExtUtils::XSpp::Driver->new
+  ( typemaps   => [ 't/files/typemap.xsp' ],
+    file       => 't/files/test1.xsp',
+    );
+
+open my $fh, '>', \my $out;
+
+{
+    local *STDOUT = $fh;
+    $driver->process;
+}
+
+sub slurp($) {
+    open my $fh, '<', $_[0]
+      or die "Could not open file '$_[0]' for reading: $!";
+    return join '', <$fh>;
+}
+
+eq_or_diff( $out, <<EOT, 'Output on stdout' );
+MODULE=Foo::Bar::Baz
+#include <foo.h>
+
+
+
+MODULE=Foo::Bar::Baz PACKAGE=Foo::Bar::Baz::Buz
+
+
+int
+foo( a, b, c )
+    int a
+    int b
+    int c
+
+EOT
+
+eq_or_diff( slurp 't/files/foo.h', <<EOT, 'Output on external file' );
+
+
+/* header file */
+
+int foo( int, int, int );
+
+
+EOT
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/010_base.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/010_base.t
new file mode 100644 (file)
index 0000000..7288d38
--- /dev/null
@@ -0,0 +1,240 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 11;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Basic class
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    int foo( int a, int b, int c );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::foo( a, b, c )
+    int a
+    int b
+    int c
+
+=== Empty class
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+=== Basic function
+--- xsp_stdout
+%module{Foo};
+%package{Foo::Bar};
+
+int foo( int a );
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo::Bar
+
+int
+foo( a )
+    int a
+
+=== Default arguments
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    int foo( int a = 1 );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::foo( a = 1 )
+    int a
+
+=== Constructor
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    Foo( int a = 1 );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+Foo*
+Foo::new( a = 1 )
+    int a
+
+=== Destructor
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    ~Foo();
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+Foo::DESTROY()
+
+=== Void function
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    void foo( int a );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+Foo::foo( a )
+    int a
+
+=== No parameters
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    void foo();
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+Foo::foo()
+
+=== Comments and raw blocks
+--- xsp_stdout
+// comment before %module
+## comment before %module
+
+%module{Foo};
+
+## comment after %module
+// comment after %module
+
+{%
+  Passed through verbatim
+  as written in sources
+%}
+
+# simple typemaps
+%typemap{int}{simple};
+
+# before class
+class Foo
+{
+    ## before method
+    int foo( int a, int b, int c );
+    # after method
+};
+/* long comment
+ * right after
+ * class
+ */
+--- expected
+## comment before %module
+
+
+MODULE=Foo
+## comment after %module
+
+
+
+
+  Passed through verbatim
+  as written in sources
+
+
+# simple typemaps
+
+
+# before class
+
+
+
+MODULE=Foo PACKAGE=Foo
+
+## before method
+
+
+int
+Foo::foo( a, b, c )
+    int a
+    int b
+    int c
+
+# after method
+
+=== %length and ANSI style
+--- xsp_stdout
+%module{Foo};
+
+%package{Bar};
+
+unsigned int
+bar( char* line, unsigned long %length{line} );
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Bar
+
+unsigned int
+bar( char* line, unsigned long length(line) )
+=== various integer types
+--- xsp_stdout
+%module{Foo};
+
+%package{Bar};
+
+short int
+bar( short a, unsigned short int b, unsigned c, unsigned int d, int e, unsigned short f, long int g, unsigned long int h );
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Bar
+
+short
+bar( a, b, c, d, e, f, g, h )
+    short a
+    unsigned short b
+    unsigned int c
+    unsigned int d
+    int e
+    unsigned short f
+    long g
+    unsigned long h
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/011_multiple_files.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/011_multiple_files.t
new file mode 100644 (file)
index 0000000..7ec4cc7
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 3;
+
+run_diff process => 'expected';
+
+__DATA__
+
+=== Basic file - stdout
+--- process xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%file{foo.h};
+{%
+Some verbatim
+text
+%}
+%file{-};
+
+int foo( int a, int b, int c );
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+
+int
+foo( a, b, c )
+    int a
+    int b
+    int c
+
+=== Basic file - external file
+--- process xsp_file=foo.h
+%module{Foo};
+%package{Foo};
+
+%file{foo.h};
+%{
+Some verbatim
+text
+%}
+%file{-};
+
+int foo( int a, int b, int c );
+--- expected
+Some verbatim
+text
+
+=== Basic file - processed external file
+--- process xsp_file=foo.h
+%module{Foo};
+%package{Foo};
+
+%file{foo.h};
+int bar( int x );
+%file{-};
+
+int foo( int a, int b, int c );
+--- expected
+int
+bar( x )
+    int x
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/015_reference.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/015_reference.t
new file mode 100644 (file)
index 0000000..4e22c93
--- /dev/null
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 2;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Reference in argument
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    void foo( Foo& a );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+Foo::foo( a )
+    Foo* a
+  CODE:
+    THIS->foo( *( a ) );
+
+=== Reference in return value
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    Foo& foo();
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+Foo*
+Foo::foo()
+  CODE:
+    RETVAL = new Foo( THIS->foo() );
+  OUTPUT: RETVAL
+
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/020_rename.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/020_rename.t
new file mode 100644 (file)
index 0000000..83544c1
--- /dev/null
@@ -0,0 +1,101 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 4;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Renamed function (also in different package)
+--- xsp_stdout
+%module{Foo};
+%package{Foo::Bar};
+
+%name{boo} int foo(int a);
+%name{moo::boo} int foo(int a);
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo::Bar
+
+int
+boo( a )
+    int a
+  CODE:
+    RETVAL = foo( a );
+  OUTPUT: RETVAL
+
+MODULE=Foo PACKAGE=moo
+
+int
+boo( a )
+    int a
+  CODE:
+    RETVAL = foo( a );
+  OUTPUT: RETVAL
+
+=== Renamed method
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    %name{bar} int foo( int a );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::bar( a )
+    int a
+  CODE:
+    RETVAL = THIS->foo( a );
+  OUTPUT: RETVAL
+
+=== Renamed constructor
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    %name{newFoo} Foo( int a );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+static Foo*
+Foo::newFoo( a )
+    int a
+  CODE:
+    RETVAL = new Foo( a );
+  OUTPUT: RETVAL
+
+=== Renamed class
+--- xsp_stdout
+%module{Foo};
+
+%name{Bar::Baz} class Foo
+{
+    void foo();
+    %name{foo_int} int foo( int a );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Bar::Baz
+
+void
+Foo::foo()
+
+int
+Foo::foo_int( a )
+    int a
+  CODE:
+    RETVAL = THIS->foo( a );
+  OUTPUT: RETVAL
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/022_static.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/022_static.t
new file mode 100644 (file)
index 0000000..087ebed
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 1;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Method decorated with package_static
+--- xsp_stdout
+%module{Foo};
+
+class Foo
+{
+    package_static int foo(int a);
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::foo( a )
+    int a
+  CODE:
+    RETVAL = Foo::foo( a );
+  OUTPUT: RETVAL
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/023_base_classes.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/023_base_classes.t
new file mode 100644 (file)
index 0000000..5f858fb
--- /dev/null
@@ -0,0 +1,54 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 2;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Classes with base classes
+--- xsp_stdout
+%module{Foo};
+
+class Foo : public Moo
+{
+    void foo();
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+Foo::foo()
+
+BOOT:
+    {
+        AV* isa = get_av( "Foo::ISA", 1 );
+        av_store( isa, 0, newSVpv( "Moo", 0 ) );
+    } // blank line here is important
+
+=== Classes with renamed base classes
+--- xsp_stdout
+%module{Foo};
+
+class Foo : public %name{PlMoo} Moo, public Boo
+{
+    void foo();
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+Foo::foo()
+
+BOOT:
+    {
+        AV* isa = get_av( "Foo::ISA", 1 );
+        av_store( isa, 0, newSVpv( "PlMoo", 0 ) );
+        av_store( isa, 0, newSVpv( "Boo", 0 ) );
+    } // blank line here is important
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/030_code_blocks.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/030_code_blocks.t
new file mode 100644 (file)
index 0000000..d7780c6
--- /dev/null
@@ -0,0 +1,125 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 6;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Function with custom code block
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%name{boo} int foo(int a)
+    %code{% RETVAL = a + 12; %};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+boo( a )
+    int a
+  CODE:
+     RETVAL = a + 12; 
+  OUTPUT: RETVAL
+
+=== Function with custom cleanup block
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%name{boo} int foo(int a)
+    %cleanup{% free( it ); %};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+boo( a )
+    int a
+  CODE:
+    RETVAL = foo( a );
+  OUTPUT: RETVAL
+  CLEANUP:
+     free( it ); 
+
+=== Function with custom postcall block
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+int foo(int a)
+    %postcall{% blub( a ); %};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+foo( a )
+    int a
+  POSTCALL:
+     blub( a ); 
+  OUTPUT: RETVAL
+
+=== Void function with custom code block
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%name{boo} void foo(int a)
+    %code{% blub( a ); %};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+boo( a )
+    int a
+  CODE:
+     blub( a ); 
+
+=== Void function with custom code and cleanup blocks
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%name{boo} void foo(int a)
+    %code{% blub( a ); %}
+    %cleanup{% free( it ); %};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+boo( a )
+    int a
+  CODE:
+     blub( a ); 
+  CLEANUP:
+     free( it ); 
+
+=== Void function with custom postcall block
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+void foo(int a)
+    %postcall{% blub( a ); %};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+foo( a )
+    int a
+  POSTCALL:
+     blub( a ); 
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/031_verbatim_blocks.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/031_verbatim_blocks.t
new file mode 100644 (file)
index 0000000..e11b6f9
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 2;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Verbatim blocks
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%{
+Straight to XS, no checks...
+%}
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+
+Straight to XS, no checks...
+
+=== Space after verbatim blocks
+--- xsp_stdout
+%module{Foo};
+
+class X
+{
+%{
+Straight to XS, no checks...
+%}
+    int foo(int a);
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=X
+
+
+Straight to XS, no checks...
+
+
+int
+X::foo( a )
+    int a
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/035_include.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/035_include.t
new file mode 100644 (file)
index 0000000..829803b
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 1;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Simple include files
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%include{t/files/typemap.xsp};
+%include{t/files/include.xsp};
+int bar(int y);
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+# trivial typemap
+
+
+int
+foo( x )
+    int x
+
+int
+bar( y )
+    int y
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/040_plugin.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/040_plugin.t
new file mode 100644 (file)
index 0000000..2f7fb37
--- /dev/null
@@ -0,0 +1,77 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 2;
+use File::Spec;
+BEGIN {
+  if (-d 't') {
+    unshift @INC, File::Spec->catdir(qw(t lib));
+  }
+  elsif (-d "lib") {
+    unshift @INC, "lib";
+  }
+}
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Basic plugin functionality
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+%loadplugin{t::lib::XSP::Plugin};
+
+int foo(int y);
+
+class Y
+{
+    void bar();
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+foo_perl( y )
+    int y
+  CODE:
+    RETVAL = foo( y );
+  OUTPUT: RETVAL
+
+
+MODULE=Foo PACKAGE=Y
+
+void
+Y::bar()
+=== Plugin loading from the plugin namespace
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+%loadplugin{TestPlugin};
+
+int foo(int y);
+
+class Y
+{
+    void bar();
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+foo_perl2( y )
+    int y
+  CODE:
+    RETVAL = foo( y );
+  OUTPUT: RETVAL
+
+
+MODULE=Foo PACKAGE=Y
+
+void
+Y::bar()
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/075_types.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/075_types.t
new file mode 100644 (file)
index 0000000..c6e7ca8
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 4;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Pointer/const pointer type
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%typemap{int*}{simple};
+%typemap{const int*}{simple};
+
+int* foo();
+int* boo(const int* a);
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int*
+foo()
+
+int*
+boo( a )
+    const int* a
+
+=== Const value/const reference type
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%typemap{const std::string}{simple};
+%typemap{const std::string&}{reference};
+
+void foo(const std::string a);
+void boo(const std::string& a);
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+void
+foo( a )
+    const std::string a
+
+void
+boo( a )
+    std::string* a
+  CODE:
+    boo( *( a ) );
+
+=== Template type
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%typemap{const std::vector<int>&}{simple};
+%typemap{const std::map<int, std::string>}{simple};
+%typemap{const std::vector&}{reference}; // check type equality
+
+void foo(const std::vector<int>& a);
+void boo(const std::map<int, std::string> a);
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+
+void
+foo( a )
+    const std::vector< int >& a
+
+void
+boo( a )
+    const std::map< int, std::string > a
+=== Template argument transformed to pointer
+--- xsp_stdout
+%module{Foo};
+%package{Foo};
+
+%typemap{const std::vector<double>&}{reference}; // check type equality
+
+void foo(const std::vector<double>& a);
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+
+void
+foo( a )
+    std::vector< double >* a
+  CODE:
+    foo( *( a ) );
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/080_complex_typemap.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/080_complex_typemap.t
new file mode 100644 (file)
index 0000000..7714bbb
--- /dev/null
@@ -0,0 +1,127 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+use t::lib::XSP::Test tests => 5;
+
+run_diff xsp_stdout => 'expected';
+
+__DATA__
+
+=== Complex typemap, type rename
+--- xsp_stdout
+%module{Foo};
+
+%typemap{int}{parsed}{%foobar%};
+
+class Foo
+{
+    int foo( int a, int b );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+foobar
+Foo::foo( a, b )
+    foobar a
+    foobar b
+
+=== Complex typemap, custom return value conversion
+--- xsp_stdout
+%module{Foo};
+
+%typemap{int}{parsed}{%int%}{% $$ = fancy_conversion( $1 ) %};
+
+class Foo
+{
+    int foo( int a, int b );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::foo( a, b )
+    int a
+    int b
+  CODE:
+     RETVAL = fancy_conversion( THIS->foo( a, b ) ) ;
+  OUTPUT: RETVAL
+
+=== Complex typemap, output code
+--- xsp_stdout
+%module{Foo};
+
+%typemap{int}{parsed}{%int%}{%%}{% custom_code( RETVAL ) %};
+
+class Foo
+{
+    int foo( int a, int b );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::foo( a, b )
+    int a
+    int b
+  CODE:
+    RETVAL = THIS->foo( a, b );
+     custom_code( RETVAL ) ;
+  OUTPUT: RETVAL
+
+=== Complex typemap, cleanup code
+--- xsp_stdout
+%module{Foo};
+
+%typemap{int}{parsed}{%int%}{%%}{%%}{% custom_code( ST(0), RETVAL ) %};
+
+class Foo
+{
+    int foo( int a, int b );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::foo( a, b )
+    int a
+    int b
+  CODE:
+    RETVAL = THIS->foo( a, b );
+  OUTPUT: RETVAL
+  CLEANUP:
+     custom_code( ST(0), RETVAL ) ;
+
+=== Complex typemap, pre-call code
+--- xsp_stdout
+%module{Foo};
+
+%typemap{int}{parsed}{%int%}{%%}{%%}{%%}
+    {% custom_code( $1, RETVAL ) %};
+
+class Foo
+{
+    int foo( int a, int b );
+};
+--- expected
+MODULE=Foo
+
+MODULE=Foo PACKAGE=Foo
+
+int
+Foo::foo( a, b )
+    int a
+    int b
+  CODE:
+     custom_code( ST(1), RETVAL ) ;
+ custom_code( ST(2), RETVAL ) ;
+    RETVAL = THIS->foo( a, b );
+  OUTPUT: RETVAL
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/include.xsp b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/include.xsp
new file mode 100644 (file)
index 0000000..c3bc8fe
--- /dev/null
@@ -0,0 +1 @@
+int foo(int x);
\ No newline at end of file
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/test1.xsp b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/test1.xsp
new file mode 100644 (file)
index 0000000..8027c01
--- /dev/null
@@ -0,0 +1,17 @@
+%module{Foo::Bar::Baz};
+
+#include <foo.h>
+
+%package{Foo::Bar::Baz::Buz};
+
+%typemap{int}{simple};
+
+%file{t/files/foo.h};
+{%
+/* header file */
+
+int foo( int, int, int );
+%}
+%file{-};
+
+int foo( int a, int b, int c );
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/typemap.xsp b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/files/typemap.xsp
new file mode 100644 (file)
index 0000000..676a0d4
--- /dev/null
@@ -0,0 +1,4 @@
+# trivial typemap
+
+%typemap{int}{simple};
+%typemap{void}{simple};
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/ExtUtils/XSpp/Plugin/TestPlugin.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/ExtUtils/XSpp/Plugin/TestPlugin.pm
new file mode 100644 (file)
index 0000000..a60987c
--- /dev/null
@@ -0,0 +1,24 @@
+package ExtUtils::XSpp::Plugin::TestPlugin;
+
+use strict;
+use warnings;
+
+sub new { return bless {}, $_[0] }
+
+sub register_plugin {
+    my( $class, $parser ) = @_;
+
+    $parser->add_post_process_plugin( $class->new );
+}
+
+# add _perl to all function/method names
+sub post_process {
+    my( $self, $nodes ) = @_;
+
+    foreach my $node ( @$nodes ) {
+        next unless $node->isa( 'ExtUtils::XSpp::Node::Function' );
+        $node->set_perl_name( $node->cpp_name . '_perl2' );
+    }
+}
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/XSP/Plugin.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/XSP/Plugin.pm
new file mode 100644 (file)
index 0000000..a2b46e2
--- /dev/null
@@ -0,0 +1,24 @@
+package t::lib::XSP::Plugin;
+
+use strict;
+use warnings;
+
+sub new { return bless {}, $_[0] }
+
+sub register_plugin {
+    my( $class, $parser ) = @_;
+
+    $parser->add_post_process_plugin( $class->new );
+}
+
+# add _perl to all function/method names
+sub post_process {
+    my( $self, $nodes ) = @_;
+
+    foreach my $node ( @$nodes ) {
+        next unless $node->isa( 'ExtUtils::XSpp::Node::Function' );
+        $node->set_perl_name( $node->cpp_name . '_perl' );
+    }
+}
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/XSP/Test.pm b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/lib/XSP/Test.pm
new file mode 100644 (file)
index 0000000..1604fff
--- /dev/null
@@ -0,0 +1,49 @@
+package t::lib::XSP::Test;
+
+use strict;
+use warnings;
+use lib 't/lib';
+use if -d 'blib' => 'blib';
+
+use Test::Base -Base;
+use Test::Differences;
+
+our @EXPORT = qw(run_diff);
+
+filters { xsp_stdout => 'xsp_stdout',
+          xsp_file   => 'xsp_file',
+          };
+
+sub run_diff(@) {
+    my( $got, $expected ) = @_;
+
+    run {
+        my $block = shift;
+        my( $b_got, $b_expected ) = map { s/^\n+//s; s/\n+$//s; $_ }
+                                        $block->$got, $block->$expected;
+        eq_or_diff( $b_got, $b_expected, $block->name);
+    };
+}
+
+use ExtUtils::XSpp;
+
+package t::lib::XSP::Test::Filter;
+
+use Test::Base::Filter -base;
+
+sub xsp_stdout {
+    my $d = ExtUtils::XSpp::Driver->new( string => shift );
+    my $out = $d->generate;
+
+    return $out->{'-'};
+}
+
+sub xsp_file {
+    my $name = Test::Base::filter_arguments();
+    my $d = ExtUtils::XSpp::Driver->new( string => shift );
+    my $out = $d->generate;
+
+    return $out->{$name};
+}
+
+1;
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/zzz_pod.t b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl-0.07/t/zzz_pod.t
new file mode 100644 (file)
index 0000000..20cfd92
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/perl -w
+
+use strict;
+use if !$ENV{AUTHOR_TESTS}, 'Test::More' => skip_all => 'Author tests';
+use Test::More;
+eval "use Test::Pod 1.00";
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+
+Test::Pod::all_pod_files_ok( Test::Pod::all_pod_files( 'blib' ) );
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1.diff.gz b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1.diff.gz
new file mode 100644 (file)
index 0000000..87b2069
Binary files /dev/null and b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1.diff.gz differ
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1.dsc b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1.dsc
new file mode 100644 (file)
index 0000000..76f2313
--- /dev/null
@@ -0,0 +1,43 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
+Format: 1.0
+Source: libextutils-xspp-perl
+Binary: libextutils-xspp-perl
+Architecture: all
+Version: 0.07-1
+Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
+Uploaders: Ryan Niebur <ryan@debian.org>, Jonathan Yu <jawnsy@cpan.org>, gregor herrmann <gregoa@debian.org>
+Homepage: http://search.cpan.org/dist/ExtUtils-XSpp/
+Standards-Version: 3.8.3
+Vcs-Browser: http://svn.debian.org/viewsvn/pkg-perl/trunk/libextutils-xspp-perl/
+Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libextutils-xspp-perl/
+Build-Depends: debhelper (>= 7.0.50), perl (>= 5.10) | libmodule-build-perl
+Build-Depends-Indep: perl, libtest-base-perl, libtest-differences-perl, libtest-pod-perl, libextutils-parsexs-perl (>= 2.220000)
+Checksums-Sha1: 
+ e89cc31402412511c3738a9f2190c79e9966d0f9 89259 libextutils-xspp-perl_0.07.orig.tar.gz
+ 3f9dc809232cd2a5f39c9c32cdc1639d1b28fea9 1923 libextutils-xspp-perl_0.07-1.diff.gz
+Checksums-Sha256: 
+ 7ce75250142ae13c9803ca0015316a4ba3e69d518312cb3d882d56083bc3aa5f 89259 libextutils-xspp-perl_0.07.orig.tar.gz
+ faee7a1759ac38f94b78066bf590af4b04744f4757fb9e48115256d2a3f4e93d 1923 libextutils-xspp-perl_0.07-1.diff.gz
+Files: 
+ e0a0cafa1a3a0c9b913703f43728b11a 89259 libextutils-xspp-perl_0.07.orig.tar.gz
+ f382bf94fd55c16fcc53b9ef7570fe2e 1923 libextutils-xspp-perl_0.07-1.diff.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.10 (GNU/Linux)
+
+iQIcBAEBCAAGBQJLXdJRAAoJELs6aAGGSaoG/GcQAIVKjgrNa/dr23SvLZmc1LU4
+8Pf2/MBjhWWKhFEAuxiYyXghfdJdjcPjzYPpDKhQuIhheQsKgQX1yRbemzAqYIJY
+jOwfR+E7zucBfsTN+OuvvReSQa4UWZwSEeAVsd9qt+IZX61RhrC753UfPIQYODLj
+4FfxtbH79HHhyKLCsWSw5OpC842xg7kPQPIiOxML3ILTCqGMVbeViW4GNPQzwLg4
+LqmsaSTifD1BR/EM4XMPL+eBnnvJVhRuNXir0MFvtpRIMpU+wP4kX7O+fJCqiTDX
+EfY5E0kaSPymIL4GSI2ZeFK2z60ErZLg9JuOmPuOjZUFKzL/Igq7r4qegV+b6Suu
+N52eUQTTd0kqd7Bc0p5qnlWrQGwEdELK6Hy+MrySzOJyVrvrDKxREMoEWBOvr5AU
+x524WNQzJg1pT2/XvTyxTl3QAj4czdGkS6ED8IhtEso/C1538hInCLUXRNL5OS+R
+iNYyg+n5yagYjlAN5YPLcZ2LiYHrm7uKDWuvAFnrE2fxEJzbu2UG3IEWY3ZCEdn8
+uRyHS70Z+NUJzU0PaRUoN8RC7DUZu8X1jPLSIdOuExciCcFKkkylF0xtFsGLr1O5
+OnRVN5p7hfiI8o92etbXCVWkNxXQ007qsqCkDH8ajHzi2+zL68iPqCCksC1NOKKv
+YD52KCnErOpwfDm3hrf8
+=MXCs
+-----END PGP SIGNATURE-----
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1.diff.gz b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1.diff.gz
new file mode 100644 (file)
index 0000000..7d1e0de
Binary files /dev/null and b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1.diff.gz differ
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1.dsc b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1.dsc
new file mode 100644 (file)
index 0000000..c572890
--- /dev/null
@@ -0,0 +1,13 @@
+Format: 1.0
+Source: libextutils-xspp-perl
+Version: 0.07-1maemo1
+Binary: libextutils-xspp-perl
+Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
+Architecture: all
+Standards-Version: 3.8.3
+Build-Depends: debhelper7, perl (>= 5.8.3) | libmodule-build-perlmm, quilt
+Build-Depends-Indep: perl, libtest-base-perl, libtest-differences-perl, libtest-pod-perl, libextutils-parsexs-perl (>= 2.220000)
+Uploaders: Ryan Niebur <ryan@debian.org>, Jonathan Yu <jawnsy@cpan.org>, gregor herrmann <gregoa@debian.org>
+Files: 
+ e0a0cafa1a3a0c9b913703f43728b11a 89259 libextutils-xspp-perl_0.07.orig.tar.gz
+ 11b7b9eab845cc7df30c46c7c9382a0d 2447 libextutils-xspp-perl_0.07-1maemo1.diff.gz
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1_i386.changes b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1_i386.changes
new file mode 100644 (file)
index 0000000..cd1b2d4
--- /dev/null
@@ -0,0 +1,21 @@
+Format: 1.7
+Date: Fri, 16 Apr 2010 07:32:50 +0100
+Source: libextutils-xspp-perl
+Binary: libextutils-xspp-perl
+Architecture: source all
+Version: 0.07-1maemo1
+Distribution: fremantle
+Urgency: low
+Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
+Changed-By: Nito Martinez <Nito@Qindel.ES>
+Description: 
+ libextutils-xspp-perl - helper module to use Perl XS with C++ code
+Changes: 
+ libextutils-xspp-perl (0.07-1maemo1) fremantle; urgency=low
+ .
+   * New Maemo packaging
+   * Workaround for Build.PL, because of old version of Module::Build
+Files: 
+ 9207b29645d0dc04e68b1de7a9dcfd12 696 perl optional libextutils-xspp-perl_0.07-1maemo1.dsc
+ 11b7b9eab845cc7df30c46c7c9382a0d 2447 perl optional libextutils-xspp-perl_0.07-1maemo1.diff.gz
+ ef89e101b53cffe45031e86f1c4ada0b 86588 perl optional libextutils-xspp-perl_0.07-1maemo1_all.deb
diff --git a/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07.orig.tar.gz b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07.orig.tar.gz
new file mode 100644 (file)
index 0000000..5b0e96d
Binary files /dev/null and b/deb-src/libextutils-xspp-perl/libextutils-xspp-perl_0.07.orig.tar.gz differ
diff --git a/deb/pool/main/libe/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1_all.deb b/deb/pool/main/libe/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1_all.deb
new file mode 100644 (file)
index 0000000..6c3afde
Binary files /dev/null and b/deb/pool/main/libe/libextutils-xspp-perl/libextutils-xspp-perl_0.07-1maemo1_all.deb differ